--- zzzz-none-000/linux-2.6.28.10/net/netlink/af_netlink.c 2009-05-02 18:54:43.000000000 +0000 +++ puma5-6360-529/linux-2.6.28.10/net/netlink/af_netlink.c 2010-03-18 13:42:42.000000000 +0000 @@ -177,7 +177,6 @@ if (atomic_read(&nl_table_users)) { DECLARE_WAITQUEUE(wait, current); - add_wait_queue_exclusive(&nl_table_wait, &wait); for (;;) { set_current_state(TASK_UNINTERRUPTIBLE); @@ -203,18 +202,22 @@ static inline void netlink_lock_table(void) { - /* read_lock() synchronizes us to netlink_table_grab */ - + int current_table_users = -1; + /* read_lock() synchronizes us to netlink_table_grab */ read_lock(&nl_table_lock); atomic_inc(&nl_table_users); + current_table_users = atomic_read(&nl_table_users); read_unlock(&nl_table_lock); } static inline void netlink_unlock_table(void) { - if (atomic_dec_and_test(&nl_table_users)) + int current_table_users = -1; + if (atomic_dec_and_test(&nl_table_users)){ + current_table_users = atomic_read(&nl_table_users); wake_up(&nl_table_wait); + } } static inline struct sock *netlink_lookup(struct net *net, int protocol,