提交 e38b3f20 编写于 作者: N NeilBrown 提交者: Chuck Lever

SUNRPC: don't pause on incomplete allocation

alloc_pages_bulk_array() attempts to allocate at least one page based on
the provided pages, and then opportunistically allocates more if that
can be done without dropping the spinlock.

So if it returns fewer than requested, that could just mean that it
needed to drop the lock.  In that case, try again immediately.

Only pause for a time if no progress could be made.
Reported-and-tested-by: NMike Javorski <mike.javorski@gmail.com>
Reported-and-tested-by: NLothar Paltins <lopa@mailbox.org>
Fixes: f6e70aab ("SUNRPC: refresh rq_pages using a bulk page allocator")
Signed-off-by: NNeilBrown <neilb@suse.de>
Acked-by: NMel Gorman <mgorman@suse.com>
Signed-off-by: NChuck Lever <chuck.lever@oracle.com>
上级 0bcc7ca4
......@@ -663,7 +663,7 @@ static int svc_alloc_arg(struct svc_rqst *rqstp)
{
struct svc_serv *serv = rqstp->rq_server;
struct xdr_buf *arg = &rqstp->rq_arg;
unsigned long pages, filled;
unsigned long pages, filled, ret;
pagevec_init(&rqstp->rq_pvec);
......@@ -675,11 +675,12 @@ static int svc_alloc_arg(struct svc_rqst *rqstp)
pages = RPCSVC_MAXPAGES;
}
for (;;) {
filled = alloc_pages_bulk_array(GFP_KERNEL, pages,
rqstp->rq_pages);
if (filled == pages)
break;
for (filled = 0; filled < pages; filled = ret) {
ret = alloc_pages_bulk_array(GFP_KERNEL, pages,
rqstp->rq_pages);
if (ret > filled)
/* Made progress, don't sleep yet */
continue;
set_current_state(TASK_INTERRUPTIBLE);
if (signalled() || kthread_should_stop()) {
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册