mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2025-01-07 14:24:18 +08:00
IB/hfi1: Optimize process_receive_ib()
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>
This commit is contained in:
parent
ca85bb1ca9
commit
aca7f4fc32
@ -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);
|
||||
|
@ -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",
|
||||
|
Loading…
Reference in New Issue
Block a user