netlink: use vzalloc()
Subsystems (2)
PATCH 2/3 netlink: use vzalloc()
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()
net/netlink/af_netlink.c +3 -5
@@ -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 hlisif (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)
Quoted 7 lines · Stephen Hemminger
The netlink pid hash can be allocated using
vzalloc()rather than direct access toget_free_pages. It is also safe fornl_pid_hash_zallocto useGFP_KERNELsince it is only called fromnetlink_proto_initandnl_pid_hash_rehash. The former is already allocating table withGFP_KERNEL, and the latter is called fromnetlink_insert()which already could sleep innetlink_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 .
David Miller
maintainerFrom: Eric Dumazet <[email protected]>
Date: Wed, 21 Dec 2011 23:12:31 +0100
Quoted 10 lines · Stephen Hemminger
Quoted 7 lines
The netlink pid hash can be allocated using
vzalloc()rather than direct access toget_free_pages. It is also safe fornl_pid_hash_zallocto useGFP_KERNELsince it is only called fromnetlink_proto_initandnl_pid_hash_rehash. The former is already allocating table withGFP_KERNEL, and the latter is called fromnetlink_insert()which already could sleep innetlink_table_grab()
Quoted 4 lines
But
netlink_table_grab()returns withwrite_lock_irq(&nl_table_lock);So we are not allowed to sleep in a netlink_table_grab()/netlink_table_ungrab() section .
Right.