lkml.org 
[lkml]   [2011]   [Apr]   [6]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    SubjectRe: [RFC PATCH 4/5] RCU: Add TASK_RCU_OFFSET
    On Wed, Apr 06, 2011 at 12:21:19PM -0700, Paul E. McKenney wrote:
    > On Wed, Apr 06, 2011 at 10:10:28AM +0200, Peter Zijlstra wrote:
    > > On Tue, 2011-04-05 at 16:07 -0700, Paul E. McKenney wrote:
    > > >
    > > > The next layer on this onion is the use of the ctl_table typedef
    > > > in include/linux/key.h -- which is defined to be struct ctl_table.
    > > > Anyone know where struct ctl_table is defined? Color me blind, but I
    > > > am not seeing it...
    > >
    > > include/linux/sysctl.h:1015
    >
    > Thank you!

    And the following patch builds correctly for defconfig x86 builds,
    while allowing rcupdate.h to see the sched.h definitions as needed
    to inline rcu_read_lock() and rcu_read_unlock().

    I will try allyesconfig builds and see what else breaks.

    Thanx, Paul

    include/linux/pid.h | 2 +-
    include/linux/rcupdate.h | 27 +++++++++------------------
    include/linux/rcutree.h | 2 ++
    include/linux/sched.h | 10 ++++------
    include/linux/sem.h | 2 +-
    include/linux/sysctl.h | 5 +++--
    include/linux/types.h | 10 ++++++++++
    kernel/pid_namespace.c | 2 ++
    8 files changed, 32 insertions(+), 28 deletions(-)

    diff --git a/include/linux/pid.h b/include/linux/pid.h
    index efceda0..3c5719b 100644
    --- a/include/linux/pid.h
    +++ b/include/linux/pid.h
    @@ -1,7 +1,7 @@
    #ifndef _LINUX_PID_H
    #define _LINUX_PID_H

    -#include <linux/rcupdate.h>
    +#include <linux/types.h>

    enum pid_type
    {
    diff --git a/include/linux/rcupdate.h b/include/linux/rcupdate.h
    index ff422d2..2fe6402 100644
    --- a/include/linux/rcupdate.h
    +++ b/include/linux/rcupdate.h
    @@ -33,6 +33,7 @@
    #ifndef __LINUX_RCUPDATE_H
    #define __LINUX_RCUPDATE_H

    +#include <linux/types.h>
    #include <linux/cache.h>
    #include <linux/spinlock.h>
    #include <linux/threads.h>
    @@ -52,16 +53,6 @@ extern int rcutorture_runnable; /* for sysctl */
    #define ULONG_CMP_GE(a, b) (ULONG_MAX / 2 >= (a) - (b))
    #define ULONG_CMP_LT(a, b) (ULONG_MAX / 2 < (a) - (b))

    -/**
    - * struct rcu_head - callback structure for use with RCU
    - * @next: next update requests in a list
    - * @func: actual update function to call after the grace period.
    - */
    -struct rcu_head {
    - struct rcu_head *next;
    - void (*func)(struct rcu_head *head);
    -};
    -
    /* Exported common interfaces */
    extern void call_rcu_sched(struct rcu_head *head,
    void (*func)(struct rcu_head *rcu));
    @@ -141,14 +132,6 @@ static inline void rcu_exit_nohz(void)

    #endif /* #else #ifdef CONFIG_NO_HZ */

    -#if defined(CONFIG_TREE_RCU) || defined(CONFIG_TREE_PREEMPT_RCU)
    -#include <linux/rcutree.h>
    -#elif defined(CONFIG_TINY_RCU) || defined(CONFIG_TINY_PREEMPT_RCU)
    -#include <linux/rcutiny.h>
    -#else
    -#error "Unknown RCU implementation specified to kernel configuration"
    -#endif
    -
    /*
    * init_rcu_head_on_stack()/destroy_rcu_head_on_stack() are needed for dynamic
    * initialization and destruction of rcu_head on the stack. rcu_head structures
    @@ -797,4 +780,12 @@ static inline void debug_rcu_head_unqueue(struct rcu_head *head)
    }
    #endif /* #else !CONFIG_DEBUG_OBJECTS_RCU_HEAD */

    +#if defined(CONFIG_TREE_RCU) || defined(CONFIG_TREE_PREEMPT_RCU)
    +#include <linux/rcutree.h>
    +#elif defined(CONFIG_TINY_RCU) || defined(CONFIG_TINY_PREEMPT_RCU)
    +#include <linux/rcutiny.h>
    +#else
    +#error "Unknown RCU implementation specified to kernel configuration"
    +#endif
    +
    #endif /* __LINUX_RCUPDATE_H */
    diff --git a/include/linux/rcutree.h b/include/linux/rcutree.h
    index 3a93348..c317eec 100644
    --- a/include/linux/rcutree.h
    +++ b/include/linux/rcutree.h
    @@ -30,6 +30,8 @@
    #ifndef __LINUX_RCUTREE_H
    #define __LINUX_RCUTREE_H

    +#include <linux/sched.h>
    +
    extern void rcu_init(void);
    extern void rcu_note_context_switch(int cpu);
    extern int rcu_needs_cpu(int cpu);
    diff --git a/include/linux/sched.h b/include/linux/sched.h
    index 83bd2e2..30a4444 100644
    --- a/include/linux/sched.h
    +++ b/include/linux/sched.h
    @@ -78,7 +78,7 @@ struct sched_param {
    #include <linux/topology.h>
    #include <linux/proportions.h>
    #include <linux/seccomp.h>
    -#include <linux/rcupdate.h>
    +#include <linux/types.h>
    #include <linux/rculist.h>
    #include <linux/rtmutex.h>

    @@ -2241,11 +2241,9 @@ int same_thread_group(struct task_struct *p1, struct task_struct *p2)
    return p1->tgid == p2->tgid;
    }

    -static inline struct task_struct *next_thread(const struct task_struct *p)
    -{
    - return list_entry_rcu(p->thread_group.next,
    - struct task_struct, thread_group);
    -}
    +/* Avoid #include hell for inlining rcu_read_lock(). */
    +#define next_thread(p) \
    + list_entry_rcu((p)->thread_group.next, struct task_struct, thread_group)

    static inline int thread_group_empty(struct task_struct *p)
    {
    diff --git a/include/linux/sem.h b/include/linux/sem.h
    index f2961af..8489a1f 100644
    --- a/include/linux/sem.h
    +++ b/include/linux/sem.h
    @@ -78,7 +78,7 @@ struct seminfo {

    #ifdef __KERNEL__
    #include <asm/atomic.h>
    -#include <linux/rcupdate.h>
    +#include <linux/types.h>
    #include <linux/cache.h>

    struct task_struct;
    diff --git a/include/linux/sysctl.h b/include/linux/sysctl.h
    index 11684d9..be80a59 100644
    --- a/include/linux/sysctl.h
    +++ b/include/linux/sysctl.h
    @@ -19,6 +19,8 @@
    ****************************************************************
    */

    +#include <linux/key.h>
    +
    #ifndef _LINUX_SYSCTL_H
    #define _LINUX_SYSCTL_H

    @@ -1012,8 +1014,7 @@ extern int proc_do_large_bitmap(struct ctl_table *, int,
    */

    /* A sysctl table is an array of struct ctl_table: */
    -struct ctl_table
    -{
    +struct ctl_table {
    const char *procname; /* Text ID for /proc/sys, or zero */
    void *data;
    int maxlen;
    diff --git a/include/linux/types.h b/include/linux/types.h
    index 176da8c..868ef8b 100644
    --- a/include/linux/types.h
    +++ b/include/linux/types.h
    @@ -231,6 +231,16 @@ struct hlist_node {
    struct hlist_node *next, **pprev;
    };

    +/**
    + * struct rcu_head - callback structure for use with RCU
    + * @next: next update requests in a list
    + * @func: actual update function to call after the grace period.
    + */
    +struct rcu_head {
    + struct rcu_head *next;
    + void (*func)(struct rcu_head *head);
    +};
    +
    struct ustat {
    __kernel_daddr_t f_tfree;
    __kernel_ino_t f_tinode;
    diff --git a/kernel/pid_namespace.c b/kernel/pid_namespace.c
    index e9c9adc..bfa75df 100644
    --- a/kernel/pid_namespace.c
    +++ b/kernel/pid_namespace.c
    @@ -8,6 +8,8 @@
    *
    */

    +#include <linux/types.h>
    +#include <asm/atomic.h>
    #include <linux/pid.h>
    #include <linux/pid_namespace.h>
    #include <linux/syscalls.h>

    \
     
     \ /
      Last update: 2011-04-06 22:29    [W:2.163 / U:0.132 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site