diff options
author | Ralph Campbell <ralphc@pathscale.com> | 2006-02-03 17:32:01 -0500 |
---|---|---|
committer | Roland Dreier <rolandd@cisco.com> | 2006-03-20 13:08:11 -0500 |
commit | 5e9f71a16c56af7e2ff8b7ea251e0fd90b5de560 (patch) | |
tree | d3b6aba0640173d0ce760140650dad51a76f9501 /drivers/infiniband | |
parent | 5f0b67e0d5c2807337b8fee4aa71b05f4f641534 (diff) |
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>
Diffstat (limited to 'drivers/infiniband')
-rw-r--r-- | drivers/infiniband/core/agent.c | 16 | ||||
-rw-r--r-- | drivers/infiniband/core/mad.c | 8 | ||||
-rw-r--r-- | drivers/infiniband/core/smi.h | 9 |
3 files changed, 6 insertions, 27 deletions
diff --git a/drivers/infiniband/core/agent.c b/drivers/infiniband/core/agent.c index 1a8f94588364..ecd1a3057c61 100644 --- a/drivers/infiniband/core/agent.c +++ b/drivers/infiniband/core/agent.c | |||
@@ -78,22 +78,6 @@ ib_get_agent_port(struct ib_device *device, int port_num) | |||
78 | return entry; | 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 | int agent_send_response(struct ib_mad *mad, struct ib_grh *grh, | 81 | int agent_send_response(struct ib_mad *mad, struct ib_grh *grh, |
98 | struct ib_wc *wc, struct ib_device *device, | 82 | struct ib_wc *wc, struct ib_device *device, |
99 | int port_num, int qpn) | 83 | int port_num, int qpn) |
diff --git a/drivers/infiniband/core/mad.c b/drivers/infiniband/core/mad.c index c82f47a66e48..445ad0dda213 100644 --- a/drivers/infiniband/core/mad.c +++ b/drivers/infiniband/core/mad.c | |||
@@ -679,8 +679,8 @@ static int handle_outgoing_dr_smp(struct ib_mad_agent_private *mad_agent_priv, | |||
679 | goto out; | 679 | goto out; |
680 | } | 680 | } |
681 | /* Check to post send on QP or process locally */ | 681 | /* Check to post send on QP or process locally */ |
682 | ret = smi_check_local_dr_smp(smp, device, port_num); | 682 | ret = smi_check_local_smp(smp, device); |
683 | if (!ret || !device->process_mad) | 683 | if (!ret) |
684 | goto out; | 684 | goto out; |
685 | 685 | ||
686 | local = kmalloc(sizeof *local, GFP_ATOMIC); | 686 | local = kmalloc(sizeof *local, GFP_ATOMIC); |
@@ -1661,9 +1661,7 @@ static void ib_mad_recv_done_handler(struct ib_mad_port_private *port_priv, | |||
1661 | port_priv->device->node_type, | 1661 | port_priv->device->node_type, |
1662 | port_priv->port_num)) | 1662 | port_priv->port_num)) |
1663 | goto out; | 1663 | goto out; |
1664 | if (!smi_check_local_dr_smp(&recv->mad.smp, | 1664 | if (!smi_check_local_smp(&recv->mad.smp, port_priv->device)) |
1665 | port_priv->device, | ||
1666 | port_priv->port_num)) | ||
1667 | goto out; | 1665 | goto out; |
1668 | } | 1666 | } |
1669 | 1667 | ||
diff --git a/drivers/infiniband/core/smi.h b/drivers/infiniband/core/smi.h index 2b3c40198f81..3011bfd86dc5 100644 --- a/drivers/infiniband/core/smi.h +++ b/drivers/infiniband/core/smi.h | |||
@@ -49,19 +49,16 @@ extern int smi_check_forward_dr_smp(struct ib_smp *smp); | |||
49 | extern int smi_handle_dr_smp_send(struct ib_smp *smp, | 49 | extern int smi_handle_dr_smp_send(struct ib_smp *smp, |
50 | u8 node_type, | 50 | u8 node_type, |
51 | int port_num); | 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 | * Return 1 if the SMP should be handled by the local SMA/SM via process_mad | 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, | 56 | static inline int smi_check_local_smp(struct ib_smp *smp, |
60 | struct ib_smp *smp) | 57 | struct ib_device *device) |
61 | { | 58 | { |
62 | /* C14-9:3 -- We're at the end of the DR segment of path */ | 59 | /* C14-9:3 -- We're at the end of the DR segment of path */ |
63 | /* C14-9:4 -- Hop Pointer = Hop Count + 1 -> give to SMA/SM */ | 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 | !ib_get_smp_direction(smp) && | 62 | !ib_get_smp_direction(smp) && |
66 | (smp->hop_ptr == smp->hop_cnt + 1))); | 63 | (smp->hop_ptr == smp->hop_cnt + 1))); |
67 | } | 64 | } |