From owner-p4-projects@FreeBSD.ORG Mon Jul 2 16:12:42 2012 Return-Path: Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id 5CC2B1065670; Mon, 2 Jul 2012 16:12:42 +0000 (UTC) Delivered-To: perforce@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 072E5106564A for ; Mon, 2 Jul 2012 16:12:42 +0000 (UTC) (envelope-from jhb@freebsd.org) Received: from skunkworks.freebsd.org (skunkworks.freebsd.org [IPv6:2001:4f8:fff6::2d]) by mx1.freebsd.org (Postfix) with ESMTP id DE6948FC0A for ; Mon, 2 Jul 2012 16:12:41 +0000 (UTC) Received: from skunkworks.freebsd.org (localhost [127.0.0.1]) by skunkworks.freebsd.org (8.14.4/8.14.4) with ESMTP id q62GCf5Q066301 for ; Mon, 2 Jul 2012 16:12:41 GMT (envelope-from jhb@freebsd.org) Received: (from perforce@localhost) by skunkworks.freebsd.org (8.14.4/8.14.4/Submit) id q62GCf8L066298 for perforce@freebsd.org; Mon, 2 Jul 2012 16:12:41 GMT (envelope-from jhb@freebsd.org) Date: Mon, 2 Jul 2012 16:12:41 GMT Message-Id: <201207021612.q62GCf8L066298@skunkworks.freebsd.org> X-Authentication-Warning: skunkworks.freebsd.org: perforce set sender to jhb@freebsd.org using -f From: John Baldwin To: Perforce Change Reviews Precedence: bulk Cc: Subject: PERFORCE change 213780 for review X-BeenThere: p4-projects@freebsd.org X-Mailman-Version: 2.1.5 List-Id: p4 projects tree changes List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 02 Jul 2012 16:12:42 -0000 http://p4web.freebsd.org/@@213780?ac=10 Change 213780 by jhb@jhb_jhbbsd on 2012/07/02 16:12:25 An experimental patch to let threads blocking on low memory during page faults lend priority to pagedaemon. Affected files ... .. //depot/projects/smpng/sys/vm/vm_page.c#128 edit .. //depot/projects/smpng/sys/vm/vm_pageout.c#90 edit .. //depot/projects/smpng/sys/vm/vm_pageout.h#22 edit Differences ... ==== //depot/projects/smpng/sys/vm/vm_page.c#128 (text+ko) ==== @@ -1866,6 +1866,7 @@ vm_pages_needed = 1; wakeup(&vm_pages_needed); } + pagedaemon_lendprio(); msleep(&cnt.v_free_count, &vm_page_queue_free_mtx, PDROP | PVM, "vmwait", 0); } @@ -1890,6 +1891,7 @@ vm_pages_needed = 1; wakeup(&vm_pages_needed); } + pagedaemon_lendprio(); msleep(&cnt.v_free_count, &vm_page_queue_free_mtx, PDROP | PUSER, "pfault", 0); } @@ -2340,7 +2342,7 @@ (object->type == OBJT_SWAP && !vm_pager_has_page(object, m->pindex, NULL, NULL))) { /* - * Hypothesis: A cache-elgible page belonging to a + * Hypothesis: A cache-eligible page belonging to a * default object or swap object but without a backing * store must be zero filled. */ ==== //depot/projects/smpng/sys/vm/vm_pageout.c#90 (text+ko) ==== @@ -116,6 +116,7 @@ static void vm_pageout_scan(int pass); struct proc *pageproc; +static struct thread *pagethread; static struct kproc_desc page_kp = { "pagedaemon", @@ -1558,6 +1559,7 @@ if (vm_pageout_full_stats_interval == 0) vm_pageout_full_stats_interval = vm_pageout_stats_interval * 4; + pagethread = curthread; swap_pager_swap_init(); pass = 0; /* @@ -1574,7 +1576,13 @@ if (vm_pages_needed && !vm_page_count_min()) { if (!vm_paging_needed()) vm_pages_needed = 0; + critical_enter(); + thread_lock(pagethread); + if (pagethread->td_flags & TDF_BORROWING) + sched_unlend_prio(pagethread, PRI_MAX); + thread_unlock(pagethread); wakeup(&cnt.v_free_count); + critical_exit(); } if (vm_pages_needed) { /* @@ -1614,6 +1622,22 @@ } /* + * Called by threads blocking on pagedaemon to lend their priority to + * pagedaemon while waiting for it to free pages. + */ +void +pagedaemon_lendprio(void) +{ + + if (curthread != pagethread) { + thread_lock(pagethread); + if (pagethread->td_priority > curthread->td_priority) + sched_lend_prio(pagethread, curthread->td_priority); + thread_unlock(pagethread); + } +} + +/* * Unless the free page queue lock is held by the caller, this function * should be regarded as advisory. Specifically, the caller should * not msleep() on &cnt.v_free_count following this function unless ==== //depot/projects/smpng/sys/vm/vm_pageout.h#22 (text+ko) ==== @@ -94,6 +94,7 @@ * Signal pageout-daemon and wait for it. */ +void pagedaemon_lendprio(void); extern void pagedaemon_wakeup(void); #define VM_WAIT vm_wait() #define VM_WAITPFAULT vm_waitpfault()