Patch "SUNRPC: don't pause on incomplete allocation" has been added to the 5.14-stable tree

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



This is a note to let you know that I've just added the patch titled

    SUNRPC: don't pause on incomplete allocation

to the 5.14-stable tree which can be found at:
    http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary

The filename of the patch is:
     sunrpc-don-t-pause-on-incomplete-allocation.patch
and it can be found in the queue-5.14 subdirectory.

If you, or anyone else, feels it should not be added to the stable tree,
please let <stable@xxxxxxxxxxxxxxx> know about it.



commit 876f558a16517c62dd264a9c23c5a9ac95432722
Author: NeilBrown <neilb@xxxxxxx>
Date:   Mon Aug 30 08:36:34 2021 +1000

    SUNRPC: don't pause on incomplete allocation
    
    [ Upstream commit e38b3f20059426a0adbde014ff71071739ab5226 ]
    
    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: Mike Javorski <mike.javorski@xxxxxxxxx>
    Reported-and-tested-by: Lothar Paltins <lopa@xxxxxxxxxxx>
    Fixes: f6e70aab9dfe ("SUNRPC: refresh rq_pages using a bulk page allocator")
    Signed-off-by: NeilBrown <neilb@xxxxxxx>
    Acked-by: Mel Gorman <mgorman@xxxxxxxx>
    Signed-off-by: Chuck Lever <chuck.lever@xxxxxxxxxx>
    Signed-off-by: Sasha Levin <sashal@xxxxxxxxxx>

diff --git a/net/sunrpc/svc_xprt.c b/net/sunrpc/svc_xprt.c
index dbb41821b1b8..cd5a2b186f0d 100644
--- a/net/sunrpc/svc_xprt.c
+++ b/net/sunrpc/svc_xprt.c
@@ -662,7 +662,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;
 
 	pages = (serv->sv_max_mesg + 2 * PAGE_SIZE) >> PAGE_SHIFT;
 	if (pages > RPCSVC_MAXPAGES) {
@@ -672,11 +672,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()) {



[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Index of Archives]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux