Module Name:    src
Committed By:   skrll
Date:           Tue Dec 21 08:27:49 UTC 2021

Modified Files:
        src/sys/uvm: uvm_pglist.c

Log Message:
Update uvm_pglistalloc_[cs]_ps to return EINVAL if [low, high] doesn't
match any memory.

Useful for bus_dmamem_alloc where a tag might not cover any memory.
This will be used in an update to ehci.

"looks good" from chuq@


To generate a diff of this commit:
cvs rdiff -u -r1.89 -r1.90 src/sys/uvm/uvm_pglist.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sys/uvm/uvm_pglist.c
diff -u src/sys/uvm/uvm_pglist.c:1.89 src/sys/uvm/uvm_pglist.c:1.90
--- src/sys/uvm/uvm_pglist.c:1.89	Mon Dec 20 22:40:46 2021
+++ src/sys/uvm/uvm_pglist.c	Tue Dec 21 08:27:49 2021
@@ -1,4 +1,4 @@
-/*	$NetBSD: uvm_pglist.c,v 1.89 2021/12/20 22:40:46 skrll Exp $	*/
+/*	$NetBSD: uvm_pglist.c,v 1.90 2021/12/21 08:27:49 skrll Exp $	*/
 
 /*-
  * Copyright (c) 1997, 2019 The NetBSD Foundation, Inc.
@@ -35,7 +35,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: uvm_pglist.c,v 1.89 2021/12/20 22:40:46 skrll Exp $");
+__KERNEL_RCSID(0, "$NetBSD: uvm_pglist.c,v 1.90 2021/12/21 08:27:49 skrll Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -131,7 +131,7 @@ uvm_pglistalloc_c_ps(uvm_physseg_t psi, 
 	 */
 	if (high <= uvm_physseg_get_avail_start(psi) ||
 	    low >= uvm_physseg_get_avail_end(psi))
-		return 0;
+		return -1;
 
 	/*
 	 * We start our search at the just after where the last allocation
@@ -456,6 +456,7 @@ uvm_pglistalloc_contig(int num, paddr_t 
 
 	/* Default to "lose". */
 	error = ENOMEM;
+	bool valid = false;
 
 	/*
 	 * Block all memory allocation and lock the free list.
@@ -477,8 +478,12 @@ uvm_pglistalloc_contig(int num, paddr_t 
 			if (uvm_physseg_get_free_list(psi) != fl)
 				continue;
 
-			num -= uvm_pglistalloc_c_ps(psi, num, low, high,
-						    alignment, boundary, rlist);
+			int done = uvm_pglistalloc_c_ps(psi, num, low, high,
+			    alignment, boundary, rlist);
+			if (done >= 0) {
+				valid = true;
+				num -= done;
+			}
 			if (num == 0) {
 #ifdef PGALLOC_VERBOSE
 				printf("pgalloc: %"PRIxMAX"-%"PRIxMAX"\n",
@@ -490,6 +495,10 @@ uvm_pglistalloc_contig(int num, paddr_t 
 			}
 		}
 	}
+	if (!valid) {
+		uvm_pgfl_unlock();
+		return EINVAL;
+	}
 
 out:
 	uvm_pgfl_unlock();
@@ -534,7 +543,7 @@ uvm_pglistalloc_s_ps(uvm_physseg_t psi, 
 	 */
 	if (high <= uvm_physseg_get_avail_start(psi) ||
 	    low >= uvm_physseg_get_avail_end(psi))
-		return 0;
+		return -1;
 
 	todo = num;
 	candidate = uimax(low, uvm_physseg_get_avail_start(psi) +
@@ -609,6 +618,7 @@ uvm_pglistalloc_simple(int num, paddr_t 
 
 	/* Default to "lose". */
 	error = ENOMEM;
+	bool valid = false;
 
 again:
 	/*
@@ -632,7 +642,12 @@ again:
 			if (uvm_physseg_get_free_list(psi) != fl)
 				continue;
 
-			num -= uvm_pglistalloc_s_ps(psi, num, low, high, rlist);
+			int done = uvm_pglistalloc_s_ps(psi, num, low, high,
+                            rlist);
+			if (done >= 0) {
+				valid = true;
+				num -= done;
+			}
 			if (num == 0) {
 				error = 0;
 				goto out;
@@ -640,6 +655,10 @@ again:
 		}
 
 	}
+	if (!valid) {
+		uvm_pgfl_unlock();
+		return EINVAL;
+	}
 
 out:
 	/*

Reply via email to