svn commit: r254150 - head/sys/vm

Alan Cox alc at rice.edu
Fri Aug 9 20:51:00 UTC 2013


On Aug 9, 2013, at 1:45 PM, John Baldwin wrote:

> On Friday, August 09, 2013 4:40:10 pm Alan Cox wrote:
>> 
>> On Aug 9, 2013, at 1:34 PM, Alan Cox wrote:
>> 
>>> 
>>> On Aug 9, 2013, at 12:56 PM, John Baldwin wrote:
>>> 
>>>> On Friday, August 09, 2013 12:43:50 pm David E. O'Brien wrote:
>>>>> Author: obrien
>>>>> Date: Fri Aug  9 16:43:50 2013
>>>>> New Revision: 254150
>>>>> URL: http://svnweb.freebsd.org/changeset/base/254150
>>>>> 
>>>>> Log:
>>>>> Add missing 'VPO_BUSY' from r254141 to fix kernel build break.
>>>>> 
>>>>> Modified:
>>>>> head/sys/vm/vm_page.h
>>>> 
>>>> This can't possibly be correct as r254138 just removed this flag.  If it 
> isn't 
>>>> obvious how to fix the uses added back in r254141, then r254141 should be 
>>>> reverted instead.
>>>> 
>>>> Hmm, looking at the relevant bits of r254141, it doesn't look obvious:
>>>> 
>>>> +       /* Detach the old page from the resident tailq. */
>>>> +       TAILQ_REMOVE(&object->memq, mold, listq);
>>>> +       vm_page_lock(mold);
>>> 
>>> Replace the next four lines with
>>> 
>>> 	vm_page_xunbusy(mold);
>>> 
>> 
>> On second thought, no, because it could lead to lock recursion.
> 
> What about this.  I think this matches the common idiom I've seen in
> other places.
> 
> Index: vm_page.c
> ===================================================================
> --- vm_page.c   (revision 254158)
> +++ vm_page.c   (working copy)
> @@ -1202,12 +1202,9 @@
>        /* Detach the old page from the resident tailq. */
>        TAILQ_REMOVE(&object->memq, mold, listq);
>        vm_page_lock(mold);
> -       if (mold->oflags & VPO_BUSY) {
> -               mold->oflags &= ~VPO_BUSY;
> -               vm_page_flash(mold);
> -       }
>        mold->object = NULL;
>        vm_page_unlock(mold);
> +       vm_page_xunbusy(mold);
> 
>        /* Insert the new page in the resident tailq. */
>        if (mpred != NULL)
> 
> 
> -- 

Index: vm/vm_page.c
===================================================================
--- vm/vm_page.c	(revision 254146)
+++ vm/vm_page.c	(working copy)
@@ -1174,6 +1174,8 @@ vm_page_prev(vm_page_t m)
 /*
  * Uses the page mnew as a replacement for an existing page at index
  * pindex which must be already present in the object.
+ *
+ * The existing page must not be on a paging queue.
  */
 vm_page_t
 vm_page_replace(vm_page_t mnew, vm_object_t object, vm_pindex_t pindex)
@@ -1198,16 +1200,14 @@ vm_page_replace(vm_page_t mnew, vm_object_t object
 	mnew->object = object;
 	mnew->pindex = pindex;
 	mold = vm_radix_replace(&object->rtree, mnew, pindex);
+	KASSERT(mold->queue == PQ_NONE,
+	    ("vm_page_replace: mold is on a paging queue"));
 
 	/* Detach the old page from the resident tailq. */
 	TAILQ_REMOVE(&object->memq, mold, listq);
-	vm_page_lock(mold);
-	if (mold->oflags & VPO_BUSY) {
-		mold->oflags &= ~VPO_BUSY;
-		vm_page_flash(mold);
-	}
+
 	mold->object = NULL;
-	vm_page_unlock(mold);
+	vm_page_xunbusy(mold);
 
 	/* Insert the new page in the resident tailq. */
 	if (mpred != NULL)



More information about the svn-src-all mailing list