Page Menu
Home
FreeBSD
Search
Configure Global Search
Log In
Files
F137087890
D11942.diff
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Flag For Later
Award Token
Size
4 KB
Referenced Files
None
Subscribers
None
D11942.diff
View Options
Index: head/sys/kern/vfs_bio.c
===================================================================
--- head/sys/kern/vfs_bio.c
+++ head/sys/kern/vfs_bio.c
@@ -2746,7 +2746,7 @@
* deadlocks once allocbuf() is called after
* pages are vfs_busy_pages().
*/
- vm_page_grab_pages(obj,
+ (void)vm_page_grab_pages(obj,
OFF_TO_IDX(bp->b_offset) + bp->b_npages,
VM_ALLOC_SYSTEM | VM_ALLOC_IGN_SBUSY |
VM_ALLOC_NOBUSY | VM_ALLOC_WIRED,
Index: head/sys/sparc64/sparc64/pmap.c
===================================================================
--- head/sys/sparc64/sparc64/pmap.c
+++ head/sys/sparc64/sparc64/pmap.c
@@ -1248,7 +1248,7 @@
CPU_ZERO(&pm->pm_active);
VM_OBJECT_WLOCK(pm->pm_tsb_obj);
- vm_page_grab_pages(pm->pm_tsb_obj, 0, VM_ALLOC_NORMAL |
+ (void)vm_page_grab_pages(pm->pm_tsb_obj, 0, VM_ALLOC_NORMAL |
VM_ALLOC_NOBUSY | VM_ALLOC_WIRED | VM_ALLOC_ZERO, ma, TSB_PAGES);
VM_OBJECT_WUNLOCK(pm->pm_tsb_obj);
for (i = 0; i < TSB_PAGES; i++)
Index: head/sys/vm/vm_glue.c
===================================================================
--- head/sys/vm/vm_glue.c
+++ head/sys/vm/vm_glue.c
@@ -391,7 +391,7 @@
* page of stack.
*/
VM_OBJECT_WLOCK(ksobj);
- vm_page_grab_pages(ksobj, 0, VM_ALLOC_NORMAL | VM_ALLOC_NOBUSY |
+ (void)vm_page_grab_pages(ksobj, 0, VM_ALLOC_NORMAL | VM_ALLOC_NOBUSY |
VM_ALLOC_WIRED, ma, pages);
for (i = 0; i < pages; i++)
ma[i]->valid = VM_PAGE_BITS_ALL;
@@ -568,7 +568,7 @@
pages = td->td_kstack_pages;
ksobj = td->td_kstack_obj;
VM_OBJECT_WLOCK(ksobj);
- vm_page_grab_pages(ksobj, 0, VM_ALLOC_NORMAL | VM_ALLOC_WIRED, ma,
+ (void)vm_page_grab_pages(ksobj, 0, VM_ALLOC_NORMAL | VM_ALLOC_WIRED, ma,
pages);
for (int i = 0; i < pages;) {
int j, a, count, rv;
Index: head/sys/vm/vm_page.h
===================================================================
--- head/sys/vm/vm_page.h
+++ head/sys/vm/vm_page.h
@@ -419,7 +419,7 @@
#define VM_ALLOC_IGN_SBUSY 0x1000 /* (gp) Ignore shared busy flag */
#define VM_ALLOC_NODUMP 0x2000 /* (ag) don't include in dump */
#define VM_ALLOC_SBUSY 0x4000 /* (acgp) Shared busy the page */
-#define VM_ALLOC_NOWAIT 0x8000 /* (g) Do not sleep, return NULL */
+#define VM_ALLOC_NOWAIT 0x8000 /* (gp) Do not sleep */
#define VM_ALLOC_COUNT_SHIFT 16
#define VM_ALLOC_COUNT(count) ((count) << VM_ALLOC_COUNT_SHIFT)
@@ -470,7 +470,7 @@
vm_paddr_t boundary, vm_memattr_t memattr);
vm_page_t vm_page_alloc_freelist(int, int);
vm_page_t vm_page_grab (vm_object_t, vm_pindex_t, int);
-void vm_page_grab_pages(vm_object_t object, vm_pindex_t pindex, int allocflags,
+int vm_page_grab_pages(vm_object_t object, vm_pindex_t pindex, int allocflags,
vm_page_t *ma, int count);
int vm_page_try_to_free (vm_page_t);
void vm_page_deactivate (vm_page_t);
Index: head/sys/vm/vm_page.c
===================================================================
--- head/sys/vm/vm_page.c
+++ head/sys/vm/vm_page.c
@@ -3173,13 +3173,15 @@
* optional allocation flags:
* VM_ALLOC_IGN_SBUSY do not sleep on soft busy pages
* VM_ALLOC_NOBUSY do not exclusive busy the page
+ * VM_ALLOC_NOWAIT do not sleep
* VM_ALLOC_SBUSY set page to sbusy state
* VM_ALLOC_WIRED wire the pages
* VM_ALLOC_ZERO zero and validate any invalid pages
*
- * This routine may sleep.
+ * If VM_ALLOC_NOWAIT is not specified, this routine may sleep. Otherwise, it
+ * may return a partial prefix of the requested range.
*/
-void
+int
vm_page_grab_pages(vm_object_t object, vm_pindex_t pindex, int allocflags,
vm_page_t *ma, int count)
{
@@ -3197,7 +3199,7 @@
(allocflags & VM_ALLOC_IGN_SBUSY) != 0,
("vm_page_grab_pages: VM_ALLOC_SBUSY/IGN_SBUSY mismatch"));
if (count == 0)
- return;
+ return (0);
i = 0;
retrylookup:
m = vm_page_lookup(object, pindex + i);
@@ -3206,6 +3208,8 @@
sleep = (allocflags & VM_ALLOC_IGN_SBUSY) != 0 ?
vm_page_xbusied(m) : vm_page_busied(m);
if (sleep) {
+ if ((allocflags & VM_ALLOC_NOWAIT) != 0)
+ break;
/*
* Reference the page before unlocking and
* sleeping so that the page daemon is less
@@ -3233,6 +3237,8 @@
m = vm_page_alloc(object, pindex + i, (allocflags &
~VM_ALLOC_IGN_SBUSY) | VM_ALLOC_COUNT(count - i));
if (m == NULL) {
+ if ((allocflags & VM_ALLOC_NOWAIT) != 0)
+ break;
VM_OBJECT_WUNLOCK(object);
VM_WAIT;
VM_OBJECT_WLOCK(object);
@@ -3247,6 +3253,7 @@
ma[i] = m;
m = vm_page_next(m);
}
+ return (i);
}
/*
File Metadata
Details
Attached
Mime Type
text/plain
Expires
Sat, Nov 22, 3:02 AM (8 h, 27 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
25886661
Default Alt Text
D11942.diff (4 KB)
Attached To
Mode
D11942: Have vm_page_grab_pages() support VM_ALLOC_NOWAIT
Attached
Detach File
Event Timeline
Log In to Comment