lkml.org 
[lkml]   [2015]   [Sep]   [26]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 4.1 098/159] IB/qib: Change lkey table allocation to support more MRs
    Date
    4.1-stable review patch.  If anyone has any objections, please let me know.

    ------------------

    From: Mike Marciniszyn <mike.marciniszyn@intel.com>

    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

    Reviewed-by: Vinit Agnihotri <vinit.abhay.agnihotri@intel.com>
    Signed-off-by: Mike Marciniszyn <mike.marciniszyn@intel.com>
    Signed-off-by: Doug Ledford <dledford@redhat.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

    ---
    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(-)

    --- a/drivers/infiniband/hw/qib/qib_keys.c
    +++ b/drivers/infiniband/hw/qib/qib_keys.c
    @@ -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);
    --- a/drivers/infiniband/hw/qib/qib_verbs.c
    +++ b/drivers/infiniband/hw/qib/qib_verbs.c
    @@ -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 qib
    sizeof(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);
    }

    --- a/drivers/infiniband/hw/qib/qib_verbs.h
    +++ b/drivers/infiniband/hw/qib/qib_verbs.h
    @@ -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) */



    \
     
     \ /
      Last update: 2015-09-27 00:01    [W:4.158 / U:0.216 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site