git: 420e2f8a74df - main - vnode_pager: simplify loop, avoid overflow

From: Doug Moore <dougm_at_FreeBSD.org>
Date: Sun, 02 Mar 2025 08:14:22 UTC
The branch main has been updated by dougm:

URL: https://cgit.FreeBSD.org/src/commit/?id=420e2f8a74df4be1237244a4ef222d2ceae6823d

commit 420e2f8a74df4be1237244a4ef222d2ceae6823d
Author:     Doug Moore <dougm@FreeBSD.org>
AuthorDate: 2025-03-02 08:13:24 +0000
Commit:     Doug Moore <dougm@FreeBSD.org>
CommitDate: 2025-03-02 08:13:24 +0000

    vnode_pager: simplify loop, avoid overflow
    
    Filling in read-behind pages in vnode_pager_generic_getpages() is made
    very slightly simpler here, by avoiding overflowing the startpindex
    variable and then avoiding an extra test in the allocation loop that
    handles the overflow case.
    
    Reviewed by:    kib
    Differential Revision:  https://reviews.freebsd.org/D49200
---
 sys/vm/vnode_pager.c | 17 ++++++-----------
 1 file changed, 6 insertions(+), 11 deletions(-)

diff --git a/sys/vm/vnode_pager.c b/sys/vm/vnode_pager.c
index d5d312b3cf71..69509fe8948a 100644
--- a/sys/vm/vnode_pager.c
+++ b/sys/vm/vnode_pager.c
@@ -1045,18 +1045,13 @@ vnode_pager_generic_getpages(struct vnode *vp, vm_page_t *m, int count,
 		vm_page_t mpred, p;
 
 		VM_OBJECT_WLOCK(object);
-		startpindex = m[0]->pindex - rbehind;
-		if ((mpred = TAILQ_PREV(m[0], pglist, listq)) != NULL &&
-		    mpred->pindex >= startpindex)
-			startpindex = mpred->pindex + 1;
+		tpindex = m[0]->pindex;
+		startpindex = MAX(tpindex, rbehind) - rbehind;
+		if ((mpred = TAILQ_PREV(m[0], pglist, listq)) != NULL)
+			startpindex = MAX(startpindex, mpred->pindex + 1);
 
-		/*
-		 * tpindex is unsigned; beware of numeric underflow.
-		 * Stepping backward from pindex, mpred doesn't change.
-		 */
-		for (tpindex = m[0]->pindex - 1;
-		    tpindex >= startpindex && tpindex < m[0]->pindex;
-		    tpindex--, i++) {
+		/* Stepping backward from pindex, mpred doesn't change. */
+		for (; tpindex-- > startpindex; i++) {
 			p = vm_page_alloc_after(object, tpindex,
 			    VM_ALLOC_NORMAL, mpred);
 			if (p == NULL) {