]> asedeno.scripts.mit.edu Git - linux.git/commitdiff
IB/hfi1: Set in_use_ctxts bits for user ctxts only
authorMichael J. Ruhl <michael.j.ruhl@intel.com>
Mon, 2 Jul 2018 15:08:27 +0000 (08:08 -0700)
committerJason Gunthorpe <jgg@mellanox.com>
Tue, 3 Jul 2018 20:29:12 +0000 (14:29 -0600)
The in_use_ctxts bitmask is for user receive contexts only.  Setting it for
any other type of receive context is incorrect.

Move initial set of in_use_ctxts bits from the general context init to the
user context specific init. Having this bit set can allow contexts to be
incorrectly identified by some IRQ handlers. This will allow
handle_user_interrupt() will now filter user contexts correctly.

Clean up redundant is_rcv_urgent_int() user context check.

A follow on patch will clean up an incorrect code path in the
is_rcv_avail_int().

Fixes: 8737ce95c463 ("IB/hfi1: Fix an assign/ordering issue with shared context IDs")
Reviewed-by: Mike Marciniszyn <mike.marciniszyn@intel.com>
Reviewed-by: Kamenee Arumugam <kamenee.arumugam@intel.com>
Signed-off-by: Michael J. Ruhl <michael.j.ruhl@intel.com>
Signed-off-by: Dennis Dalessandro <dennis.dalessandro@intel.com>
Signed-off-by: Jason Gunthorpe <jgg@mellanox.com>
drivers/infiniband/hw/hfi1/chip.c
drivers/infiniband/hw/hfi1/file_ops.c
drivers/infiniband/hw/hfi1/init.c

index 5d03c780c780fe838ff431c78a98236bcb55fc00..66ea0b52d42ec52f0ebf6de5c0239dea0045a3f0 100644 (file)
@@ -8173,8 +8173,14 @@ static void is_rcv_avail_int(struct hfi1_devdata *dd, unsigned int source)
                   err_detail, source);
 }
 
-/*
+/**
+ * is_rcv_urgent_int() - User receive context urgent IRQ handler
+ * @dd: valid dd
+ * @source: logical IRQ source (ofse from IS_RCVURGENT_START)
+ *
  * RX block receive urgent interrupt.  Source is < 160.
+ *
+ * NOTE: kernel receive contexts specifically do NOT enable this IRQ.
  */
 static void is_rcv_urgent_int(struct hfi1_devdata *dd, unsigned int source)
 {
@@ -8184,11 +8190,7 @@ static void is_rcv_urgent_int(struct hfi1_devdata *dd, unsigned int source)
        if (likely(source < dd->num_rcv_contexts)) {
                rcd = hfi1_rcd_get_by_index(dd, source);
                if (rcd) {
-                       /* only pay attention to user urgent interrupts */
-                       if (source >= dd->first_dyn_alloc_ctxt &&
-                           !rcd->is_vnic)
-                               handle_user_interrupt(rcd);
-
+                       handle_user_interrupt(rcd);
                        hfi1_rcd_put(rcd);
                        return; /* OK */
                }
index 3b09eedd29bc5f6127696225e512814531e25048..1fc75647e47bf1839c3c743f4ad051785c4d4dc9 100644 (file)
@@ -985,7 +985,11 @@ static int allocate_ctxt(struct hfi1_filedata *fd, struct hfi1_devdata *dd,
         * sub contexts.
         * This has to be done here so the rest of the sub-contexts find the
         * proper base context.
+        * NOTE: _set_bit() can be used here because the context creation is
+        * protected by the mutex (rather than the spin_lock), and will be the
+        * very first instance of this context.
         */
+       __set_bit(0, uctxt->in_use_ctxts);
        if (uinfo->subctxt_cnt)
                init_subctxts(uctxt, uinfo);
        uctxt->userversion = uinfo->userversion;
index d51ad777d72dc3575db53b3deb8deb81e8b1f9cc..758d273c32cfe32b6201277cb4796c8fc4450d7a 100644 (file)
@@ -364,7 +364,6 @@ int hfi1_create_ctxtdata(struct hfi1_pportdata *ppd, int numa,
                hfi1_exp_tid_group_init(rcd);
                rcd->ppd = ppd;
                rcd->dd = dd;
-               __set_bit(0, rcd->in_use_ctxts);
                rcd->numa_id = numa;
                rcd->rcv_array_groups = dd->rcv_entries.ngroups;
                rcd->rhf_rcv_function_map = normal_rhf_rcv_functions;