Patch "IB/qib: Change lkey table allocation to support more MRs" has been added to the 4.1-stable tree
Subsystems (2)
This is a note to let you know that I've just added the patch titled
IB/qib: Change lkey table allocation to support more MRs
to the 4.1-stable tree which can be found at:
http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary
The filename of the patch is:
ib-qib-change-lkey-table-allocation-to-support-more-mrs.patch
and it can be found in the queue-4.1 subdirectory.
If you, or anyone else, feels it should not be added to the stable tree, please let <[email protected]> know about it.
Quoted 1 line
From
d6f1c17e162b2a11e708f28fa93f2f79c164b442Mon Sep 17 00:00:00 2001
From: Mike Marciniszyn <[email protected]>
Date: Tue, 21 Jul 2015 08:36:07 -0400
Subject: IB/qib: Change lkey table allocation to support more MRs
From: Mike Marciniszyn <[email protected]>
commit d6f1c17e162b2a11e708f28fa93f2f79c164b442 upstream.
The lkey table is allocated with with a get_user_pages() with an order based on a number of index bits from a module parameter.
The underlying kernel code cannot allocate that many contiguous pages.
There is no reason the underlying memory needs to be physically contiguous.
This patch:
- switches the allocation/deallocation to vmalloc/vfree
- caps the number of bits to 23 to insure at least 1 generation bit
o this matches the module parameter description
--- drivers/infiniband/hw/qib/qib_keys.c | 4 ++++ drivers/infiniband/hw/qib/qib_verbs.c | 14 ++++++++++---- drivers/infiniband/hw/qib/qib_verbs.h | 2 ++ 3 files changed, 16 insertions(+), 4 deletions(-)
drivers/infiniband/hw/qib/qib_keys.c +4 -0
@@ -86,6 +86,10 @@ int qib_alloc_lkey(struct qib_mregion *m* unrestricted LKEY. */ rkt->gen++; +/* +* bits are capped in qib_verbs.c to insure enough bits +* for generation number +*/ mr->lkey = (r << (32 - ib_qib_lkey_table_size)) | ((((1 << (24 - ib_qib_lkey_table_size)) -1 ) & rkt->gen) <<8 );
drivers/infiniband/hw/qib/qib_verbs.c +10 -4
@@ -40,6 +40,7 @@#include <linux/rculist.h> #include <linux/mm.h> #include <linux/random.h> +#include <linux/vmalloc.h> #include "qib.h" #include "qib_common.h"
@@ -2089,10 +2090,16 @@ int qib_register_ib_device(struct qib_de* the LKEY). The remaining bits act as a generation number or tag. */ spin_lock_init (&dev->lk_table.lock); +/* insure generation is at least 4 bits see keys.c */ +if (ib_qib_lkey_table_size >MAX_LKEY_TABLE_BITS ) { +qib_dev_warn (dd,"lkey bits %u too large, reduced to %u\n" , + ib_qib_lkey_table_size,MAX_LKEY_TABLE_BITS ); + ib_qib_lkey_table_size =MAX_LKEY_TABLE_BITS ; + } dev->lk_table.max =1 << ib_qib_lkey_table_size; lk_tab_size = dev->lk_table.max *sizeof (*dev->lk_table.table); dev->lk_table.table = (struct qib_mregion __rcu **) -__get_free_pages (GFP_KERNEL ,get_order (lk_tab_size)); +vmalloc (lk_tab_size);if (dev->lk_table.table ==NULL ) { ret = -ENOMEM ; goto err_lk;
@@ -2265,7 +2272,7 @@ err_tx:sizeof (struct qib_pio_header ), dev->pio_hdrs, dev->pio_hdrs_phys); err_hdrs: -free_pages ((unsigned long ) dev->lk_table.table,get_order (lk_tab_size)); +vfree (dev->lk_table.table); err_lk:kfree (dev->qp_table); err_qpt:
@@ -2319,8 +2326,7 @@ void qib_unregister_ib_device(struct qibsizeof (struct qib_pio_header ), dev->pio_hdrs, dev->pio_hdrs_phys); lk_tab_size = dev->lk_table.max *sizeof (*dev->lk_table.table); -free_pages ((unsigned long ) dev->lk_table.table, -get_order (lk_tab_size)); +vfree (dev->lk_table.table);kfree (dev->qp_table); }
drivers/infiniband/hw/qib/qib_verbs.h +2 -0
@@ -647,6 +647,8 @@ struct qib_qpn_table {struct qpn_map map[QPNMAP_ENTRIES ]; }; +#define MAX_LKEY_TABLE_BITS 23 +struct qib_lkey_table {spinlock_t lock;/* protect changes in this struct */ u32 next;/* next unused index (speeds search) */
Patches currently in stable-queue which might be from [email protected] are
queue-4.1/ib-qib-change-lkey-table-allocation-to-support-more-mrs.patch