summaryrefslogtreecommitdiffstats
path: root/sys/vm
diff options
context:
space:
mode:
authorkib <kib@FreeBSD.org>2010-07-05 21:13:32 +0000
committerkib <kib@FreeBSD.org>2010-07-05 21:13:32 +0000
commit15a394fbbad37497967f317055562bc99c9e78a3 (patch)
tree3e3d325673e269e1bed29f2e51cf834666ce009b /sys/vm
parent3b22f10bbd3187c095080cca20c4a8c47a3973b0 (diff)
downloadFreeBSD-src-15a394fbbad37497967f317055562bc99c9e78a3.zip
FreeBSD-src-15a394fbbad37497967f317055562bc99c9e78a3.tar.gz
Add the ability for the allocflag argument of the vm_page_grab() to
specify the increment of vm_pageout_deficit when sleeping due to page shortage. Then, in allocbuf(), the code to allocate pages when extending vmio buffer can be replaced by a call to vm_page_grab(). Suggested and reviewed by: alc MFC after: 2 weeks
Diffstat (limited to 'sys/vm')
-rw-r--r--sys/vm/vm_page.c10
-rw-r--r--sys/vm/vm_page.h5
2 files changed, 13 insertions, 2 deletions
diff --git a/sys/vm/vm_page.c b/sys/vm/vm_page.c
index 6659e76..810338d 100644
--- a/sys/vm/vm_page.c
+++ b/sys/vm/vm_page.c
@@ -2038,11 +2038,13 @@ vm_page_t
vm_page_grab(vm_object_t object, vm_pindex_t pindex, int allocflags)
{
vm_page_t m;
+ u_int count;
VM_OBJECT_LOCK_ASSERT(object, MA_OWNED);
retrylookup:
if ((m = vm_page_lookup(object, pindex)) != NULL) {
- if ((m->oflags & VPO_BUSY) != 0 || m->busy != 0) {
+ if ((m->oflags & VPO_BUSY) != 0 ||
+ ((allocflags & VM_ALLOC_IGN_SBUSY) == 0 && m->busy != 0)) {
if ((allocflags & VM_ALLOC_RETRY) != 0) {
/*
* Reference the page before unlocking and
@@ -2067,9 +2069,13 @@ retrylookup:
return (m);
}
}
- m = vm_page_alloc(object, pindex, allocflags & ~VM_ALLOC_RETRY);
+ m = vm_page_alloc(object, pindex, allocflags & ~(VM_ALLOC_RETRY |
+ VM_ALLOC_IGN_SBUSY | VM_ALLOC_COUNT_MASK));
if (m == NULL) {
VM_OBJECT_UNLOCK(object);
+ count = (u_int)allocflags >> VM_ALLOC_COUNT_SHIFT;
+ if (count > 0)
+ atomic_add_int(&vm_pageout_deficit, count);
VM_WAIT;
VM_OBJECT_LOCK(object);
if ((allocflags & VM_ALLOC_RETRY) == 0)
diff --git a/sys/vm/vm_page.h b/sys/vm/vm_page.h
index 1b2f39a..0829025 100644
--- a/sys/vm/vm_page.h
+++ b/sys/vm/vm_page.h
@@ -317,6 +317,11 @@ extern struct vpglocks vm_page_queue_lock;
#define VM_ALLOC_NOBUSY 0x0200 /* Do not busy the page */
#define VM_ALLOC_IFCACHED 0x0400 /* Fail if the page is not cached */
#define VM_ALLOC_IFNOTCACHED 0x0800 /* Fail if the page is cached */
+#define VM_ALLOC_IGN_SBUSY 0x1000 /* vm_page_grab() only */
+
+#define VM_ALLOC_COUNT_SHIFT 16
+#define VM_ALLOC_COUNT(count) ((count) << VM_ALLOC_COUNT_SHIFT)
+#define VM_ALLOC_COUNT_MASK VM_ALLOC_COUNT(0xffff)
void vm_page_flag_set(vm_page_t m, unsigned short bits);
void vm_page_flag_clear(vm_page_t m, unsigned short bits);
OpenPOWER on IntegriCloud