NFS: Optimise away the sigmask code in aio/dio reads and writes
There are no interruptible waits for asynchronous RPC tasks, so we don't need to wrap calls to rpc_run_task() with an rpc_clnt_sigmask/rpc_clnt_unsigmask pair. Instead we can wrap the wait_for_completion_interruptible() in nfs_direct_wait(). This means that we completely optimise away sigmask setting for the case of non-blocking aio/dio. Signed-off-by: Trond Myklebust <Trond.Myklebust@netapp.com>
This commit is contained in:
parent
34f5b4662b
commit
f3c391e89c
|
@ -188,12 +188,17 @@ static void nfs_direct_req_release(struct nfs_direct_req *dreq)
|
||||||
static ssize_t nfs_direct_wait(struct nfs_direct_req *dreq)
|
static ssize_t nfs_direct_wait(struct nfs_direct_req *dreq)
|
||||||
{
|
{
|
||||||
ssize_t result = -EIOCBQUEUED;
|
ssize_t result = -EIOCBQUEUED;
|
||||||
|
struct rpc_clnt *clnt;
|
||||||
|
sigset_t oldset;
|
||||||
|
|
||||||
/* Async requests don't wait here */
|
/* Async requests don't wait here */
|
||||||
if (dreq->iocb)
|
if (dreq->iocb)
|
||||||
goto out;
|
goto out;
|
||||||
|
|
||||||
|
clnt = NFS_CLIENT(dreq->inode);
|
||||||
|
rpc_clnt_sigmask(clnt, &oldset);
|
||||||
result = wait_for_completion_interruptible(&dreq->completion);
|
result = wait_for_completion_interruptible(&dreq->completion);
|
||||||
|
rpc_clnt_sigunmask(clnt, &oldset);
|
||||||
|
|
||||||
if (!result)
|
if (!result)
|
||||||
result = dreq->error;
|
result = dreq->error;
|
||||||
|
@ -403,9 +408,7 @@ static ssize_t nfs_direct_read(struct kiocb *iocb, const struct iovec *iov,
|
||||||
unsigned long nr_segs, loff_t pos)
|
unsigned long nr_segs, loff_t pos)
|
||||||
{
|
{
|
||||||
ssize_t result = 0;
|
ssize_t result = 0;
|
||||||
sigset_t oldset;
|
|
||||||
struct inode *inode = iocb->ki_filp->f_mapping->host;
|
struct inode *inode = iocb->ki_filp->f_mapping->host;
|
||||||
struct rpc_clnt *clnt = NFS_CLIENT(inode);
|
|
||||||
struct nfs_direct_req *dreq;
|
struct nfs_direct_req *dreq;
|
||||||
|
|
||||||
dreq = nfs_direct_req_alloc();
|
dreq = nfs_direct_req_alloc();
|
||||||
|
@ -417,11 +420,9 @@ static ssize_t nfs_direct_read(struct kiocb *iocb, const struct iovec *iov,
|
||||||
if (!is_sync_kiocb(iocb))
|
if (!is_sync_kiocb(iocb))
|
||||||
dreq->iocb = iocb;
|
dreq->iocb = iocb;
|
||||||
|
|
||||||
rpc_clnt_sigmask(clnt, &oldset);
|
|
||||||
result = nfs_direct_read_schedule_iovec(dreq, iov, nr_segs, pos);
|
result = nfs_direct_read_schedule_iovec(dreq, iov, nr_segs, pos);
|
||||||
if (!result)
|
if (!result)
|
||||||
result = nfs_direct_wait(dreq);
|
result = nfs_direct_wait(dreq);
|
||||||
rpc_clnt_sigunmask(clnt, &oldset);
|
|
||||||
nfs_direct_req_release(dreq);
|
nfs_direct_req_release(dreq);
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
|
@ -816,9 +817,7 @@ static ssize_t nfs_direct_write(struct kiocb *iocb, const struct iovec *iov,
|
||||||
size_t count)
|
size_t count)
|
||||||
{
|
{
|
||||||
ssize_t result = 0;
|
ssize_t result = 0;
|
||||||
sigset_t oldset;
|
|
||||||
struct inode *inode = iocb->ki_filp->f_mapping->host;
|
struct inode *inode = iocb->ki_filp->f_mapping->host;
|
||||||
struct rpc_clnt *clnt = NFS_CLIENT(inode);
|
|
||||||
struct nfs_direct_req *dreq;
|
struct nfs_direct_req *dreq;
|
||||||
size_t wsize = NFS_SERVER(inode)->wsize;
|
size_t wsize = NFS_SERVER(inode)->wsize;
|
||||||
int sync = NFS_UNSTABLE;
|
int sync = NFS_UNSTABLE;
|
||||||
|
@ -836,11 +835,9 @@ static ssize_t nfs_direct_write(struct kiocb *iocb, const struct iovec *iov,
|
||||||
if (!is_sync_kiocb(iocb))
|
if (!is_sync_kiocb(iocb))
|
||||||
dreq->iocb = iocb;
|
dreq->iocb = iocb;
|
||||||
|
|
||||||
rpc_clnt_sigmask(clnt, &oldset);
|
|
||||||
result = nfs_direct_write_schedule_iovec(dreq, iov, nr_segs, pos, sync);
|
result = nfs_direct_write_schedule_iovec(dreq, iov, nr_segs, pos, sync);
|
||||||
if (!result)
|
if (!result)
|
||||||
result = nfs_direct_wait(dreq);
|
result = nfs_direct_wait(dreq);
|
||||||
rpc_clnt_sigunmask(clnt, &oldset);
|
|
||||||
nfs_direct_req_release(dreq);
|
nfs_direct_req_release(dreq);
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
|
|
Loading…
Reference in New Issue