Re: Race in pagevec_strip?

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Thu, 16 Mar 2006, Christoph Lameter wrote:
> Sigh. TestSetPackLocked works just opposite of spin_trylock. So add an !
> 
> 
> Seems that we can call try_to_release_page with PagePrivate off and a 
> valid mapping? This may cause all sorts of trouble for the 
> filesystem *_releasepage() handlers. XFS bombs out in that case.

I think you're right, and you are consistent with the sequence when
try_to_release_page is called from elsewhere.

But the last time I had anything to do with try_to_release_page was
way back in 2.5.mid, I don't think there was a pagevec_strip then.
Andrew will know better.

I can't see what protects the default drop_buffers case against this,
so can't argue that it's an XFS problem.

But wouldn't you, on balance, be better off repeating the
PagePrivate test within the lock?

		if (PagePrivate(page) && !TestSetPageLocked(page)) {
			if (PagePrivate(page))
				try_to_release_page(page, 0);
			unlock_page(page);
		}

>  
> Lock the page before checking for page private.
>  
> Signed-off-by: Christoph Lameter <[email protected]>
> 
> Index: linux-2.6.16-rc6/mm/swap.c
> ===================================================================
> --- linux-2.6.16-rc6.orig/mm/swap.c	2006-03-11 14:12:55.000000000 -0800
> +++ linux-2.6.16-rc6/mm/swap.c	2006-03-16 10:15:23.000000000 -0800
> @@ -392,8 +392,9 @@ void pagevec_strip(struct pagevec *pvec)
>  	for (i = 0; i < pagevec_count(pvec); i++) {
>  		struct page *page = pvec->pages[i];
>  
> -		if (PagePrivate(page) && !TestSetPageLocked(page)) {
> -			try_to_release_page(page, 0);
> +		if (!TestSetPageLocked(page)) {
> +			if (PagePrivate(page))
> +				try_to_release_page(page, 0);
>  			unlock_page(page);
>  		}
>  	}
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to [email protected]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

[Index of Archives]     [Kernel Newbies]     [Netfilter]     [Bugtraq]     [Photo]     [Stuff]     [Gimp]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Video 4 Linux]     [Linux for the blind]     [Linux Resources]
  Powered by Linux