From 24b440a9d3bae8586b64e15a28c96a9625d37356 Mon Sep 17 00:00:00 2001 From: Dag Moxnes Date: Tue, 21 Apr 2015 12:20:02 +0200 Subject: [PATCH] ib_mad: incoming sminfo SMPs gets discarded if no process_mad function is registered The process_mad function is an optional IB driver entry point allows a driver to intercept or modify MAD traffic. This fix allows MAD traffic to flow down to the device also when MAD traffic is completely handled by the device and no process_mad function is provided. Orabug: 20930262 Signed-off-by: Knut Omang Signed-off-by: Mukesh Kacker --- drivers/infiniband/core/mad.c | 3 +++ drivers/infiniband/core/smi.h | 6 ++---- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/drivers/infiniband/core/mad.c b/drivers/infiniband/core/mad.c index af878a71ee3f..11354a2a487d 100644 --- a/drivers/infiniband/core/mad.c +++ b/drivers/infiniband/core/mad.c @@ -762,6 +762,9 @@ static int handle_outgoing_dr_smp(struct ib_mad_agent_private *mad_agent_priv, goto out; } + if (!device->process_mad) + goto out; + /* Check to post send on QP or process locally */ if (smi_check_local_smp(smp, device) == IB_SMI_DISCARD && smi_check_local_returning_smp(smp, device) == IB_SMI_DISCARD) diff --git a/drivers/infiniband/core/smi.h b/drivers/infiniband/core/smi.h index aff96bac49b4..52adf7960402 100644 --- a/drivers/infiniband/core/smi.h +++ b/drivers/infiniband/core/smi.h @@ -67,8 +67,7 @@ static inline enum smi_action smi_check_local_smp(struct ib_smp *smp, { /* C14-9:3 -- We're at the end of the DR segment of path */ /* C14-9:4 -- Hop Pointer = Hop Count + 1 -> give to SMA/SM */ - return ((device->process_mad && - !ib_get_smp_direction(smp) && + return ((!ib_get_smp_direction(smp) && (smp->hop_ptr == smp->hop_cnt + 1)) ? IB_SMI_HANDLE : IB_SMI_DISCARD); } @@ -82,8 +81,7 @@ static inline enum smi_action smi_check_local_returning_smp(struct ib_smp *smp, { /* C14-13:3 -- We're at the end of the DR segment of path */ /* C14-13:4 -- Hop Pointer == 0 -> give to SM */ - return ((device->process_mad && - ib_get_smp_direction(smp) && + return ((ib_get_smp_direction(smp) && !smp->hop_ptr) ? IB_SMI_HANDLE : IB_SMI_DISCARD); } -- 2.50.1