On Mon, Aug 11, 2014 at 11:35:37AM -0500, Alan Cox wrote: > On 08/10/2014 11:59, Konstantin Belousov wrote: > > Author: kib > > Date: Sun Aug 10 16:59:39 2014 > > New Revision: 269782 > > URL: http://svnweb.freebsd.org/changeset/base/269782 > > > > Log: > > On sparc64, do not keep mappings for the destroyed sf_bufs. Sparc64 > > pmap, unlike i386, and similar to i386/xen pv, does not tolerate > > abandoned mappings for the freed pages. > > > > Reported and tested by: dumbbell > > Diagnosed and reviewed by: alc > > Sponsored by: The FreeBSD Foundation > > > This change fixes things on sparc64, but there is also an opportunity > here to make sf_buf operations much faster on newer sparc64 hardware. > If someone is interested in doing this, then please e-mail me. > Basically, if dcache_color_ignore is non-zero, then sparc64's direct map > can be used. It shouldn't be a difficult change.
The following patch should implement use of dcache_color_ignore, like hw_direct_map on powerpc aim. I did not found a way around the machine/tlb.h hack. The patch compiled on ppc64 and sparc64. diff --git a/sys/powerpc/include/vmparam.h b/sys/powerpc/include/vmparam.h index c46f395..965f8e4 100644 --- a/sys/powerpc/include/vmparam.h +++ b/sys/powerpc/include/vmparam.h @@ -210,5 +210,6 @@ struct pmap_physseg { #define SFBUF #define SFBUF_NOMD #define SFBUF_OPTIONAL_DIRECT_MAP hw_direct_map +#define SFBUF_PHYS_DMAP(x) (x) #endif /* _MACHINE_VMPARAM_H_ */ diff --git a/sys/sparc64/include/vmparam.h b/sys/sparc64/include/vmparam.h index 8e7d76c..cc97ade 100644 --- a/sys/sparc64/include/vmparam.h +++ b/sys/sparc64/include/vmparam.h @@ -241,5 +241,8 @@ extern vm_offset_t vm_max_kernel_address; #define SFBUF #define SFBUF_MAP +#define SFBUF_OPTIONAL_DIRECT_MAP dcache_color_ignore +#include <machine/tlb.h> +#define SFBUF_PHYS_DMAP(x) TLB_DIRECT_TO_PHYS(x) #endif /* !_MACHINE_VMPARAM_H_ */ diff --git a/sys/sys/sf_buf.h b/sys/sys/sf_buf.h index 8a6c56f..de164a1 100644 --- a/sys/sys/sf_buf.h +++ b/sys/sys/sf_buf.h @@ -112,7 +112,7 @@ sf_buf_kva(struct sf_buf *sf) { #ifdef SFBUF_OPTIONAL_DIRECT_MAP if (SFBUF_OPTIONAL_DIRECT_MAP) - return (VM_PAGE_TO_PHYS((vm_page_t)sf)); + return (SFBUF_PHYS_DMAP(VM_PAGE_TO_PHYS((vm_page_t)sf))); #endif return (sf->kva);
pgp6S9hGqgS2y.pgp
Description: PGP signature