IB/hfi1: Do not allocate PIO send contexts for VNIC
authorNiranjana Vishwanathapura <niranjana.vishwanathapura@intel.com>
Mon, 6 Nov 2017 14:38:52 +0000 (06:38 -0800)
committerDoug Ledford <dledford@redhat.com>
Mon, 13 Nov 2017 20:53:57 +0000 (15:53 -0500)
OPA VNIC does not use PIO contexts and instead only uses SDMA
engines. Do not allocate PIO contexts for VNIC ports.

Reviewed-by: Michael J. Ruhl <michael.j.ruhl@intel.com>
Signed-off-by: Niranjana Vishwanathapura <niranjana.vishwanathapura@intel.com>
Signed-off-by: Dennis Dalessandro <dennis.dalessandro@intel.com>
Signed-off-by: Doug Ledford <dledford@redhat.com>
drivers/infiniband/hw/hfi1/chip.c
drivers/infiniband/hw/hfi1/driver.c
drivers/infiniband/hw/hfi1/init.c
drivers/infiniband/hw/hfi1/pio.c
drivers/infiniband/hw/hfi1/pio.h
drivers/infiniband/hw/hfi1/vnic_main.c

index 2523b6291f95bc2a536f66ba5cfea7889a4e3005..bb3b65a14df04946a61e73f23e9c9b5307065b09 100644 (file)
@@ -6816,7 +6816,8 @@ static void rxe_kernel_unfreeze(struct hfi1_devdata *dd)
                rcd = hfi1_rcd_get_by_index(dd, i);
 
                /* Ensure all non-user contexts(including vnic) are enabled */
-               if (!rcd || !rcd->sc || (rcd->sc->type == SC_USER)) {
+               if (!rcd ||
+                   (i >= dd->first_dyn_alloc_ctxt && !rcd->is_vnic)) {
                        hfi1_rcd_put(rcd);
                        continue;
                }
@@ -8093,8 +8094,7 @@ static void is_rcv_avail_int(struct hfi1_devdata *dd, unsigned int source)
                rcd = hfi1_rcd_get_by_index(dd, source);
                if (rcd) {
                        /* Check for non-user contexts, including vnic */
-                       if ((source < dd->first_dyn_alloc_ctxt) ||
-                           (rcd->sc && (rcd->sc->type == SC_KERNEL)))
+                       if (source < dd->first_dyn_alloc_ctxt || rcd->is_vnic)
                                rcd->do_interrupt(rcd, 0);
                        else
                                handle_user_interrupt(rcd);
@@ -8124,8 +8124,8 @@ static void is_rcv_urgent_int(struct hfi1_devdata *dd, unsigned int source)
                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->sc || (rcd->sc->type == SC_USER)))
+                       if (source >= dd->first_dyn_alloc_ctxt &&
+                           !rcd->is_vnic)
                                handle_user_interrupt(rcd);
 
                        hfi1_rcd_put(rcd);
index 07a32a1c130396ce2c9e131abb3ef2eebdd9b42c..4f65ac671044a682a52ed496edf9ad7cbd8ed646 100644 (file)
@@ -929,10 +929,9 @@ void set_all_slowpath(struct hfi1_devdata *dd)
                rcd = hfi1_rcd_get_by_index(dd, i);
                if (!rcd)
                        continue;
-               if ((i < dd->first_dyn_alloc_ctxt) ||
-                   (rcd->sc && (rcd->sc->type == SC_KERNEL))) {
+               if (i < dd->first_dyn_alloc_ctxt || rcd->is_vnic)
                        rcd->do_interrupt = &handle_receive_interrupt;
-               }
+
                hfi1_rcd_put(rcd);
        }
 }
index f29e7a327f2913ca2bf5e1f5042c1696d69f8e2d..8e3b3e7d829a9be516625e31dbde7d5ff7a092a1 100644 (file)
@@ -1807,8 +1807,7 @@ int hfi1_create_rcvhdrq(struct hfi1_devdata *dd, struct hfi1_ctxtdata *rcd)
                amt = PAGE_ALIGN(rcd->rcvhdrq_cnt * rcd->rcvhdrqentsize *
                                 sizeof(u32));
 
-               if ((rcd->ctxt < dd->first_dyn_alloc_ctxt) ||
-                   (rcd->sc && (rcd->sc->type == SC_KERNEL)))
+               if (rcd->ctxt < dd->first_dyn_alloc_ctxt || rcd->is_vnic)
                        gfp_flags = GFP_KERNEL;
                else
                        gfp_flags = GFP_USER;
index 7108a4b5e94cdef45f27722847065388a36a6f85..c929f5b08b15fe26b4c1a3c589a495e7c4468c8e 100644 (file)
@@ -703,7 +703,6 @@ struct send_context *sc_alloc(struct hfi1_devdata *dd, int type,
 {
        struct send_context_info *sci;
        struct send_context *sc = NULL;
-       int req_type = type;
        dma_addr_t dma;
        unsigned long flags;
        u64 reg;
@@ -730,13 +729,6 @@ struct send_context *sc_alloc(struct hfi1_devdata *dd, int type,
                return NULL;
        }
 
-       /*
-        * VNIC contexts are dynamically allocated.
-        * Hence, pick a user context for VNIC.
-        */
-       if (type == SC_VNIC)
-               type = SC_USER;
-
        spin_lock_irqsave(&dd->sc_lock, flags);
        ret = sc_hw_alloc(dd, type, &sw_index, &hw_context);
        if (ret) {
@@ -746,15 +738,6 @@ struct send_context *sc_alloc(struct hfi1_devdata *dd, int type,
                return NULL;
        }
 
-       /*
-        * VNIC contexts are used by kernel driver.
-        * Hence, mark them as kernel contexts.
-        */
-       if (req_type == SC_VNIC) {
-               dd->send_contexts[sw_index].type = SC_KERNEL;
-               type = SC_KERNEL;
-       }
-
        sci = &dd->send_contexts[sw_index];
        sci->sc = sc;
 
index 99ca5edb0b435a3754c03693f779f9b391f7faf4..058b08f459ab7947e53aa5ad676febc9999f7ade 100644 (file)
 #define SC_USER   3    /* must be the last one: it may take all left */
 #define SC_MAX    4    /* count of send context types */
 
-/*
- * SC_VNIC types are allocated (dynamically) from the user context pool,
- * (SC_USER) and used by kernel driver as kernel contexts (SC_KERNEL).
- */
-#define SC_VNIC   SC_MAX
-
 /* invalid send context index */
 #define INVALID_SCI 0xff
 
index 1a17708be46a922d5505a1dd38c188d5189fb006..5d65582fe4d92f4840cdb84db8ae5d6f3dcf8652 100644 (file)
@@ -67,8 +67,6 @@ static int setup_vnic_ctxt(struct hfi1_devdata *dd, struct hfi1_ctxtdata *uctxt)
        unsigned int rcvctrl_ops = 0;
        int ret;
 
-       hfi1_init_ctxt(uctxt->sc);
-
        uctxt->do_interrupt = &handle_receive_interrupt;
 
        /* Now allocate the RcvHdr queue and eager buffers. */
@@ -96,8 +94,6 @@ static int setup_vnic_ctxt(struct hfi1_devdata *dd, struct hfi1_ctxtdata *uctxt)
                rcvctrl_ops |= HFI1_RCVCTRL_TAILUPD_ENB;
 
        hfi1_rcvctrl(uctxt->dd, rcvctrl_ops, uctxt);
-
-       uctxt->is_vnic = true;
 done:
        return ret;
 }
@@ -122,20 +118,7 @@ static int allocate_vnic_ctxt(struct hfi1_devdata *dd,
                        HFI1_CAP_KGET(NODROP_EGR_FULL) |
                        HFI1_CAP_KGET(DMA_RTAIL);
        uctxt->seq_cnt = 1;
-
-       /* Allocate and enable a PIO send context */
-       uctxt->sc = sc_alloc(dd, SC_VNIC, uctxt->rcvhdrqentsize,
-                            uctxt->numa_id);
-
-       ret = uctxt->sc ? 0 : -ENOMEM;
-       if (ret)
-               goto bail;
-
-       dd_dev_dbg(dd, "allocated vnic send context %u(%u)\n",
-                  uctxt->sc->sw_index, uctxt->sc->hw_context);
-       ret = sc_enable(uctxt->sc);
-       if (ret)
-               goto bail;
+       uctxt->is_vnic = true;
 
        if (dd->num_msix_entries)
                hfi1_set_vnic_msix_info(uctxt);
@@ -144,11 +127,7 @@ static int allocate_vnic_ctxt(struct hfi1_devdata *dd,
        dd_dev_dbg(dd, "created vnic context %d\n", uctxt->ctxt);
        *vnic_ctxt = uctxt;
 
-       return ret;
-bail:
-       hfi1_free_ctxt(uctxt);
-       dd_dev_dbg(dd, "vnic allocation failed. rc %d\n", ret);
-       return ret;
+       return 0;
 }
 
 static void deallocate_vnic_ctxt(struct hfi1_devdata *dd,
@@ -170,18 +149,6 @@ static void deallocate_vnic_ctxt(struct hfi1_devdata *dd,
                     HFI1_RCVCTRL_ONE_PKT_EGR_DIS |
                     HFI1_RCVCTRL_NO_RHQ_DROP_DIS |
                     HFI1_RCVCTRL_NO_EGR_DROP_DIS, uctxt);
-       /*
-        * VNIC contexts are allocated from user context pool.
-        * Release them back to user context pool.
-        *
-        * Reset context integrity checks to default.
-        * (writes to CSRs probably belong in chip.c)
-        */
-       write_kctxt_csr(dd, uctxt->sc->hw_context, SEND_CTXT_CHECK_ENABLE,
-                       hfi1_pkt_default_send_ctxt_mask(dd, SC_USER));
-       sc_disable(uctxt->sc);
-
-       dd->send_contexts[uctxt->sc->sw_index].type = SC_USER;
 
        uctxt->event_flags = 0;