* [PATCH] mm: Make {,set}page_address() static inline if WANT_PAGE_VIRTUAL
@ 2014-01-15 9:33 Geert Uytterhoeven
2014-01-15 9:46 ` Michael S. Tsirkin
` (2 more replies)
0 siblings, 3 replies; 5+ messages in thread
From: Geert Uytterhoeven @ 2014-01-15 9:33 UTC (permalink / raw)
To: Andrew Morton, Guenter Roeck, Michael S. Tsirkin
Cc: linux-mm, linux-bcache, Vineet Gupta, sparclinux, linux-m68k,
linux-kernel, Geert Uytterhoeven
{,set}page_address() are macros if WANT_PAGE_VIRTUAL.
If !WANT_PAGE_VIRTUAL, they're plain C functions.
If someone calls them with a void *, this pointer is auto-converted to
struct page * if !WANT_PAGE_VIRTUAL, but causes a build failure on
architectures using WANT_PAGE_VIRTUAL (arc, m68k and sparc):
drivers/md/bcache/bset.c: In function a??__btree_sorta??:
drivers/md/bcache/bset.c:1190: warning: dereferencing a??void *a?? pointer
drivers/md/bcache/bset.c:1190: error: request for member a??virtuala?? in something not a structure or union
Convert them to static inline functions to fix this. There are already
plenty of users of struct page members inside <linux/mm.h>, so there's no
reason to keep them as macros.
Signed-off-by: Geert Uytterhoeven <geert@linux-m68k.org>
---
http://kisskb.ellerman.id.au/kisskb/buildresult/10469287/ (m68k/next)
http://kisskb.ellerman.id.au/kisskb/buildresult/10469488/ (sparc64/next)
https://lkml.org/lkml/2014/1/13/1044 (m68k & sparc/3.10.27-stable)
include/linux/mm.h | 13 ++++++++-----
1 file changed, 8 insertions(+), 5 deletions(-)
diff --git a/include/linux/mm.h b/include/linux/mm.h
index 35527173cf50..9fac6dd69b11 100644
--- a/include/linux/mm.h
+++ b/include/linux/mm.h
@@ -846,11 +846,14 @@ static __always_inline void *lowmem_page_address(const struct page *page)
#endif
#if defined(WANT_PAGE_VIRTUAL)
-#define page_address(page) ((page)->virtual)
-#define set_page_address(page, address) \
- do { \
- (page)->virtual = (address); \
- } while(0)
+static inline void *page_address(const struct page *page)
+{
+ return page->virtual;
+}
+static inline void set_page_address(struct page *page, void *address)
+{
+ page->virtual = address;
+}
#define page_address_init() do { } while(0)
#endif
--
1.7.9.5
--
To unsubscribe, send a message with 'unsubscribe linux-mm' in
the body to majordomo@kvack.org. For more info on Linux MM,
see: http://www.linux-mm.org/ .
Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a>
^ permalink raw reply [flat|nested] 5+ messages in thread* Re: [PATCH] mm: Make {,set}page_address() static inline if WANT_PAGE_VIRTUAL
2014-01-15 9:33 [PATCH] mm: Make {,set}page_address() static inline if WANT_PAGE_VIRTUAL Geert Uytterhoeven
@ 2014-01-15 9:46 ` Michael S. Tsirkin
2014-01-15 10:31 ` Guenter Roeck
2014-01-15 22:57 ` David Rientjes
2 siblings, 0 replies; 5+ messages in thread
From: Michael S. Tsirkin @ 2014-01-15 9:46 UTC (permalink / raw)
To: Geert Uytterhoeven
Cc: Andrew Morton, Guenter Roeck, linux-mm, linux-bcache,
Vineet Gupta, sparclinux, linux-m68k, linux-kernel
On Wed, Jan 15, 2014 at 10:33:46AM +0100, Geert Uytterhoeven wrote:
> {,set}page_address() are macros if WANT_PAGE_VIRTUAL.
> If !WANT_PAGE_VIRTUAL, they're plain C functions.
>
> If someone calls them with a void *, this pointer is auto-converted to
> struct page * if !WANT_PAGE_VIRTUAL, but causes a build failure on
> architectures using WANT_PAGE_VIRTUAL (arc, m68k and sparc):
>
> drivers/md/bcache/bset.c: In function a??__btree_sorta??:
> drivers/md/bcache/bset.c:1190: warning: dereferencing a??void *a?? pointer
> drivers/md/bcache/bset.c:1190: error: request for member a??virtuala?? in something not a structure or union
>
> Convert them to static inline functions to fix this. There are already
> plenty of users of struct page members inside <linux/mm.h>, so there's no
> reason to keep them as macros.
>
> Signed-off-by: Geert Uytterhoeven <geert@linux-m68k.org>
FWIW
Acked-by: Michael S. Tsirkin <mst@redhat.com>
> ---
> http://kisskb.ellerman.id.au/kisskb/buildresult/10469287/ (m68k/next)
> http://kisskb.ellerman.id.au/kisskb/buildresult/10469488/ (sparc64/next)
> https://lkml.org/lkml/2014/1/13/1044 (m68k & sparc/3.10.27-stable)
>
> include/linux/mm.h | 13 ++++++++-----
> 1 file changed, 8 insertions(+), 5 deletions(-)
>
> diff --git a/include/linux/mm.h b/include/linux/mm.h
> index 35527173cf50..9fac6dd69b11 100644
> --- a/include/linux/mm.h
> +++ b/include/linux/mm.h
> @@ -846,11 +846,14 @@ static __always_inline void *lowmem_page_address(const struct page *page)
> #endif
>
> #if defined(WANT_PAGE_VIRTUAL)
> -#define page_address(page) ((page)->virtual)
> -#define set_page_address(page, address) \
> - do { \
> - (page)->virtual = (address); \
> - } while(0)
> +static inline void *page_address(const struct page *page)
> +{
> + return page->virtual;
> +}
> +static inline void set_page_address(struct page *page, void *address)
> +{
> + page->virtual = address;
> +}
> #define page_address_init() do { } while(0)
> #endif
>
> --
> 1.7.9.5
--
To unsubscribe, send a message with 'unsubscribe linux-mm' in
the body to majordomo@kvack.org. For more info on Linux MM,
see: http://www.linux-mm.org/ .
Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a>
^ permalink raw reply [flat|nested] 5+ messages in thread* Re: [PATCH] mm: Make {,set}page_address() static inline if WANT_PAGE_VIRTUAL
2014-01-15 9:33 [PATCH] mm: Make {,set}page_address() static inline if WANT_PAGE_VIRTUAL Geert Uytterhoeven
2014-01-15 9:46 ` Michael S. Tsirkin
@ 2014-01-15 10:31 ` Guenter Roeck
2014-01-15 22:57 ` David Rientjes
2 siblings, 0 replies; 5+ messages in thread
From: Guenter Roeck @ 2014-01-15 10:31 UTC (permalink / raw)
To: Geert Uytterhoeven, Andrew Morton, Michael S. Tsirkin
Cc: linux-mm, linux-bcache, Vineet Gupta, sparclinux, linux-m68k,
linux-kernel
On 01/15/2014 01:33 AM, Geert Uytterhoeven wrote:
> {,set}page_address() are macros if WANT_PAGE_VIRTUAL.
> If !WANT_PAGE_VIRTUAL, they're plain C functions.
>
> If someone calls them with a void *, this pointer is auto-converted to
> struct page * if !WANT_PAGE_VIRTUAL, but causes a build failure on
> architectures using WANT_PAGE_VIRTUAL (arc, m68k and sparc):
>
> drivers/md/bcache/bset.c: In function a??__btree_sorta??:
> drivers/md/bcache/bset.c:1190: warning: dereferencing a??void *a?? pointer
> drivers/md/bcache/bset.c:1190: error: request for member a??virtuala?? in something not a structure or union
>
> Convert them to static inline functions to fix this. There are already
> plenty of users of struct page members inside <linux/mm.h>, so there's no
> reason to keep them as macros.
>
> Signed-off-by: Geert Uytterhoeven <geert@linux-m68k.org>
Tested-by: Guenter Roeck <linux@roeck-us.net>
That also fixes the problem seen in stable-queue for 3.10 and 3.12,
so it may be a better fix for the problem seen there than the patch
provided by Michael.
Guenter
--
To unsubscribe, send a message with 'unsubscribe linux-mm' in
the body to majordomo@kvack.org. For more info on Linux MM,
see: http://www.linux-mm.org/ .
Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a>
^ permalink raw reply [flat|nested] 5+ messages in thread* Re: [PATCH] mm: Make {,set}page_address() static inline if WANT_PAGE_VIRTUAL
2014-01-15 9:33 [PATCH] mm: Make {,set}page_address() static inline if WANT_PAGE_VIRTUAL Geert Uytterhoeven
2014-01-15 9:46 ` Michael S. Tsirkin
2014-01-15 10:31 ` Guenter Roeck
@ 2014-01-15 22:57 ` David Rientjes
2014-01-15 23:02 ` Andrew Morton
2 siblings, 1 reply; 5+ messages in thread
From: David Rientjes @ 2014-01-15 22:57 UTC (permalink / raw)
To: Geert Uytterhoeven
Cc: Andrew Morton, Guenter Roeck, Michael S. Tsirkin, linux-mm,
linux-bcache, Vineet Gupta, sparclinux, linux-m68k, linux-kernel
[-- Attachment #1: Type: TEXT/PLAIN, Size: 1376 bytes --]
On Wed, 15 Jan 2014, Geert Uytterhoeven wrote:
> {,set}page_address() are macros if WANT_PAGE_VIRTUAL.
> If !WANT_PAGE_VIRTUAL, they're plain C functions.
>
> If someone calls them with a void *, this pointer is auto-converted to
> struct page * if !WANT_PAGE_VIRTUAL, but causes a build failure on
> architectures using WANT_PAGE_VIRTUAL (arc, m68k and sparc):
s/sparc/sparc64/
>
> drivers/md/bcache/bset.c: In function a??__btree_sorta??:
> drivers/md/bcache/bset.c:1190: warning: dereferencing a??void *a?? pointer
> drivers/md/bcache/bset.c:1190: error: request for member a??virtuala?? in something not a structure or union
>
> Convert them to static inline functions to fix this. There are already
> plenty of users of struct page members inside <linux/mm.h>, so there's no
> reason to keep them as macros.
>
> Signed-off-by: Geert Uytterhoeven <geert@linux-m68k.org>
Tested-by: David Rientjes <rientjes@google.com>
I'm cringing at the page_address(mempool_alloc(..., GFP_NOIO)) in
drivers/md/bcache/bset.c, though. It's relying on that fact that
mempool_alloc() can never return NULL if __GFP_WAIT but I think this could
have all been avoided with
struct page *page = mempool_alloc(state->pool, GFP_NOIO);
out = page_address(page);
instead of burying the mempool_alloc() in page_address() for what I think
is cleaner code. Owell, it fixes the issue.
^ permalink raw reply [flat|nested] 5+ messages in thread* Re: [PATCH] mm: Make {,set}page_address() static inline if WANT_PAGE_VIRTUAL
2014-01-15 22:57 ` David Rientjes
@ 2014-01-15 23:02 ` Andrew Morton
0 siblings, 0 replies; 5+ messages in thread
From: Andrew Morton @ 2014-01-15 23:02 UTC (permalink / raw)
To: David Rientjes
Cc: Geert Uytterhoeven, Guenter Roeck, Michael S. Tsirkin, linux-mm,
linux-bcache, Vineet Gupta, sparclinux, linux-m68k, linux-kernel
On Wed, 15 Jan 2014 14:57:56 -0800 (PST) David Rientjes <rientjes@google.com> wrote:
> On Wed, 15 Jan 2014, Geert Uytterhoeven wrote:
>
> > {,set}page_address() are macros if WANT_PAGE_VIRTUAL.
> > If !WANT_PAGE_VIRTUAL, they're plain C functions.
> >
> > If someone calls them with a void *, this pointer is auto-converted to
> > struct page * if !WANT_PAGE_VIRTUAL, but causes a build failure on
> > architectures using WANT_PAGE_VIRTUAL (arc, m68k and sparc):
>
> s/sparc/sparc64/
>
> >
> > drivers/md/bcache/bset.c: In function _____btree_sort___:
> > drivers/md/bcache/bset.c:1190: warning: dereferencing ___void *___ pointer
> > drivers/md/bcache/bset.c:1190: error: request for member ___virtual___ in something not a structure or union
> >
> > Convert them to static inline functions to fix this. There are already
> > plenty of users of struct page members inside <linux/mm.h>, so there's no
> > reason to keep them as macros.
> >
> > Signed-off-by: Geert Uytterhoeven <geert@linux-m68k.org>
>
> Tested-by: David Rientjes <rientjes@google.com>
>
> I'm cringing at the page_address(mempool_alloc(..., GFP_NOIO)) in
> drivers/md/bcache/bset.c, though.
Yes, I was staring suspiciously at that as well. Ended up deciding
that I wouldn't have coded it that way, but we should support the
casting.
> It's relying on that fact that
> mempool_alloc() can never return NULL if __GFP_WAIT but I think this could
> have all been avoided with
>
> struct page *page = mempool_alloc(state->pool, GFP_NOIO);
> out = page_address(page);
>
> instead of burying the mempool_alloc() in page_address() for what I think
> is cleaner code. Owell, it fixes the issue.
And that would make the later virt_to_page() unnecessary.
--
To unsubscribe, send a message with 'unsubscribe linux-mm' in
the body to majordomo@kvack.org. For more info on Linux MM,
see: http://www.linux-mm.org/ .
Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a>
^ permalink raw reply [flat|nested] 5+ messages in thread
end of thread, other threads:[~2014-01-16 16:20 UTC | newest]
Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2014-01-15 9:33 [PATCH] mm: Make {,set}page_address() static inline if WANT_PAGE_VIRTUAL Geert Uytterhoeven
2014-01-15 9:46 ` Michael S. Tsirkin
2014-01-15 10:31 ` Guenter Roeck
2014-01-15 22:57 ` David Rientjes
2014-01-15 23:02 ` Andrew Morton
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox