Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 8 Jun 2009 16:56:46 +0400
From:      Stanislav Sedov <stas@FreeBSD.org>
To:        Rafal Jaworowski <raj@FreeBSD.org>
Cc:        svn-src-head@freebsd.org, svn-src-all@freebsd.org, src-committers@freebsd.org
Subject:   Re: svn commit: r193712 - head/sys/arm/arm
Message-ID:  <20090608165646.95bb577e.stas@FreeBSD.org>
In-Reply-To: <200906081215.n58CFdOl029049@svn.freebsd.org>
References:  <200906081215.n58CFdOl029049@svn.freebsd.org>

index | next in thread | previous in thread | raw e-mail

[-- Attachment #1 --]
On Mon, 8 Jun 2009 12:15:39 +0000 (UTC)
Rafal Jaworowski <raj@FreeBSD.org> mentioned:

> Author: raj
> Date: Mon Jun  8 12:15:39 2009
> New Revision: 193712
> URL: http://svn.freebsd.org/changeset/base/193712
> 
> Log:
>   Invalidate cache in pmap_remove_all() on ARM.
>   
>   When pages are removed from virtual address space by calling pmap_remove_all()
>   CPU caches were not invalidated, which led to read corruption when another
>   page got mapped at this same virtual address at later time (the CPU was
>   retrieving stale contents).
>   
>   Submitted by:	Piotr Ziecik
>   Obtained from:	Semihalf
> 
> Modified:
>   head/sys/arm/arm/pmap.c
> 
> Modified: head/sys/arm/arm/pmap.c
> ==============================================================================
> --- head/sys/arm/arm/pmap.c	Mon Jun  8 12:10:42 2009	(r193711)
> +++ head/sys/arm/arm/pmap.c	Mon Jun  8 12:15:39 2009	(r193712)
> @@ -3124,7 +3124,19 @@ pmap_remove_all(vm_page_t m)
>  		if (flush == FALSE && (pv->pv_pmap == curpm ||
>  		    pv->pv_pmap == pmap_kernel()))
>  			flush = TRUE;
> +
>  		PMAP_LOCK(pv->pv_pmap);
> +		/*
> +		 * Cached contents were written-back in pmap_remove_write(),
> +		 * but we still have to invalidate the cache entry to make
> +		 * sure stale data are not retrieved when another page will be
> +		 * mapped under this virtual address.
> +		 */
> +		if (pmap_is_current(pv->pv_pmap)) {
> +			cpu_dcache_inv_range(pv->pv_va, PAGE_SIZE);
> +			cpu_l2cache_inv_range(pv->pv_va, PAGE_SIZE);
> +		}
> +

Hi, Rafal!

What about calling the pmap_dcache_wb_range function for each mapping in
the cycle instead of calling cpu_XXX_inv_range functions directly?  I think
something like this would do the trick:
% pmap_dcache_wb_range(pv->pv_pmap, pv->pv_va, PAGE_SIZE, FALSE,
%     (pv->pv_flags & PVF_WRITE) == 0)

This will also take care of the writeback cache.  I don't know if it is really
needed, though.

-- 
Stanislav Sedov
ST4096-RIPE

[-- Attachment #2 --]
-----BEGIN PGP SIGNATURE-----

iQIcBAEBAgAGBQJKLQqTAAoJEKN82nOYvCd01lgP+wTnTAivy40PR/53O7dOtThv
BOnvAKhJ+mLZbTiCdcBBMvXlSZ7CK6+wjGcvEEb2cSwz1unEhvf7aB9FL+J6zo3z
lCF6jKJukA8gQUei2nRr7UfBuqiAiRr6zcQAajKMmQsfBKR4LUZaL55iXBrsR7Tu
33a9pGbAenSiQs+kSt/5dKaTb6zlWCbSx5EznNMQYsYNUl1mY6c4vvYF8UXDQACC
WHQQgxQVNWWNzwKOqSQzXyeVZu6hD3CLuxnKeJy6USbfBa+gMIjrgQDdgGsl06W3
oK9NzdqVgTtOReWga/y8/tRzM1nZbQHEXXYSS6Iwd9Uf8Jf8tlHoMUP/1ja8vB5o
qkF0tuEkEae5Og4sHuODDnB9TpXxRSUiiBQ+8glRQsGc6gTnuktudhcnqszUHSYn
h/aDkx2waGuOgVmpLcvyfQVpU52HEw1ZxbMo0+fR/T9qkeJxRs746qYBGDuTwdER
ZGNlr90gbjdv4YJuwSCxBhhK30Az4RPPdNGeIta6Y/tlU7X4M5ShLw6/Sf/QnwCI
2290bPza9V6z3en97g02YVRhnNe2ziILSIr8jxGTeqI97DAuvnQCGCdKpTsoIvHt
AG1HsP845CWnNBK6b+8emXZb+NolgcmNkveGJtUICu9tT3cL6g/Zbx+B7fGmo/jO
L1E2UiuyM/pv3d5JVXjM
=bmU6
-----END PGP SIGNATURE-----
help

Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20090608165646.95bb577e.stas>