Message ID | 20111221134833.76af35e6@nehalam.linuxnetplumber.net |
---|---|
State | Changes Requested, archived |
Delegated to: | David Miller |
Headers | show |
Le mercredi 21 décembre 2011 à 13:48 -0800, Stephen Hemminger a écrit : > The netlink pid hash can be allocated using vzalloc() rather than direct > access to get_free_pages. It is also safe for nl_pid_hash_zalloc to use > GFP_KERNEL since it is only called from netlink_proto_init and > nl_pid_hash_rehash. The former is already allocating table with GFP_KERNEL, > and the latter is called from netlink_insert() which already could > sleep in netlink_table_grab() > But netlink_table_grab() returns with write_lock_irq(&nl_table_lock); So we are not allowed to sleep in a netlink_table_grab()/netlink_table_ungrab() section . -- To unsubscribe from this list: send the line "unsubscribe netdev" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
From: Eric Dumazet <eric.dumazet@gmail.com> Date: Wed, 21 Dec 2011 23:12:31 +0100 > Le mercredi 21 décembre 2011 à 13:48 -0800, Stephen Hemminger a écrit : >> The netlink pid hash can be allocated using vzalloc() rather than direct >> access to get_free_pages. It is also safe for nl_pid_hash_zalloc to use >> GFP_KERNEL since it is only called from netlink_proto_init and >> nl_pid_hash_rehash. The former is already allocating table with GFP_KERNEL, >> and the latter is called from netlink_insert() which already could >> sleep in netlink_table_grab() >> > > > But netlink_table_grab() returns with write_lock_irq(&nl_table_lock); > > So we are not allowed to sleep in a > netlink_table_grab()/netlink_table_ungrab() section . Right. -- To unsubscribe from this list: send the line "unsubscribe netdev" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
--- a/net/netlink/af_netlink.c 2011-12-20 10:20:33.356914405 -0800 +++ b/net/netlink/af_netlink.c 2011-12-20 10:25:19.364247598 -0800 @@ -251,11 +251,9 @@ found: static struct hlist_head *nl_pid_hash_zalloc(size_t size) { if (size <= PAGE_SIZE) - return kzalloc(size, GFP_ATOMIC); + return kzalloc(size, GFP_KERNEL); else - return (struct hlist_head *) - __get_free_pages(GFP_ATOMIC | __GFP_ZERO, - get_order(size)); + return vzalloc(size); } static void nl_pid_hash_free(struct hlist_head *table, size_t size) @@ -263,7 +261,7 @@ static void nl_pid_hash_free(struct hlis if (size <= PAGE_SIZE) kfree(table); else - free_pages((unsigned long)table, get_order(size)); + vfree(table); } static int nl_pid_hash_rehash(struct nl_pid_hash *hash, int grow)
The netlink pid hash can be allocated using vzalloc() rather than direct access to get_free_pages. It is also safe for nl_pid_hash_zalloc to use GFP_KERNEL since it is only called from netlink_proto_init and nl_pid_hash_rehash. The former is already allocating table with GFP_KERNEL, and the latter is called from netlink_insert() which already could sleep in netlink_table_grab() Signed-off-by: Stephen Hemminger <shemminger@vyatta.com> -- To unsubscribe from this list: send the line "unsubscribe netdev" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html