IB/rdmavt: Check lkey_table_size value before use
authorJubin John <jubin.john@intel.com>
Fri, 26 Feb 2016 21:33:08 +0000 (13:33 -0800)
committerDoug Ledford <dledford@redhat.com>
Fri, 11 Mar 2016 01:45:45 +0000 (20:45 -0500)
The lkey_table_size driver specific parameter value is used before its
value is sanity checked and restricted to RVT_MAX_LKEY_TABLE_BITS.

This causes a vmalloc allocation failure for large values. Fix this
by moving the value check before the first usage of the value.

Reviewed-by: Dennis Dalessandro <dennis.dalessandro@intel.com>
Reviewed-by: Mike Marciniszyn <mike.marciniszyn@intel.com>
Signed-off-by: Jubin John <jubin.john@intel.com>
Signed-off-by: Doug Ledford <dledford@redhat.com>
drivers/infiniband/sw/rdmavt/mr.c

index 4d5ef73e729163c776b4d67191c48d1d194e6baf..0ff765bfd619070a54d50c67caa61b85893d220b 100644 (file)
@@ -76,8 +76,6 @@ int rvt_driver_mr_init(struct rvt_dev_info *rdi)
 
        spin_lock_init(&rdi->lkey_table.lock);
 
-       rdi->lkey_table.max = 1 << lkey_table_size;
-
        /* ensure generation is at least 4 bits */
        if (lkey_table_size > RVT_MAX_LKEY_TABLE_BITS) {
                rvt_pr_warn(rdi, "lkey bits %u too large, reduced to %u\n",
@@ -85,6 +83,7 @@ int rvt_driver_mr_init(struct rvt_dev_info *rdi)
                rdi->dparms.lkey_table_size = RVT_MAX_LKEY_TABLE_BITS;
                lkey_table_size = rdi->dparms.lkey_table_size;
        }
+       rdi->lkey_table.max = 1 << lkey_table_size;
        lk_tab_size = rdi->lkey_table.max * sizeof(*rdi->lkey_table.table);
        rdi->lkey_table.table = (struct rvt_mregion __rcu **)
                               vmalloc_node(lk_tab_size, rdi->dparms.node);