]> git.proxmox.com Git - mirror_ubuntu-hirsute-kernel.git/commitdiff
IB/hfi1: Optimize process_receive_ib()
authorSebastian Sanchez <sebastian.sanchez@intel.com>
Thu, 1 Feb 2018 18:46:46 +0000 (10:46 -0800)
committerJason Gunthorpe <jgg@mellanox.com>
Thu, 1 Feb 2018 22:43:30 +0000 (15:43 -0700)
The arguments for trace_hfi1_rcvhdr() get computed every
time in the hot path regardless of the whether the trace
is on or off. This is seen to be costly with a profile.
The handling of fault inject isolates the verbs device for
all packets regardless of the presence of a RHF_DC_ERR error.

Fix the first by computing trace_hfi1_rcvhdr() arguments within
the trace itself, so that when the trace is off, the argument
data isn't computed. Fix the second by moving the error check to
handle_eflags() when an RHF error occurs and by testing for
RHF_DC_ERR before executing the reset of handle_eflags().

Reviewed-by: Don Hiatt <don.hiatt@intel.com>
Reviewed-by: Mike Marciniszyn <mike.marciniszyn@intel.com>
Signed-off-by: Sebastian Sanchez <sebastian.sanchez@intel.com>
Signed-off-by: Dennis Dalessandro <dennis.dalessandro@intel.com>
Signed-off-by: Jason Gunthorpe <jgg@mellanox.com>
drivers/infiniband/hw/hfi1/driver.c
drivers/infiniband/hw/hfi1/trace_rx.h

index 0a9bc1875d53572d4b76da236230c649c28df067..98703f1ce7ac40aba5ed0b6433fe2b183260be64 100644 (file)
@@ -256,7 +256,12 @@ static void rcv_hdrerr(struct hfi1_ctxtdata *rcd, struct hfi1_pportdata *ppd,
        u32 mlid_base;
        struct hfi1_ibport *ibp = rcd_to_iport(rcd);
        struct hfi1_devdata *dd = ppd->dd;
-       struct rvt_dev_info *rdi = &dd->verbs_dev.rdi;
+       struct hfi1_ibdev *verbs_dev = &dd->verbs_dev;
+       struct rvt_dev_info *rdi = &verbs_dev->rdi;
+
+       if ((packet->rhf & RHF_DC_ERR) &&
+           hfi1_dbg_fault_suppress_err(verbs_dev))
+               return;
 
        if (packet->rhf & (RHF_VCRC_ERR | RHF_ICRC_ERR))
                return;
@@ -1552,19 +1557,7 @@ int process_receive_ib(struct hfi1_packet *packet)
        if (hfi1_setup_9B_packet(packet))
                return RHF_RCV_CONTINUE;
 
-       trace_hfi1_rcvhdr(packet->rcd->ppd->dd,
-                         packet->rcd->ctxt,
-                         rhf_err_flags(packet->rhf),
-                         RHF_RCV_TYPE_IB,
-                         packet->hlen,
-                         packet->tlen,
-                         packet->updegr,
-                         rhf_egr_index(packet->rhf));
-
-       if (unlikely(
-                (hfi1_dbg_fault_suppress_err(&packet->rcd->dd->verbs_dev) &&
-                (packet->rhf & RHF_DC_ERR))))
-               return RHF_RCV_CONTINUE;
+       trace_hfi1_rcvhdr(packet, RHF_RCV_TYPE_IB);
 
        if (unlikely(rhf_err_flags(packet->rhf))) {
                handle_eflags(packet);
index 4d487fee105da1c6a30db17afdd984ae76967f57..f76841595e08e63451de15284e0596908f56c845 100644 (file)
@@ -63,17 +63,9 @@ __print_symbolic(type,                       \
 #define TRACE_SYSTEM hfi1_rx
 
 TRACE_EVENT(hfi1_rcvhdr,
-           TP_PROTO(struct hfi1_devdata *dd,
-                    u32 ctxt,
-                    u64 eflags,
-                    u32 etype,
-                    u32 hlen,
-                    u32 tlen,
-                    u32 updegr,
-                    u32 etail
-                   ),
-           TP_ARGS(dd, ctxt, eflags, etype, hlen, tlen, updegr, etail),
-           TP_STRUCT__entry(DD_DEV_ENTRY(dd)
+           TP_PROTO(struct hfi1_packet *packet, u32 etype),
+           TP_ARGS(packet, etype),
+           TP_STRUCT__entry(DD_DEV_ENTRY(packet->rcd->dd)
                             __field(u64, eflags)
                             __field(u32, ctxt)
                             __field(u32, etype)
@@ -82,14 +74,14 @@ TRACE_EVENT(hfi1_rcvhdr,
                             __field(u32, updegr)
                             __field(u32, etail)
                             ),
-            TP_fast_assign(DD_DEV_ASSIGN(dd);
-                           __entry->eflags = eflags;
-                           __entry->ctxt = ctxt;
+            TP_fast_assign(DD_DEV_ASSIGN(packet->rcd->dd);
+                           __entry->eflags = rhf_err_flags(packet->rhf);
+                           __entry->ctxt = packet->rcd->ctxt;
                            __entry->etype = etype;
-                           __entry->hlen = hlen;
-                           __entry->tlen = tlen;
-                           __entry->updegr = updegr;
-                           __entry->etail = etail;
+                           __entry->hlen = packet->hlen;
+                           __entry->tlen = packet->tlen;
+                           __entry->updegr = packet->updegr;
+                           __entry->etail = rhf_egr_index(packet->rhf);
                            ),
             TP_printk(
                "[%s] ctxt %d eflags 0x%llx etype %d,%s hlen %d tlen %d updegr %d etail %d",