diff -urpNa -X dontdiff linux-2.6.34-rc1/arch/powerpc/mm/pgtable.c linux-2.6.34-rc1-tip.007b0924-rcu/arch/powerpc/mm/pgtable.c --- linux-2.6.34-rc1/arch/powerpc/mm/pgtable.c 2010-02-24 10:52:17.000000000 -0800 +++ linux-2.6.34-rc1-tip.007b0924-rcu/arch/powerpc/mm/pgtable.c 2010-03-18 21:42:17.000000000 -0700 @@ -91,7 +91,6 @@ static void pte_free_rcu_callback(struct static void pte_free_submit(struct pte_freelist_batch *batch) { - INIT_RCU_HEAD(&batch->rcu); call_rcu(&batch->rcu, pte_free_rcu_callback); } diff -urpNa -X dontdiff linux-2.6.34-rc1/arch/powerpc/platforms/pseries/offline_states.h linux-2.6.34-rc1-tip.007b0924-rcu/arch/powerpc/platforms/pseries/offline_states.h --- linux-2.6.34-rc1/arch/powerpc/platforms/pseries/offline_states.h 2010-02-24 10:52:17.000000000 -0800 +++ linux-2.6.34-rc1-tip.007b0924-rcu/arch/powerpc/platforms/pseries/offline_states.h 2010-03-15 16:32:29.000000000 -0700 @@ -9,10 +9,40 @@ enum cpu_state_vals { CPU_MAX_OFFLINE_STATES }; +#ifdef CONFIG_HOTPLUG_CPU + extern enum cpu_state_vals get_cpu_current_state(int cpu); extern void set_cpu_current_state(int cpu, enum cpu_state_vals state); extern enum cpu_state_vals get_preferred_offline_state(int cpu); extern void set_preferred_offline_state(int cpu, enum cpu_state_vals state); extern void set_default_offline_state(int cpu); + +#else /* #ifdef CONFIG_HOTPLUG_CPU */ + +static inline enum cpu_state_vals get_cpu_current_state(int cpu) +{ + return cpu_online(cpu) ? CPU_STATE_ONLINE : CPU_STATE_OFFLINE; +} + +static inline void set_cpu_current_state(int cpu, enum cpu_state_vals state) +{ +} + +static inline enum cpu_state_vals get_preferred_offline_state(int cpu) +{ + return CPU_STATE_OFFLINE; +} + +static inline void set_preferred_offline_state(int cpu, + enum cpu_state_vals state) +{ +} + +static inline void set_default_offline_state(int cpu) +{ +} + +#endif /* #else #ifdef CONFIG_HOTPLUG_CPU */ + extern int start_secondary(void); #endif diff -urpNa -X dontdiff linux-2.6.34-rc1/block/cfq-iosched.c linux-2.6.34-rc1-tip.007b0924-rcu/block/cfq-iosched.c --- linux-2.6.34-rc1/block/cfq-iosched.c 2010-03-15 12:45:55.000000000 -0700 +++ linux-2.6.34-rc1-tip.007b0924-rcu/block/cfq-iosched.c 2010-03-18 21:42:17.000000000 -0700 @@ -3719,7 +3719,6 @@ static void *cfq_init_queue(struct reque * second, in order to have larger depth for async operations. */ cfqd->last_delayed_sync = jiffies - HZ; - INIT_RCU_HEAD(&cfqd->rcu); return cfqd; } diff -urpNa -X dontdiff linux-2.6.34-rc1/block/genhd.c linux-2.6.34-rc1-tip.007b0924-rcu/block/genhd.c --- linux-2.6.34-rc1/block/genhd.c 2010-02-24 10:52:17.000000000 -0800 +++ linux-2.6.34-rc1-tip.007b0924-rcu/block/genhd.c 2010-03-18 21:42:17.000000000 -0700 @@ -987,7 +987,6 @@ int disk_expand_part_tbl(struct gendisk if (!new_ptbl) return -ENOMEM; - INIT_RCU_HEAD(&new_ptbl->rcu_head); new_ptbl->len = target; for (i = 0; i < len; i++) diff -urpNa -X dontdiff linux-2.6.34-rc1/Documentation/DocBook/kernel-locking.tmpl linux-2.6.34-rc1-tip.007b0924-rcu/Documentation/DocBook/kernel-locking.tmpl --- linux-2.6.34-rc1/Documentation/DocBook/kernel-locking.tmpl 2010-02-24 10:52:17.000000000 -0800 +++ linux-2.6.34-rc1-tip.007b0924-rcu/Documentation/DocBook/kernel-locking.tmpl 2010-03-18 21:42:17.000000000 -0700 @@ -1725,14 +1725,6 @@ the amount of locking which needs to be if (++cache_num > MAX_CACHE_SIZE) { struct object *i, *outcast = NULL; list_for_each_entry(i, &cache, list) { -@@ -85,6 +94,7 @@ - obj->popularity = 0; - atomic_set(&obj->refcnt, 1); /* The cache holds a reference */ - spin_lock_init(&obj->lock); -+ INIT_RCU_HEAD(&obj->rcu); - - spin_lock_irqsave(&cache_lock, flags); - __cache_add(obj); @@ -104,12 +114,11 @@ struct object *cache_find(int id) { diff -urpNa -X dontdiff linux-2.6.34-rc1/drivers/staging/batman-adv/hard-interface.c linux-2.6.34-rc1-tip.007b0924-rcu/drivers/staging/batman-adv/hard-interface.c --- linux-2.6.34-rc1/drivers/staging/batman-adv/hard-interface.c 2010-03-15 12:46:06.000000000 -0700 +++ linux-2.6.34-rc1-tip.007b0924-rcu/drivers/staging/batman-adv/hard-interface.c 2010-03-18 21:42:17.000000000 -0700 @@ -301,7 +301,6 @@ int hardif_add_interface(char *dev, int batman_if->if_num = if_num; batman_if->dev = dev; batman_if->if_active = IF_INACTIVE; - INIT_RCU_HEAD(&batman_if->rcu); printk(KERN_INFO "batman-adv:Adding interface: %s\n", dev); avail_ifs++; diff -urpNa -X dontdiff linux-2.6.34-rc1/fs/file.c linux-2.6.34-rc1-tip.007b0924-rcu/fs/file.c --- linux-2.6.34-rc1/fs/file.c 2010-03-15 12:46:10.000000000 -0700 +++ linux-2.6.34-rc1-tip.007b0924-rcu/fs/file.c 2010-03-18 21:42:17.000000000 -0700 @@ -178,7 +178,6 @@ static struct fdtable * alloc_fdtable(un fdt->open_fds = (fd_set *)data; data += nr / BITS_PER_BYTE; fdt->close_on_exec = (fd_set *)data; - INIT_RCU_HEAD(&fdt->rcu); fdt->next = NULL; return fdt; @@ -312,7 +311,6 @@ struct files_struct *dup_fd(struct files new_fdt->close_on_exec = (fd_set *)&newf->close_on_exec_init; new_fdt->open_fds = (fd_set *)&newf->open_fds_init; new_fdt->fd = &newf->fd_array[0]; - INIT_RCU_HEAD(&new_fdt->rcu); new_fdt->next = NULL; spin_lock(&oldf->file_lock); @@ -430,7 +428,6 @@ struct files_struct init_files = { .fd = &init_files.fd_array[0], .close_on_exec = (fd_set *)&init_files.close_on_exec_init, .open_fds = (fd_set *)&init_files.open_fds_init, - .rcu = RCU_HEAD_INIT, }, .file_lock = __SPIN_LOCK_UNLOCKED(init_task.file_lock), }; diff -urpNa -X dontdiff linux-2.6.34-rc1/fs/fs-writeback.c linux-2.6.34-rc1-tip.007b0924-rcu/fs/fs-writeback.c --- linux-2.6.34-rc1/fs/fs-writeback.c 2010-03-15 12:46:10.000000000 -0700 +++ linux-2.6.34-rc1-tip.007b0924-rcu/fs/fs-writeback.c 2010-03-18 21:42:17.000000000 -0700 @@ -77,7 +77,6 @@ static inline bool bdi_work_on_stack(str static inline void bdi_work_init(struct bdi_work *work, struct wb_writeback_args *args) { - INIT_RCU_HEAD(&work->rcu_head); work->args = *args; work->state = WS_USED; } diff -urpNa -X dontdiff linux-2.6.34-rc1/fs/partitions/check.c linux-2.6.34-rc1-tip.007b0924-rcu/fs/partitions/check.c --- linux-2.6.34-rc1/fs/partitions/check.c 2010-03-15 12:46:11.000000000 -0700 +++ linux-2.6.34-rc1-tip.007b0924-rcu/fs/partitions/check.c 2010-03-18 21:42:17.000000000 -0700 @@ -455,7 +455,6 @@ struct hd_struct *add_partition(struct g } /* everything is up and running, commence */ - INIT_RCU_HEAD(&p->rcu_head); rcu_assign_pointer(ptbl->part[partno], p); /* suppress uevent if the disk supresses it */ diff -urpNa -X dontdiff linux-2.6.34-rc1/include/linux/init_task.h linux-2.6.34-rc1-tip.007b0924-rcu/include/linux/init_task.h --- linux-2.6.34-rc1/include/linux/init_task.h 2010-02-24 10:52:17.000000000 -0800 +++ linux-2.6.34-rc1-tip.007b0924-rcu/include/linux/init_task.h 2010-03-18 21:42:18.000000000 -0700 @@ -57,7 +57,6 @@ extern struct group_info init_groups; { .first = &init_task.pids[PIDTYPE_PGID].node }, \ { .first = &init_task.pids[PIDTYPE_SID].node }, \ }, \ - .rcu = RCU_HEAD_INIT, \ .level = 0, \ .numbers = { { \ .nr = 0, \ diff -urpNa -X dontdiff linux-2.6.34-rc1/include/linux/rcupdate.h linux-2.6.34-rc1-tip.007b0924-rcu/include/linux/rcupdate.h --- linux-2.6.34-rc1/include/linux/rcupdate.h 2010-03-15 12:46:13.000000000 -0700 +++ linux-2.6.34-rc1-tip.007b0924-rcu/include/linux/rcupdate.h 2010-03-18 21:42:18.000000000 -0700 @@ -73,12 +73,6 @@ extern void rcu_scheduler_starting(void) #error "Unknown RCU implementation specified to kernel configuration" #endif -#define RCU_HEAD_INIT { .next = NULL, .func = NULL } -#define RCU_HEAD(head) struct rcu_head head = RCU_HEAD_INIT -#define INIT_RCU_HEAD(ptr) do { \ - (ptr)->next = NULL; (ptr)->func = NULL; \ -} while (0) - #ifdef CONFIG_DEBUG_LOCK_ALLOC extern struct lockdep_map rcu_lock_map; @@ -97,6 +91,11 @@ extern struct lockdep_map rcu_sched_lock # define rcu_read_release_sched() \ lock_release(&rcu_sched_lock_map, 1, _THIS_IP_) +static inline int debug_lockdep_rcu_enabled(void) +{ + return likely(rcu_scheduler_active && debug_locks); +} + /** * rcu_read_lock_held - might we be in RCU read-side critical section? * @@ -104,28 +103,21 @@ extern struct lockdep_map rcu_sched_lock * an RCU read-side critical section. In absence of CONFIG_PROVE_LOCKING, * this assumes we are in an RCU read-side critical section unless it can * prove otherwise. + * + * Check rcu_scheduler_active to prevent false positives during boot. */ static inline int rcu_read_lock_held(void) { - if (debug_locks) - return lock_is_held(&rcu_lock_map); - return 1; + if (!debug_lockdep_rcu_enabled()) + return 1; + return lock_is_held(&rcu_lock_map); } -/** - * rcu_read_lock_bh_held - might we be in RCU-bh read-side critical section? - * - * If CONFIG_PROVE_LOCKING is selected and enabled, returns nonzero iff in - * an RCU-bh read-side critical section. In absence of CONFIG_PROVE_LOCKING, - * this assumes we are in an RCU-bh read-side critical section unless it can - * prove otherwise. +/* + * rcu_read_lock_bh_held() is defined out of line to avoid #include-file + * hell. */ -static inline int rcu_read_lock_bh_held(void) -{ - if (debug_locks) - return lock_is_held(&rcu_bh_lock_map); - return 1; -} +extern int rcu_read_lock_bh_held(void); /** * rcu_read_lock_sched_held - might we be in RCU-sched read-side critical section? @@ -135,15 +127,26 @@ static inline int rcu_read_lock_bh_held( * this assumes we are in an RCU-sched read-side critical section unless it * can prove otherwise. Note that disabling of preemption (including * disabling irqs) counts as an RCU-sched read-side critical section. + * + * Check rcu_scheduler_active to prevent false positives during boot. */ +#ifdef CONFIG_PREEMPT static inline int rcu_read_lock_sched_held(void) { int lockdep_opinion = 0; + if (!debug_lockdep_rcu_enabled()) + return 1; if (debug_locks) lockdep_opinion = lock_is_held(&rcu_sched_lock_map); - return lockdep_opinion || preempt_count() != 0 || !rcu_scheduler_active; + return lockdep_opinion || preempt_count() != 0 || irqs_disabled(); } +#else /* #ifdef CONFIG_PREEMPT */ +static inline int rcu_read_lock_sched_held(void) +{ + return 1; +} +#endif /* #else #ifdef CONFIG_PREEMPT */ #else /* #ifdef CONFIG_DEBUG_LOCK_ALLOC */ @@ -164,10 +167,17 @@ static inline int rcu_read_lock_bh_held( return 1; } +#ifdef CONFIG_PREEMPT +static inline int rcu_read_lock_sched_held(void) +{ + return !rcu_scheduler_active || preempt_count() != 0 || irqs_disabled(); +} +#else /* #ifdef CONFIG_PREEMPT */ static inline int rcu_read_lock_sched_held(void) { - return preempt_count() != 0 || !rcu_scheduler_active; + return 1; } +#endif /* #else #ifdef CONFIG_PREEMPT */ #endif /* #else #ifdef CONFIG_DEBUG_LOCK_ALLOC */ @@ -184,7 +194,7 @@ static inline int rcu_read_lock_sched_he */ #define rcu_dereference_check(p, c) \ ({ \ - if (debug_locks && !(c)) \ + if (debug_lockdep_rcu_enabled() && !(c)) \ lockdep_rcu_dereference(__FILE__, __LINE__); \ rcu_dereference_raw(p); \ }) diff -urpNa -X dontdiff linux-2.6.34-rc1/include/linux/tracepoint.h linux-2.6.34-rc1-tip.007b0924-rcu/include/linux/tracepoint.h --- linux-2.6.34-rc1/include/linux/tracepoint.h 2010-02-24 10:52:17.000000000 -0800 +++ linux-2.6.34-rc1-tip.007b0924-rcu/include/linux/tracepoint.h 2010-03-18 21:42:18.000000000 -0700 @@ -49,7 +49,7 @@ struct tracepoint { void **it_func; \ \ rcu_read_lock_sched_notrace(); \ - it_func = rcu_dereference((tp)->funcs); \ + it_func = rcu_dereference_sched((tp)->funcs); \ if (it_func) { \ do { \ ((void(*)(proto))(*it_func))(args); \ diff -urpNa -X dontdiff linux-2.6.34-rc1/kernel/rcupdate.c linux-2.6.34-rc1-tip.007b0924-rcu/kernel/rcupdate.c --- linux-2.6.34-rc1/kernel/rcupdate.c 2010-03-15 12:46:14.000000000 -0700 +++ linux-2.6.34-rc1-tip.007b0924-rcu/kernel/rcupdate.c 2010-03-18 21:42:18.000000000 -0700 @@ -45,6 +45,7 @@ #include #include #include +#include #ifdef CONFIG_DEBUG_LOCK_ALLOC static struct lock_class_key rcu_lock_key; @@ -66,6 +67,28 @@ EXPORT_SYMBOL_GPL(rcu_sched_lock_map); int rcu_scheduler_active __read_mostly; EXPORT_SYMBOL_GPL(rcu_scheduler_active); +#ifdef CONFIG_DEBUG_LOCK_ALLOC + +/** + * rcu_read_lock_bh_held - might we be in RCU-bh read-side critical section? + * + * Check for bottom half being disabled, which covers both the + * CONFIG_PROVE_RCU and not cases. Note that if someone uses + * rcu_read_lock_bh(), but then later enables BH, lockdep (if enabled) + * will show the situation. + * + * Check debug_lockdep_rcu_enabled() to prevent false positives during boot. + */ +int rcu_read_lock_bh_held(void) +{ + if (!debug_lockdep_rcu_enabled()) + return 1; + return in_softirq(); +} +EXPORT_SYMBOL_GPL(rcu_read_lock_bh_held); + +#endif /* #ifdef CONFIG_DEBUG_LOCK_ALLOC */ + /* * This function is invoked towards the end of the scheduler's initialization * process. Before this is called, the idle task might contain diff -urpNa -X dontdiff linux-2.6.34-rc1/kernel/rcutree.c linux-2.6.34-rc1-tip.007b0924-rcu/kernel/rcutree.c --- linux-2.6.34-rc1/kernel/rcutree.c 2010-03-15 12:46:14.000000000 -0700 +++ linux-2.6.34-rc1-tip.007b0924-rcu/kernel/rcutree.c 2010-03-18 21:42:18.000000000 -0700 @@ -1499,6 +1499,16 @@ static int __rcu_pending(struct rcu_stat /* Is the RCU core waiting for a quiescent state from this CPU? */ if (rdp->qs_pending) { + + /* + * If force_quiescent_state() coming soon and this CPU + * needs a quiescent state, and this is either RCU-sched + * or RCU-bh, force a local reschedule. + */ + if (!rdp->preemptable && + ULONG_CMP_LT(ACCESS_ONCE(rsp->jiffies_force_qs) - 1, + jiffies)) + set_need_resched(); rdp->n_rp_qs_pending++; return 1; } diff -urpNa -X dontdiff linux-2.6.34-rc1/kernel/rcutree.h linux-2.6.34-rc1-tip.007b0924-rcu/kernel/rcutree.h --- linux-2.6.34-rc1/kernel/rcutree.h 2010-03-15 12:46:14.000000000 -0700 +++ linux-2.6.34-rc1-tip.007b0924-rcu/kernel/rcutree.h 2010-03-15 13:26:00.000000000 -0700 @@ -246,12 +246,21 @@ struct rcu_data { #define RCU_JIFFIES_TILL_FORCE_QS 3 /* for rsp->jiffies_force_qs */ #ifdef CONFIG_RCU_CPU_STALL_DETECTOR -#define RCU_SECONDS_TILL_STALL_CHECK (10 * HZ) /* for rsp->jiffies_stall */ -#define RCU_SECONDS_TILL_STALL_RECHECK (30 * HZ) /* for rsp->jiffies_stall */ -#define RCU_STALL_RAT_DELAY 2 /* Allow other CPUs time */ - /* to take at least one */ - /* scheduling clock irq */ - /* before ratting on them. */ + +#ifdef CONFIG_PROVE_RCU +#define RCU_STALL_DELAY_DELTA (5 * HZ) +#else +#define RCU_STALL_DELAY_DELTA 0 +#endif + +#define RCU_SECONDS_TILL_STALL_CHECK (10 * HZ + RCU_STALL_DELAY_DELTA) + /* for rsp->jiffies_stall */ +#define RCU_SECONDS_TILL_STALL_RECHECK (30 * HZ + RCU_STALL_DELAY_DELTA) + /* for rsp->jiffies_stall */ +#define RCU_STALL_RAT_DELAY 2 /* Allow other CPUs time */ + /* to take at least one */ + /* scheduling clock irq */ + /* before ratting on them. */ #endif /* #ifdef CONFIG_RCU_CPU_STALL_DETECTOR */ diff -urpNa -X dontdiff linux-2.6.34-rc1/kernel/rcutree_plugin.h linux-2.6.34-rc1-tip.007b0924-rcu/kernel/rcutree_plugin.h --- linux-2.6.34-rc1/kernel/rcutree_plugin.h 2010-03-15 12:46:14.000000000 -0700 +++ linux-2.6.34-rc1-tip.007b0924-rcu/kernel/rcutree_plugin.h 2010-03-15 13:25:49.000000000 -0700 @@ -1010,6 +1010,10 @@ int rcu_needs_cpu(int cpu) int c = 0; int thatcpu; + /* Check for being in the holdoff period. */ + if (per_cpu(rcu_dyntick_holdoff, cpu) == jiffies) + return rcu_needs_cpu_quick_check(cpu); + /* Don't bother unless we are the last non-dyntick-idle CPU. */ for_each_cpu_not(thatcpu, nohz_cpu_mask) if (thatcpu != cpu) { @@ -1041,10 +1045,8 @@ int rcu_needs_cpu(int cpu) } /* If RCU callbacks are still pending, RCU still needs this CPU. */ - if (c) { + if (c) raise_softirq(RCU_SOFTIRQ); - per_cpu(rcu_dyntick_holdoff, cpu) = jiffies; - } return c; } diff -urpNa -X dontdiff linux-2.6.34-rc1/mm/backing-dev.c linux-2.6.34-rc1-tip.007b0924-rcu/mm/backing-dev.c --- linux-2.6.34-rc1/mm/backing-dev.c 2010-02-24 10:52:17.000000000 -0800 +++ linux-2.6.34-rc1-tip.007b0924-rcu/mm/backing-dev.c 2010-03-18 21:42:18.000000000 -0700 @@ -653,7 +653,6 @@ int bdi_init(struct backing_dev_info *bd bdi->max_ratio = 100; bdi->max_prop_frac = PROP_FRAC_BASE; spin_lock_init(&bdi->wb_lock); - INIT_RCU_HEAD(&bdi->rcu_head); INIT_LIST_HEAD(&bdi->bdi_list); INIT_LIST_HEAD(&bdi->wb_list); INIT_LIST_HEAD(&bdi->work_list); diff -urpNa -X dontdiff linux-2.6.34-rc1/mm/mempolicy.c linux-2.6.34-rc1-tip.007b0924-rcu/mm/mempolicy.c --- linux-2.6.34-rc1/mm/mempolicy.c 2010-03-15 12:46:14.000000000 -0700 +++ linux-2.6.34-rc1-tip.007b0924-rcu/mm/mempolicy.c 2010-03-18 12:10:45.000000000 -0700 @@ -1756,10 +1756,12 @@ struct mempolicy *__mpol_dup(struct memp if (!new) return ERR_PTR(-ENOMEM); + rcu_read_lock(); if (current_cpuset_is_being_rebound()) { nodemask_t mems = cpuset_mems_allowed(current); mpol_rebind_policy(old, &mems); } + rcu_read_unlock(); *new = *old; atomic_set(&new->refcnt, 1); return new; diff -urpNa -X dontdiff linux-2.6.34-rc1/mm/slob.c linux-2.6.34-rc1-tip.007b0924-rcu/mm/slob.c --- linux-2.6.34-rc1/mm/slob.c 2010-02-24 10:52:17.000000000 -0800 +++ linux-2.6.34-rc1-tip.007b0924-rcu/mm/slob.c 2010-03-18 21:42:18.000000000 -0700 @@ -647,7 +647,6 @@ void kmem_cache_free(struct kmem_cache * if (unlikely(c->flags & SLAB_DESTROY_BY_RCU)) { struct slob_rcu *slob_rcu; slob_rcu = b + (c->size - sizeof(struct slob_rcu)); - INIT_RCU_HEAD(&slob_rcu->head); slob_rcu->size = c->size; call_rcu(&slob_rcu->head, kmem_rcu_free); } else { diff -urpNa -X dontdiff linux-2.6.34-rc1/security/selinux/avc.c linux-2.6.34-rc1-tip.007b0924-rcu/security/selinux/avc.c --- linux-2.6.34-rc1/security/selinux/avc.c 2010-03-15 12:46:16.000000000 -0700 +++ linux-2.6.34-rc1-tip.007b0924-rcu/security/selinux/avc.c 2010-03-18 21:42:18.000000000 -0700 @@ -288,7 +288,6 @@ static struct avc_node *avc_alloc_node(v if (!node) goto out; - INIT_RCU_HEAD(&node->rhead); INIT_HLIST_NODE(&node->list); avc_cache_stats_incr(allocations); diff -urpNa -X dontdiff linux-2.6.34-rc1/security/selinux/netnode.c linux-2.6.34-rc1-tip.007b0924-rcu/security/selinux/netnode.c --- linux-2.6.34-rc1/security/selinux/netnode.c 2010-02-24 10:52:17.000000000 -0800 +++ linux-2.6.34-rc1-tip.007b0924-rcu/security/selinux/netnode.c 2010-03-18 21:42:18.000000000 -0700 @@ -182,8 +182,6 @@ static void sel_netnode_insert(struct se BUG(); } - INIT_RCU_HEAD(&node->rcu); - /* we need to impose a limit on the growth of the hash table so check * this bucket to make sure it is within the specified bounds */ list_add_rcu(&node->list, &sel_netnode_hash[idx].list);