[openib-general] [PATCH] agent: Handle out of order send completions
Hal Rosenstock
halr at voltaire.com
Wed Nov 10 11:07:32 PST 2004
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);
More information about the general
mailing list