|
@@ -849,14 +849,17 @@ static void rpc_async_schedule(struct work_struct *work)
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
- * rpc_malloc - allocate an RPC buffer
|
|
|
- * @task: RPC task that will use this buffer
|
|
|
- * @size: requested byte size
|
|
|
+ * rpc_malloc - allocate RPC buffer resources
|
|
|
+ * @task: RPC task
|
|
|
+ *
|
|
|
+ * A single memory region is allocated, which is split between the
|
|
|
+ * RPC call and RPC reply that this task is being used for. When
|
|
|
+ * this RPC is retired, the memory is released by calling rpc_free.
|
|
|
*
|
|
|
* To prevent rpciod from hanging, this allocator never sleeps,
|
|
|
- * returning NULL and suppressing warning if the request cannot be serviced
|
|
|
- * immediately.
|
|
|
- * The caller can arrange to sleep in a way that is safe for rpciod.
|
|
|
+ * returning -ENOMEM and suppressing warning if the request cannot
|
|
|
+ * be serviced immediately. The caller can arrange to sleep in a
|
|
|
+ * way that is safe for rpciod.
|
|
|
*
|
|
|
* Most requests are 'small' (under 2KiB) and can be serviced from a
|
|
|
* mempool, ensuring that NFS reads and writes can always proceed,
|
|
@@ -865,8 +868,10 @@ static void rpc_async_schedule(struct work_struct *work)
|
|
|
* In order to avoid memory starvation triggering more writebacks of
|
|
|
* NFS requests, we avoid using GFP_KERNEL.
|
|
|
*/
|
|
|
-void *rpc_malloc(struct rpc_task *task, size_t size)
|
|
|
+int rpc_malloc(struct rpc_task *task)
|
|
|
{
|
|
|
+ struct rpc_rqst *rqst = task->tk_rqstp;
|
|
|
+ size_t size = rqst->rq_callsize + rqst->rq_rcvsize;
|
|
|
struct rpc_buffer *buf;
|
|
|
gfp_t gfp = GFP_NOIO | __GFP_NOWARN;
|
|
|
|
|
@@ -880,12 +885,13 @@ void *rpc_malloc(struct rpc_task *task, size_t size)
|
|
|
buf = kmalloc(size, gfp);
|
|
|
|
|
|
if (!buf)
|
|
|
- return NULL;
|
|
|
+ return -ENOMEM;
|
|
|
|
|
|
buf->len = size;
|
|
|
dprintk("RPC: %5u allocated buffer of size %zu at %p\n",
|
|
|
task->tk_pid, size, buf);
|
|
|
- return &buf->data;
|
|
|
+ rqst->rq_buffer = buf->data;
|
|
|
+ return 0;
|
|
|
}
|
|
|
EXPORT_SYMBOL_GPL(rpc_malloc);
|
|
|
|