IPoIB: use kvzalloc to allocate an array of bucket pointers
authorJan Dakinevich <jan.dakinevich@virtuozzo.com>
Mon, 9 Jul 2018 13:51:03 +0000 (16:51 +0300)
committerJason Gunthorpe <jgg@mellanox.com>
Mon, 23 Jul 2018 21:08:20 +0000 (15:08 -0600)
This table by default takes 32KiB which is 3rd memory order. Meanwhile,
this memory is not aimed for DMA operation and could be safely allocated
by vmalloc.

Signed-off-by: Jan Dakinevich <jan.dakinevich@virtuozzo.com>
Reviewed-by: HÃ¥kon Bugge <haakon.bugge@oracle.com>
Signed-off-by: Jason Gunthorpe <jgg@mellanox.com>
drivers/infiniband/ulp/ipoib/ipoib_main.c

index 9bcd487..012c9e3 100644 (file)
@@ -1530,7 +1530,7 @@ static int ipoib_neigh_hash_init(struct ipoib_dev_priv *priv)
                return -ENOMEM;
        set_bit(IPOIB_STOP_NEIGH_GC, &priv->flags);
        size = roundup_pow_of_two(arp_tbl.gc_thresh3);
-       buckets = kcalloc(size, sizeof(*buckets), GFP_KERNEL);
+       buckets = kvcalloc(size, sizeof(*buckets), GFP_KERNEL);
        if (!buckets) {
                kfree(htbl);
                return -ENOMEM;
@@ -1558,7 +1558,7 @@ static void neigh_hash_free_rcu(struct rcu_head *head)
        struct ipoib_neigh __rcu **buckets = htbl->buckets;
        struct ipoib_neigh_table *ntbl = htbl->ntbl;
 
-       kfree(buckets);
+       kvfree(buckets);
        kfree(htbl);
        complete(&ntbl->deleted);
 }