mirror of
https://github.com/tbsdtv/linux_media.git
synced 2025-07-22 20:30:58 +02:00
svcrdma: Use llist for managing cache of recv_ctxts
Use a wait-free mechanism for managing the svc_rdma_recv_ctxts free list. Subsequently, sc_recv_lock can be eliminated. Signed-off-by: Chuck Lever <chuck.lever@oracle.com> Signed-off-by: J. Bruce Fields <bfields@redhat.com>
This commit is contained in:
committed by
J. Bruce Fields
parent
d6dfe43ec6
commit
4866073e6d
@@ -172,9 +172,10 @@ static void svc_rdma_recv_ctxt_destroy(struct svcxprt_rdma *rdma,
|
||||
void svc_rdma_recv_ctxts_destroy(struct svcxprt_rdma *rdma)
|
||||
{
|
||||
struct svc_rdma_recv_ctxt *ctxt;
|
||||
struct llist_node *node;
|
||||
|
||||
while ((ctxt = svc_rdma_next_recv_ctxt(&rdma->sc_recv_ctxts))) {
|
||||
list_del(&ctxt->rc_list);
|
||||
while ((node = llist_del_first(&rdma->sc_recv_ctxts))) {
|
||||
ctxt = llist_entry(node, struct svc_rdma_recv_ctxt, rc_node);
|
||||
svc_rdma_recv_ctxt_destroy(rdma, ctxt);
|
||||
}
|
||||
}
|
||||
@@ -183,21 +184,18 @@ static struct svc_rdma_recv_ctxt *
|
||||
svc_rdma_recv_ctxt_get(struct svcxprt_rdma *rdma)
|
||||
{
|
||||
struct svc_rdma_recv_ctxt *ctxt;
|
||||
struct llist_node *node;
|
||||
|
||||
spin_lock(&rdma->sc_recv_lock);
|
||||
ctxt = svc_rdma_next_recv_ctxt(&rdma->sc_recv_ctxts);
|
||||
if (!ctxt)
|
||||
node = llist_del_first(&rdma->sc_recv_ctxts);
|
||||
if (!node)
|
||||
goto out_empty;
|
||||
list_del(&ctxt->rc_list);
|
||||
spin_unlock(&rdma->sc_recv_lock);
|
||||
ctxt = llist_entry(node, struct svc_rdma_recv_ctxt, rc_node);
|
||||
|
||||
out:
|
||||
ctxt->rc_page_count = 0;
|
||||
return ctxt;
|
||||
|
||||
out_empty:
|
||||
spin_unlock(&rdma->sc_recv_lock);
|
||||
|
||||
ctxt = svc_rdma_recv_ctxt_alloc(rdma);
|
||||
if (!ctxt)
|
||||
return NULL;
|
||||
@@ -218,11 +216,9 @@ void svc_rdma_recv_ctxt_put(struct svcxprt_rdma *rdma,
|
||||
for (i = 0; i < ctxt->rc_page_count; i++)
|
||||
put_page(ctxt->rc_pages[i]);
|
||||
|
||||
if (!ctxt->rc_temp) {
|
||||
spin_lock(&rdma->sc_recv_lock);
|
||||
list_add(&ctxt->rc_list, &rdma->sc_recv_ctxts);
|
||||
spin_unlock(&rdma->sc_recv_lock);
|
||||
} else
|
||||
if (!ctxt->rc_temp)
|
||||
llist_add(&ctxt->rc_node, &rdma->sc_recv_ctxts);
|
||||
else
|
||||
svc_rdma_recv_ctxt_destroy(rdma, ctxt);
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user