Message ID | 1436329782-9179-11-git-send-email-yamada.masahiro@socionext.com |
---|---|
State | RFC |
Delegated to: | Simon Glass |
Headers | show |
Hello Masahiro, Am 08.07.2015 um 06:29 schrieb Masahiro Yamada: > It does not seem efficient to always return cache-aligned memory. > Return aligned memory only when GFP_DMA flag is given. > > My main motivation for this commit is to refactor device_probe() > and device_free() in the next commit. DM_FLAG_ALLOC_PRIV_DMA > should be handled more easily. > > Signed-off-by: Masahiro Yamada <yamada.masahiro@socionext.com> > --- > > include/linux/compat.h | 1 + > lib/linux_compat.c | 5 ++++- > 2 files changed, 5 insertions(+), 1 deletion(-) Hmm... I think there are a lot of places in code, where implicit is supposed, that kmalloc returns aligned memory ... so this patch needs testing (USB, DFU and ethernet coming in my mind) bye, Heiko > > diff --git a/include/linux/compat.h b/include/linux/compat.h > index 64988bf..8b7f8ef 100644 > --- a/include/linux/compat.h > +++ b/include/linux/compat.h > @@ -41,6 +41,7 @@ extern struct p_current *current; > #define GFP_NOFS ((gfp_t) 0) > #define GFP_USER ((gfp_t) 0) > #define __GFP_NOWARN ((gfp_t) 0) > +#define GFP_DMA ((__force gfp_t)0x01u) > #define __GFP_ZERO ((__force gfp_t)0x8000u) /* Return zeroed page on success */ > > void *kmalloc(size_t size, int flags); > diff --git a/lib/linux_compat.c b/lib/linux_compat.c > index a936a7e..6da0cfa 100644 > --- a/lib/linux_compat.c > +++ b/lib/linux_compat.c > @@ -18,7 +18,10 @@ void *kmalloc(size_t size, int flags) > { > void *p; > > - p = memalign(ARCH_DMA_MINALIGN, size); > + if (flags & GFP_DMA) > + p = memalign(ARCH_DMA_MINALIGN, size); > + else > + p = malloc(size); > if (flags & __GFP_ZERO) > memset(p, 0, size); > >
Hi Heiko, 2015-07-08 14:10 GMT+09:00 Heiko Schocher <hs@denx.de>: > Hello Masahiro, > > Am 08.07.2015 um 06:29 schrieb Masahiro Yamada: >> >> It does not seem efficient to always return cache-aligned memory. >> Return aligned memory only when GFP_DMA flag is given. >> >> My main motivation for this commit is to refactor device_probe() >> and device_free() in the next commit. DM_FLAG_ALLOC_PRIV_DMA >> should be handled more easily. >> >> Signed-off-by: Masahiro Yamada <yamada.masahiro@socionext.com> >> --- >> >> include/linux/compat.h | 1 + >> lib/linux_compat.c | 5 ++++- >> 2 files changed, 5 insertions(+), 1 deletion(-) > > > Hmm... I think there are a lot of places in code, where implicit > is supposed, that kmalloc returns aligned memory ... so this > patch needs testing (USB, DFU and ethernet coming in my mind) Right. I wonder why cache-alignment is enabled by default. Anybody who knows if it is also true for Linux?
diff --git a/include/linux/compat.h b/include/linux/compat.h index 64988bf..8b7f8ef 100644 --- a/include/linux/compat.h +++ b/include/linux/compat.h @@ -41,6 +41,7 @@ extern struct p_current *current; #define GFP_NOFS ((gfp_t) 0) #define GFP_USER ((gfp_t) 0) #define __GFP_NOWARN ((gfp_t) 0) +#define GFP_DMA ((__force gfp_t)0x01u) #define __GFP_ZERO ((__force gfp_t)0x8000u) /* Return zeroed page on success */ void *kmalloc(size_t size, int flags); diff --git a/lib/linux_compat.c b/lib/linux_compat.c index a936a7e..6da0cfa 100644 --- a/lib/linux_compat.c +++ b/lib/linux_compat.c @@ -18,7 +18,10 @@ void *kmalloc(size_t size, int flags) { void *p; - p = memalign(ARCH_DMA_MINALIGN, size); + if (flags & GFP_DMA) + p = memalign(ARCH_DMA_MINALIGN, size); + else + p = malloc(size); if (flags & __GFP_ZERO) memset(p, 0, size);
It does not seem efficient to always return cache-aligned memory. Return aligned memory only when GFP_DMA flag is given. My main motivation for this commit is to refactor device_probe() and device_free() in the next commit. DM_FLAG_ALLOC_PRIV_DMA should be handled more easily. Signed-off-by: Masahiro Yamada <yamada.masahiro@socionext.com> --- include/linux/compat.h | 1 + lib/linux_compat.c | 5 ++++- 2 files changed, 5 insertions(+), 1 deletion(-)