All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH 1/1] mm/vmalloc: Make vmalloc_32_user() align base kernel virtual address to SHMLBA
@ 2019-01-08 11:09 ` Roman Penyaev
  0 siblings, 0 replies; 5+ messages in thread
From: Roman Penyaev @ 2019-01-08 11:09 UTC (permalink / raw)
  Cc: Roman Penyaev, Andrew Morton, Stephen Rothwell, Michal Hocko,
	David S . Miller, Peter Zijlstra, linux-mm, linux-kernel

This patch repeats the original one from David S. Miller:

  2dca6999eed5 ("mm, perf_event: Make vmalloc_user() align base kernel virtual address to SHMLBA")

but for missed vmalloc_32_user() case, which also requires correct
alignment of virtual address on kernel side to avoid D-caches
aliases.  A bit of copy-paste from original patch to recover in
memory of what is all about:

  When a vmalloc'd area is mmap'd into userspace, some kind of
  co-ordination is necessary for this to work on platforms with cpu
  D-caches which can have aliases.

  Otherwise kernel side writes won't be seen properly in userspace
  and vice versa.

  If the kernel side mapping and the user side one have the same
  alignment, modulo SHMLBA, this can work as long as VM_SHARED is
  shared of VMA and for all current users this is true.  VM_SHARED
  will force SHMLBA alignment of the user side mmap on platforms with
  D-cache aliasing matters.

  David S. Miller

Signed-off-by: Roman Penyaev <rpenyaev@suse.de>
Cc: Andrew Morton <akpm@linux-foundation.org>
Cc: Stephen Rothwell <sfr@canb.auug.org.au>
Cc: Michal Hocko <mhocko@suse.com>
Cc: David S. Miller <davem@davemloft.net>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: linux-mm@kvack.org
Cc: linux-kernel@vger.kernel.org
---
 mm/vmalloc.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/mm/vmalloc.c b/mm/vmalloc.c
index 50b17c745149..e83961767dc1 100644
--- a/mm/vmalloc.c
+++ b/mm/vmalloc.c
@@ -1971,7 +1971,7 @@ EXPORT_SYMBOL(vmalloc_32);
  */
 void *vmalloc_32_user(unsigned long size)
 {
-	return __vmalloc_node_range(size, 1,  VMALLOC_START, VMALLOC_END,
+	return __vmalloc_node_range(size, SHMLBA,  VMALLOC_START, VMALLOC_END,
 				    GFP_VMALLOC32 | __GFP_ZERO, PAGE_KERNEL,
 				    VM_USERMAP, NUMA_NO_NODE,
 				    __builtin_return_address(0));
-- 
2.19.1


^ permalink raw reply	[flat|nested] 5+ messages in thread

* [PATCH 1/1] mm/vmalloc: Make vmalloc_32_user() align base kernel virtual address to SHMLBA
@ 2019-01-08 11:09 ` Roman Penyaev
  0 siblings, 0 replies; 5+ messages in thread
From: Roman Penyaev @ 2019-01-08 11:09 UTC (permalink / raw)
  Cc: Roman Penyaev, Andrew Morton, Stephen Rothwell, Michal Hocko,
	David S . Miller, Peter Zijlstra, linux-mm, linux-kernel

This patch repeats the original one from David S. Miller:

  2dca6999eed5 ("mm, perf_event: Make vmalloc_user() align base kernel virtual address to SHMLBA")

but for missed vmalloc_32_user() case, which also requires correct
alignment of virtual address on kernel side to avoid D-caches
aliases.  A bit of copy-paste from original patch to recover in
memory of what is all about:

  When a vmalloc'd area is mmap'd into userspace, some kind of
  co-ordination is necessary for this to work on platforms with cpu
  D-caches which can have aliases.

  Otherwise kernel side writes won't be seen properly in userspace
  and vice versa.

  If the kernel side mapping and the user side one have the same
  alignment, modulo SHMLBA, this can work as long as VM_SHARED is
  shared of VMA and for all current users this is true.  VM_SHARED
  will force SHMLBA alignment of the user side mmap on platforms with
  D-cache aliasing matters.

  David S. Miller

Signed-off-by: Roman Penyaev <rpenyaev@suse.de>
Cc: Andrew Morton <akpm@linux-foundation.org>
Cc: Stephen Rothwell <sfr@canb.auug.org.au>
Cc: Michal Hocko <mhocko@suse.com>
Cc: David S. Miller <davem@davemloft.net>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: linux-mm@kvack.org
Cc: linux-kernel@vger.kernel.org
---
 mm/vmalloc.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/mm/vmalloc.c b/mm/vmalloc.c
index 50b17c745149..e83961767dc1 100644
--- a/mm/vmalloc.c
+++ b/mm/vmalloc.c
@@ -1971,7 +1971,7 @@ EXPORT_SYMBOL(vmalloc_32);
  */
 void *vmalloc_32_user(unsigned long size)
 {
-	return __vmalloc_node_range(size, 1,  VMALLOC_START, VMALLOC_END,
+	return __vmalloc_node_range(size, SHMLBA,  VMALLOC_START, VMALLOC_END,
 				    GFP_VMALLOC32 | __GFP_ZERO, PAGE_KERNEL,
 				    VM_USERMAP, NUMA_NO_NODE,
 				    __builtin_return_address(0));
-- 
2.19.1

^ permalink raw reply	[flat|nested] 5+ messages in thread

* [PATCH 1/1] mm/vmalloc: Make vmalloc_32_user() align base kernel virtual address to SHMLBA
@ 2019-01-08 11:09 ` Roman Penyaev
  0 siblings, 0 replies; 5+ messages in thread
From: Roman Penyaev @ 2019-01-08 11:09 UTC (permalink / raw)
  Cc: Roman Penyaev, Andrew Morton, Stephen Rothwell, Michal Hocko,
	David S . Miller, Peter Zijlstra, linux-mm, linux-kernel

This patch repeats the original one from David S. Miller:

  2dca6999eed5 ("mm, perf_event: Make vmalloc_user() align base kernel virtual address to SHMLBA")

but for missed vmalloc_32_user() case, which also requires correct
alignment of virtual address on kernel side to avoid D-caches
aliases.  A bit of copy-paste from original patch to recover in
memory of what is all about:

  When a vmalloc'd area is mmap'd into userspace, some kind of
  co-ordination is necessary for this to work on platforms with cpu
  D-caches which can have aliases.

  Otherwise kernel side writes won't be seen properly in userspace
  and vice versa.

  If the kernel side mapping and the user side one have the same
  alignment, modulo SHMLBA, this can work as long as VM_SHARED is
  shared of VMA and for all current users this is true.  VM_SHARED
  will force SHMLBA alignment of the user side mmap on platforms with
  D-cache aliasing matters.

  David S. Miller

Signed-off-by: Roman Penyaev <rpenyaev@suse.de>
Cc: Andrew Morton <akpm@linux-foundation.org>
Cc: Stephen Rothwell <sfr@canb.auug.org.au>
Cc: Michal Hocko <mhocko@suse.com>
Cc: David S. Miller <davem@davemloft.net>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: linux-mm@kvack.org
Cc: linux-kernel@vger.kernel.org
---
 mm/vmalloc.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/mm/vmalloc.c b/mm/vmalloc.c
index 50b17c745149..e83961767dc1 100644
--- a/mm/vmalloc.c
+++ b/mm/vmalloc.c
@@ -1971,7 +1971,7 @@ EXPORT_SYMBOL(vmalloc_32);
  */
 void *vmalloc_32_user(unsigned long size)
 {
-	return __vmalloc_node_range(size, 1,  VMALLOC_START, VMALLOC_END,
+	return __vmalloc_node_range(size, SHMLBA,  VMALLOC_START, VMALLOC_END,
 				    GFP_VMALLOC32 | __GFP_ZERO, PAGE_KERNEL,
 				    VM_USERMAP, NUMA_NO_NODE,
 				    __builtin_return_address(0));
-- 
2.19.1


^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [PATCH 1/1] mm/vmalloc: Make vmalloc_32_user() align base kernel virtual address to SHMLBA
  2019-01-08 11:09 ` Roman Penyaev
  (?)
  (?)
@ 2019-01-08 19:36 ` Andrew Morton
  2019-01-09 10:08   ` Roman Penyaev
  -1 siblings, 1 reply; 5+ messages in thread
From: Andrew Morton @ 2019-01-08 19:36 UTC (permalink / raw)
  To: Roman Penyaev
  Cc: Stephen Rothwell, Michal Hocko, David S . Miller, Peter Zijlstra,
	linux-mm, linux-kernel

On Tue,  8 Jan 2019 12:09:44 +0100 Roman Penyaev <rpenyaev@suse.de> wrote:

> This patch repeats the original one from David S. Miller:
> 
>   2dca6999eed5 ("mm, perf_event: Make vmalloc_user() align base kernel virtual address to SHMLBA")
> 
> but for missed vmalloc_32_user() case, which also requires correct
> alignment of virtual address on kernel side to avoid D-caches
> aliases.  A bit of copy-paste from original patch to recover in
> memory of what is all about:
> 
>   When a vmalloc'd area is mmap'd into userspace, some kind of
>   co-ordination is necessary for this to work on platforms with cpu
>   D-caches which can have aliases.
> 
>   Otherwise kernel side writes won't be seen properly in userspace
>   and vice versa.
> 
>   If the kernel side mapping and the user side one have the same
>   alignment, modulo SHMLBA, this can work as long as VM_SHARED is
>   shared of VMA and for all current users this is true.  VM_SHARED
>   will force SHMLBA alignment of the user side mmap on platforms with
>   D-cache aliasing matters.

What are the user-visible runtime effects of this change?

Is a -stable backport needed?

^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [PATCH 1/1] mm/vmalloc: Make vmalloc_32_user() align base kernel virtual address to SHMLBA
  2019-01-08 19:36 ` Andrew Morton
@ 2019-01-09 10:08   ` Roman Penyaev
  0 siblings, 0 replies; 5+ messages in thread
From: Roman Penyaev @ 2019-01-09 10:08 UTC (permalink / raw)
  To: Andrew Morton
  Cc: Stephen Rothwell, Michal Hocko, David S . Miller, Peter Zijlstra,
	linux-mm, linux-kernel

On 2019-01-08 20:36, Andrew Morton wrote:
> On Tue,  8 Jan 2019 12:09:44 +0100 Roman Penyaev <rpenyaev@suse.de> 
> wrote:
> 
>> This patch repeats the original one from David S. Miller:
>> 
>>   2dca6999eed5 ("mm, perf_event: Make vmalloc_user() align base kernel 
>> virtual address to SHMLBA")
>> 
>> but for missed vmalloc_32_user() case, which also requires correct
>> alignment of virtual address on kernel side to avoid D-caches
>> aliases.  A bit of copy-paste from original patch to recover in
>> memory of what is all about:
>> 
>>   When a vmalloc'd area is mmap'd into userspace, some kind of
>>   co-ordination is necessary for this to work on platforms with cpu
>>   D-caches which can have aliases.
>> 
>>   Otherwise kernel side writes won't be seen properly in userspace
>>   and vice versa.
>> 
>>   If the kernel side mapping and the user side one have the same
>>   alignment, modulo SHMLBA, this can work as long as VM_SHARED is
>>   shared of VMA and for all current users this is true.  VM_SHARED
>>   will force SHMLBA alignment of the user side mmap on platforms with
>>   D-cache aliasing matters.
> 
> What are the user-visible runtime effects of this change?

In simple words: proper alignment avoids possible difference in data,
seen by different virtual mapings: userspace and kernel in our case.
I.e. userspace reads cache line A, kernel writes to cache line B.
Both cache lines correspond to the same physical memory (thus aliases).

So this should fix data corruption for archs with vivt and vipt caches,
e.g. armv6.  Personally I've never worked with this archs, I just 
spotted
the strange difference in code: for one case we do alignment, for 
another
- not.  I have a strong feeling that David simply missed 
vmalloc_32_user()
case.

> 
> Is a -stable backport needed?

No, I do not think so.  The only one user of vmalloc_32_user() is 
virtual
frame buffer device drivers/video/fbdev/vfb.c, which has in the 
description
"The main use of this frame buffer device is testing and debugging the 
frame
buffer subsystem. Do NOT enable it for normal systems!".

And it seems to me that this vfb.c does not need 32bit addressable pages
(vmalloc_32_user() case), because it is virtual device and should not 
care
about things like dma32 zones, etc.  Probably is better to clean the 
code
and switch vfb.c from vmalloc_32_user() to vmalloc_user() case and wipe 
out
vmalloc_32_user() from vmalloc.c completely.  But I'm not very much sure
that this is worth to do, that's so minor, so we can leave it as is.

--
Roman





^ permalink raw reply	[flat|nested] 5+ messages in thread

end of thread, other threads:[~2019-01-09 10:08 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2019-01-08 11:09 [PATCH 1/1] mm/vmalloc: Make vmalloc_32_user() align base kernel virtual address to SHMLBA Roman Penyaev
2019-01-08 11:09 ` Roman Penyaev
2019-01-08 11:09 ` Roman Penyaev
2019-01-08 19:36 ` Andrew Morton
2019-01-09 10:08   ` Roman Penyaev

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.