Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

IB/mad: Simplify SMI by eliminating smi_check_local_dr_smp()

The call to ib_get_agent_port() shouldn't be possible to fail when
smi_check_local_dr_smp() is called from ib_mad_recv_done_handler().
When it is called from handle_outgoing_dr_smp(), the device and
port_num come from mad_agent_priv so I assume the call to
ib_get_agent_port() shouldn't fail either. In either case,
smi_check_local_smp() only uses the mad_agent pointer to check that
mad_agent->device->process_mad is not NULL. The device pointer would
have to be the same as the one passed to smi_check_local_dr_smp()
since that pointer is used later instead of the one checked in
smi_check_local_smp().

Signed-off-by: Hal Rosenstock <halr@voltaire.com>
Signed-off-by: Roland Dreier <rolandd@cisco.com>

authored by

Ralph Campbell and committed by
Roland Dreier
5e9f71a1 5f0b67e0

+6 -27
-16
drivers/infiniband/core/agent.c
··· 78 78 return entry; 79 79 } 80 80 81 - int smi_check_local_dr_smp(struct ib_smp *smp, 82 - struct ib_device *device, 83 - int port_num) 84 - { 85 - struct ib_agent_port_private *port_priv; 86 - 87 - port_priv = ib_get_agent_port(device, port_num); 88 - if (!port_priv) { 89 - printk(KERN_DEBUG SPFX "smi_check_local_dr_smp %s port %d " 90 - "not open\n", device->name, port_num); 91 - return 1; 92 - } 93 - 94 - return smi_check_local_smp(port_priv->agent[0], smp); 95 - } 96 - 97 81 int agent_send_response(struct ib_mad *mad, struct ib_grh *grh, 98 82 struct ib_wc *wc, struct ib_device *device, 99 83 int port_num, int qpn)
+3 -5
drivers/infiniband/core/mad.c
··· 679 679 goto out; 680 680 } 681 681 /* Check to post send on QP or process locally */ 682 - ret = smi_check_local_dr_smp(smp, device, port_num); 683 - if (!ret || !device->process_mad) 682 + ret = smi_check_local_smp(smp, device); 683 + if (!ret) 684 684 goto out; 685 685 686 686 local = kmalloc(sizeof *local, GFP_ATOMIC); ··· 1661 1661 port_priv->device->node_type, 1662 1662 port_priv->port_num)) 1663 1663 goto out; 1664 - if (!smi_check_local_dr_smp(&recv->mad.smp, 1665 - port_priv->device, 1666 - port_priv->port_num)) 1664 + if (!smi_check_local_smp(&recv->mad.smp, port_priv->device)) 1667 1665 goto out; 1668 1666 } 1669 1667
+3 -6
drivers/infiniband/core/smi.h
··· 49 49 extern int smi_handle_dr_smp_send(struct ib_smp *smp, 50 50 u8 node_type, 51 51 int port_num); 52 - extern int smi_check_local_dr_smp(struct ib_smp *smp, 53 - struct ib_device *device, 54 - int port_num); 55 52 56 53 /* 57 54 * Return 1 if the SMP should be handled by the local SMA/SM via process_mad 58 55 */ 59 - static inline int smi_check_local_smp(struct ib_mad_agent *mad_agent, 60 - struct ib_smp *smp) 56 + static inline int smi_check_local_smp(struct ib_smp *smp, 57 + struct ib_device *device) 61 58 { 62 59 /* C14-9:3 -- We're at the end of the DR segment of path */ 63 60 /* C14-9:4 -- Hop Pointer = Hop Count + 1 -> give to SMA/SM */ 64 - return ((mad_agent->device->process_mad && 61 + return ((device->process_mad && 65 62 !ib_get_smp_direction(smp) && 66 63 (smp->hop_ptr == smp->hop_cnt + 1))); 67 64 }