From 374d4ec2c154cbec0094f124f2173b685adbabd5 Mon Sep 17 00:00:00 2001 From: cinap_lenrek Date: Fri, 6 Mar 2015 16:16:45 +0100 Subject: [PATCH] devsd: always page align sd buffers sdbio() tests if it can pass the buffer pointer directly to the driver when it is already in kernel memory. we also need to check if the buffer is properly aligned but alignment requirement is handled in system specific sdmalloc() and was not known to devsd. to solve this, we *always* page align sd buffers and get rid of the system specific sdmalloc() macro (was only used in bcm kernel). --- sys/src/9/bcm/fns.h | 2 -- sys/src/9/port/devsd.c | 2 +- sys/src/9/port/sd.h | 9 ++------- 3 files changed, 3 insertions(+), 10 deletions(-) diff --git a/sys/src/9/bcm/fns.h b/sys/src/9/bcm/fns.h index f32132056..a9944a383 100644 --- a/sys/src/9/bcm/fns.h +++ b/sys/src/9/bcm/fns.h @@ -58,8 +58,6 @@ extern void procsave(Proc*); extern void procfork(Proc*); extern void procsetup(Proc*); extern void screeninit(void); -#define sdfree(p) free(p) -#define sdmalloc(n) mallocalign(n, CACHELINESZ, 0, 0) extern void setpower(int, int); extern void setr13(int, u32int*); extern int splfhi(void); diff --git a/sys/src/9/port/devsd.c b/sys/src/9/port/devsd.c index 6474a68f0..049338e90 100644 --- a/sys/src/9/port/devsd.c +++ b/sys/src/9/port/devsd.c @@ -843,7 +843,7 @@ sdbio(Chan* c, int write, char* a, long len, uvlong off) len = nb*unit->secsize - offset; hard = offset || write && len%unit->secsize; - if(iskaddr(a) && !hard) { + if(iskaddr(a) && ((uintptr)a & (BY2PG-1))==0 && !hard) { b = (uchar*)a; allocd = 0; }else{ diff --git a/sys/src/9/port/sd.h b/sys/src/9/port/sd.h index 97894f922..685d1c7c4 100644 --- a/sys/src/9/port/sd.h +++ b/sys/src/9/port/sd.h @@ -145,15 +145,10 @@ enum { }; /* - * Allow the default #defines for sdmalloc & sdfree to be overridden by - * system-specific versions. This can be used to avoid extra copying - * by making sure sd buffers are cache-aligned (some ARM systems) or - * page-aligned (xen) for DMA. + * Avoid extra copying by making sd buffers page-aligned for DMA. */ -#ifndef sdmalloc -#define sdmalloc(n) malloc(n) +#define sdmalloc(n) mallocalign(n, BY2PG, 0, 0) #define sdfree(p) free(p) -#endif /* * mmc/sd/sdio host controller interface