Module Name:    src
Committed By:   ad
Date:           Sun May 24 19:46:59 UTC 2020

Modified Files:
        src/sys/uvm: uvm_page.c uvm_page.h

Log Message:
Add uvm_pagewanted_p(): return true if someone is waiting on the page and
assert caller has correct lock to observe that.


To generate a diff of this commit:
cvs rdiff -u -r1.237 -r1.238 src/sys/uvm/uvm_page.c
cvs rdiff -u -r1.103 -r1.104 src/sys/uvm/uvm_page.h

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_page.c
diff -u src/sys/uvm/uvm_page.c:1.237 src/sys/uvm/uvm_page.c:1.238
--- src/sys/uvm/uvm_page.c:1.237	Tue May 19 20:46:39 2020
+++ src/sys/uvm/uvm_page.c	Sun May 24 19:46:59 2020
@@ -1,4 +1,4 @@
-/*	$NetBSD: uvm_page.c,v 1.237 2020/05/19 20:46:39 ad Exp $	*/
+/*	$NetBSD: uvm_page.c,v 1.238 2020/05/24 19:46:59 ad Exp $	*/
 
 /*-
  * Copyright (c) 2019, 2020 The NetBSD Foundation, Inc.
@@ -95,7 +95,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: uvm_page.c,v 1.237 2020/05/19 20:46:39 ad Exp $");
+__KERNEL_RCSID(0, "$NetBSD: uvm_page.c,v 1.238 2020/05/24 19:46:59 ad Exp $");
 
 #include "opt_ddb.h"
 #include "opt_uvm.h"
@@ -1718,8 +1718,8 @@ uvm_pagewait(struct vm_page *pg, krwlock
 	KASSERT(uvm_page_owner_locked_p(pg, false));
 
 	mutex_enter(&pg->interlock);
-	rw_exit(lock);
 	pg->pqflags |= PQ_WANTED;
+	rw_exit(lock);
 	UVM_UNLOCK_AND_WAIT(pg, &pg->interlock, false, wmesg, 0);
 }
 
@@ -1744,6 +1744,21 @@ uvm_pagewakeup(struct vm_page *pg)
 	}
 }
 
+/*
+ * uvm_pagewanted_p: return true if someone is waiting on the page
+ *
+ * => object must be write locked (lock out all concurrent access)
+ */
+
+bool
+uvm_pagewanted_p(struct vm_page *pg)
+{
+
+	KASSERT(uvm_page_owner_locked_p(pg, true));
+
+	return (atomic_load_relaxed(&pg->pqflags) & PQ_WANTED) != 0;
+}
+
 #if defined(UVM_PAGE_TRKOWN)
 /*
  * uvm_page_own: set or release page ownership

Index: src/sys/uvm/uvm_page.h
diff -u src/sys/uvm/uvm_page.h:1.103 src/sys/uvm/uvm_page.h:1.104
--- src/sys/uvm/uvm_page.h:1.103	Sun May 17 19:38:17 2020
+++ src/sys/uvm/uvm_page.h	Sun May 24 19:46:59 2020
@@ -1,4 +1,4 @@
-/*	$NetBSD: uvm_page.h,v 1.103 2020/05/17 19:38:17 ad Exp $	*/
+/*	$NetBSD: uvm_page.h,v 1.104 2020/05/24 19:46:59 ad Exp $	*/
 
 /*
  * Copyright (c) 1997 Charles D. Cranor and Washington University.
@@ -378,6 +378,7 @@ bool uvm_pagecheckdirty(struct vm_page *
 bool uvm_pagereadonly_p(struct vm_page *);
 bool uvm_page_locked_p(struct vm_page *);
 void uvm_pagewakeup(struct vm_page *);
+bool uvm_pagewanted_p(struct vm_page *);
 void uvm_pagewait(struct vm_page *, krwlock_t *, const char *);
 
 int uvm_page_lookup_freelist(struct vm_page *);

Reply via email to