rsockets: acknowledge completion queue events in batch
PATCH v5 2/4 rsockets: acknowledge completion queue events in batch
Note: This patch is being resent as suggested by Sean
Also attached the patch file for convenience
From: Sreedhar Kodali <[email protected]>
Date: Thu Sep 18 14:29:48 2014 +0530
Perform completion event acknowledgments in batches instead of individually to minimze locking overheads. Size of the completion queue decides the size of a batch.
---
src/rsocket.c +6 -1
@@ -381,6 +381,7 @@ struct rsocket {dlist_entry iomap_list;dlist_entry iomap_queue;int iomap_pending; +int unack_cqe; };#define DS_UDP_TAG 0x55555555
@@ -599,6 +600,7 @@ static struct rsocket *rs_alloc(struct rsocket *inherited_rs, int type) rs->target_iomap_size = def_iomap_size; } } + rs->unack_cqe =0 ;fastlock_init (&rs->slock);fastlock_init (&rs->rlock);fastlock_init (&rs->cq_lock);
@@ -990,8 +992,11 @@ static void rs_free(struct rsocket *rs)if (rs->cm_id) {rs_free_iomappings (rs); -if (rs->cm_id->qp) +if (rs->cm_id->qp) { +if (rs->unack_cqe >0 ) +ibv_ack_cq_events (rs->cm_id->recv_cq, rs->unack_cqe);rdma_destroy_qp (rs->cm_id); + }rdma_destroy_id (rs->cm_id); }
@@ -1965,7 +1970,11 @@ static int rs_get_cq_event(struct rsocket *rs) ret = ibv_get_cq_event(rs->cm_id->recv_cq_channel, &cq,
&context);
if (!ret) {
- ibv_ack_cq_events(rs->cm_id->recv_cq, 1);
+ rs->unack_cqe += 1;
+ if (rs->unack_cqe == rs->sq_size + rs->rq_size) {
+ ibv_ack_cq_events(rs->cm_id->recv_cq, rs->unack_cqe);
+ rs->unack_cqe = 0;
+ }
rs->cq_armed = 0;
} else if (errno != EAGAIN) {
rs->state = rs_error;commit 490a2aa74e7dcdefe684e850d65b68bde3516ec4
Author: Sreedhar Kodali <[email protected]> Date: Thu Sep 18 14:29:48 2014 +0530
Perform completion event acknowledgments in batches instead of individually to minimze locking overheads. Size of the completion queue decides the size of a batch.
---
src/rsocket.c +11 -2
@@ -381,6 +381,7 @@ struct rsocket {dlist_entry iomap_list;dlist_entry iomap_queue;int iomap_pending; +int unack_cqe; };#define DS_UDP_TAG 0x55555555
@@ -599,6 +600,7 @@ static struct rsocket *rs_alloc(struct rsocket *inherited_rs, int type) rs->target_iomap_size = def_iomap_size; } } + rs->unack_cqe =0 ;fastlock_init (&rs->slock);fastlock_init (&rs->rlock);fastlock_init (&rs->cq_lock);
@@ -990,8 +992,11 @@ static void rs_free(struct rsocket *rs)if (rs->cm_id) {rs_free_iomappings (rs); -if (rs->cm_id->qp) +if (rs->cm_id->qp) { +if (rs->unack_cqe >0 ) +ibv_ack_cq_events (rs->cm_id->recv_cq, rs->unack_cqe);rdma_destroy_qp (rs->cm_id); + }rdma_destroy_id (rs->cm_id); }
@@ -1965,7 +1970,11 @@ static int rs_get_cq_event(struct rsocket *rs) ret =ibv_get_cq_event (rs->cm_id->recv_cq_channel, &cq, &context);if (!ret) { -ibv_ack_cq_events (rs->cm_id->recv_cq,1 ); + rs->unack_cqe +=1 ; +if (rs->unack_cqe == rs->sq_size + rs->rq_size) { +ibv_ack_cq_events (rs->cm_id->recv_cq, rs->unack_cqe); + rs->unack_cqe =0 ; + } rs->cq_armed =0 ; }else if (errno !=EAGAIN ) { rs->state = rs_error;
A message that is not in the archive (sent off-list or not yet received): 18bdfd1d731439cbe604263b37379cb6-FJGp5E75HVmZamtmwQBW5tBPR1lH4CV8@public.gmane.org
Thanks - applied
--
To unsubscribe from this list: send the line "unsubscribe linux-rdma" in the body of a message to [email protected] More majordomo info at http://vger.kernel.org/majordomo-info.html