mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/next/linux-next.git
synced 2025-01-06 05:02:31 +00:00
svcrdma: Add an async version of svc_rdma_write_info_free()
DMA unmapping can take quite some time, so it should not be handled in a single-threaded completion handler. Defer releasing write_info structs to the recently-added workqueue. With this patch, DMA unmapping can be handled in parallel, and it does not cause head-of-queue blocking of Write completions. Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
This commit is contained in:
parent
ae225fe27b
commit
f09c36c8df
@ -227,6 +227,7 @@ struct svc_rdma_write_info {
|
||||
unsigned int wi_next_off;
|
||||
|
||||
struct svc_rdma_chunk_ctxt wi_cc;
|
||||
struct work_struct wi_work;
|
||||
};
|
||||
|
||||
static struct svc_rdma_write_info *
|
||||
@ -248,12 +249,21 @@ svc_rdma_write_info_alloc(struct svcxprt_rdma *rdma,
|
||||
return info;
|
||||
}
|
||||
|
||||
static void svc_rdma_write_info_free(struct svc_rdma_write_info *info)
|
||||
static void svc_rdma_write_info_free_async(struct work_struct *work)
|
||||
{
|
||||
struct svc_rdma_write_info *info;
|
||||
|
||||
info = container_of(work, struct svc_rdma_write_info, wi_work);
|
||||
svc_rdma_cc_release(&info->wi_cc, DMA_TO_DEVICE);
|
||||
kfree(info);
|
||||
}
|
||||
|
||||
static void svc_rdma_write_info_free(struct svc_rdma_write_info *info)
|
||||
{
|
||||
INIT_WORK(&info->wi_work, svc_rdma_write_info_free_async);
|
||||
queue_work(svcrdma_wq, &info->wi_work);
|
||||
}
|
||||
|
||||
/**
|
||||
* svc_rdma_write_done - Write chunk completion
|
||||
* @cq: controlling Completion Queue
|
||||
|
Loading…
Reference in New Issue
Block a user