agent: Handle out of order send completions
(Issue pointed out by Sean)
Index: agent_priv.h
===
--- agent_priv.h(revision 1183)
+++ agent_priv.h(working copy)
@@ -46,7 +46,6 @@
struct ib_mad_agent *lr_smp_agent;/* LR SM class */
struct ib_mad_agent *perf_mgmt_agent; /* PerfMgmt class */
struct ib_mr *mr;
- u64 wr_id;
};
#endif /* __IB_AGENT_PRIV_H__ */
Index: agent.c
===
--- agent.c (revision 1192)
+++ agent.c (working copy)
@@ -117,9 +117,9 @@
/* PCI mapping */
gather_list.addr = pci_map_single(mad_agent-device-dma_device,
mad-mad,
- sizeof mad-mad,
+ sizeof(mad-mad),
PCI_DMA_TODEVICE);
- gather_list.length = sizeof mad-mad;
+ gather_list.length = sizeof(mad-mad);
gather_list.lkey = (*port_priv-mr).lkey;
send_wr.next = NULL;
@@ -172,7 +172,7 @@
send_wr.wr.ud.remote_qkey = 0; /* for SMPs */
}
send_wr.wr.ud.mad_hdr = mad-mad.mad.mad_hdr;
- send_wr.wr_id = ++port_priv-wr_id;
+ send_wr.wr_id = (unsigned long)agent_send_wr-send_list;
pci_unmap_addr_set(agent_send_wr, mapping, gather_list.addr);
@@ -182,7 +182,7 @@
spin_unlock_irqrestore(port_priv-send_list_lock, flags);
pci_unmap_single(mad_agent-device-dma_device,
pci_unmap_addr(agent_send_wr, mapping),
-sizeof mad-mad,
+sizeof(mad-mad),
PCI_DMA_TODEVICE);
ib_destroy_ah(agent_send_wr-ah);
kfree(agent_send_wr);
@@ -247,31 +247,18 @@
return;
}
- /* Completion corresponds to first entry on posted MAD send list */
spin_lock_irqsave(port_priv-send_list_lock, flags);
- if (list_empty(port_priv-send_posted_list)) {
- spin_unlock_irqrestore(port_priv-send_list_lock, flags);
- printk(KERN_ERR SPFX Send completion WR ID 0x%Lx but send
- list is empty\n,
- (unsigned long long) mad_send_wc-wr_id);
- return;
- }
-
- agent_send_wr = list_entry(port_priv-send_posted_list,
- struct ib_agent_send_wr,
- send_list);
- send_wr = agent_send_wr-send_list.next;
- agent_send_wr = container_of(send_wr, struct ib_agent_send_wr,
+ send_wr = (struct list_head *)(unsigned long)mad_send_wc-wr_id;
+ agent_send_wr = container_of(send_wr, struct ib_agent_send_wr,
send_list);
-
- /* Remove from posted send MAD list */
+ /* Remove completed send from posted send MAD list */
list_del(agent_send_wr-send_list);
spin_unlock_irqrestore(port_priv-send_list_lock, flags);
/* Unmap PCI */
pci_unmap_single(mad_agent-device-dma_device,
pci_unmap_addr(agent_send_wr, mapping),
-sizeof agent_send_wr-mad-mad,
+sizeof(agent_send_wr-mad-mad),
PCI_DMA_TODEVICE);
ib_destroy_ah(agent_send_wr-ah);
@@ -306,7 +293,6 @@
memset(port_priv, 0, sizeof *port_priv);
port_priv-port_num = port_num;
- port_priv-wr_id = 0;
spin_lock_init(port_priv-send_list_lock);
INIT_LIST_HEAD(port_priv-send_posted_list);
___
openib-general mailing list
[EMAIL PROTECTED]
http://openib.org/mailman/listinfo/openib-general
To unsubscribe, please visit http://openib.org/mailman/listinfo/openib-general