lists.openwall.net   lists  /  announce  owl-users  owl-dev  john-users  john-dev  passwdqc-users  yescrypt  popa3d-users  /  oss-security  kernel-hardening  musl  sabotage  tlsify  passwords  /  crypt-dev  xvendor  /  Bugtraq  Full-Disclosure  linux-kernel  linux-netdev  linux-ext4  linux-hardening  linux-cve-announce  PHC 
Open Source and information security mailing list archives
 
Hash Suite: Windows password security audit tool. GUI, reports in PDF.
[<prev] [next>] [thread-next>] [day] [month] [year] [list]
Date:   Sun, 29 Sep 2019 15:28:41 +0800
From:   jun.zhang@...el.com
To:     labbott@...hat.com, sumit.semwal@...aro.org,
        gregkh@...uxfoundation.org, arve@...roid.com, tkjos@...roid.com,
        maco@...roid.com, joel@...lfernandes.org, christian@...uner.io
Cc:     devel@...verdev.osuosl.org, dri-devel@...ts.freedesktop.org,
        linaro-mm-sig@...ts.linaro.org, linux-kernel@...r.kernel.org,
        zhang jun <jun.zhang@...el.com>, he@...r.kernel.org,
        bo <bo.he@...el.com>, Bai@...r.kernel.org,
        Jie A <jie.a.bai@...el.com>
Subject: [PATCH] ion_system_heap: support X86 archtecture

From: zhang jun <jun.zhang@...el.com>

we see tons of warning like:
[   45.846872] x86/PAT: NDK MediaCodec_:3753 map pfn RAM range req
write-combining for [mem 0x1e7a80000-0x1e7a87fff], got write-back
[   45.848827] x86/PAT: .vorbis.decoder:4088 map pfn RAM range req
write-combining for [mem 0x1e7a58000-0x1e7a58fff], got write-back
[   45.848875] x86/PAT: NDK MediaCodec_:3753 map pfn RAM range req
write-combining for [mem 0x1e7a48000-0x1e7a4ffff], got write-back
[   45.849403] x86/PAT: .vorbis.decoder:4088 map pfn RAM range
req write-combining for [mem 0x1e7a70000-0x1e7a70fff], got write-back

check the kernel Documentation/x86/pat.txt, it says:
A. Exporting pages to users with remap_pfn_range, io_remap_pfn_range,
vm_insert_pfn
Drivers wanting to export some pages to userspace do it by using
mmap interface and a combination of
1) pgprot_noncached()
2) io_remap_pfn_range() or remap_pfn_range() or vm_insert_pfn()
With PAT support, a new API pgprot_writecombine is being added.
So, drivers can continue to use the above sequence, with either
pgprot_noncached() or pgprot_writecombine() in step 1, followed by step 2.

In addition, step 2 internally tracks the region as UC or WC in
memtype list in order to ensure no conflicting mapping.

Note that this set of APIs only works with IO (non RAM) regions.
If driver ants to export a RAM region, it has to do set_memory_uc() or
set_memory_wc() as step 0 above and also track the usage of those pages
and use set_memory_wb() before the page is freed to free pool.

the fix follow the pat document, do set_memory_wc() as step 0 and
use the set_memory_wb() before the page is freed.

Signed-off-by: he, bo <bo.he@...el.com>
Signed-off-by: zhang jun <jun.zhang@...el.com>
Signed-off-by: Bai, Jie A <jie.a.bai@...el.com>
---
 drivers/staging/android/ion/ion_system_heap.c | 28 ++++++++++++++++++-
 1 file changed, 27 insertions(+), 1 deletion(-)

diff --git a/drivers/staging/android/ion/ion_system_heap.c b/drivers/staging/android/ion/ion_system_heap.c
index b83a1d16bd89..d298b8194820 100644
--- a/drivers/staging/android/ion/ion_system_heap.c
+++ b/drivers/staging/android/ion/ion_system_heap.c
@@ -13,6 +13,7 @@
 #include <linux/scatterlist.h>
 #include <linux/slab.h>
 #include <linux/vmalloc.h>
+#include <asm/set_memory.h>
 
 #include "ion.h"
 
@@ -134,6 +135,13 @@ static int ion_system_heap_allocate(struct ion_heap *heap,
 	sg = table->sgl;
 	list_for_each_entry_safe(page, tmp_page, &pages, lru) {
 		sg_set_page(sg, page, page_size(page), 0);
+
+#ifdef CONFIG_X86
+	if (!(buffer->flags & ION_FLAG_CACHED))
+		set_memory_wc((unsigned long)page_address(sg_page(sg)),
+			      PAGE_ALIGN(sg->length) >> PAGE_SHIFT);
+#endif
+
 		sg = sg_next(sg);
 		list_del(&page->lru);
 	}
@@ -162,8 +170,15 @@ static void ion_system_heap_free(struct ion_buffer *buffer)
 	if (!(buffer->private_flags & ION_PRIV_FLAG_SHRINKER_FREE))
 		ion_heap_buffer_zero(buffer);
 
-	for_each_sg(table->sgl, sg, table->nents, i)
+	for_each_sg(table->sgl, sg, table->nents, i) {
+#ifdef CONFIG_X86
+		if (!(buffer->flags & ION_FLAG_CACHED))
+			set_memory_wb((unsigned long)page_address(sg_page(sg)),
+				      PAGE_ALIGN(sg->length) >> PAGE_SHIFT);
+#endif
+
 		free_buffer_page(sys_heap, buffer, sg_page(sg));
+	}
 	sg_free_table(table);
 	kfree(table);
 }
@@ -316,6 +331,12 @@ static int ion_system_contig_heap_allocate(struct ion_heap *heap,
 
 	buffer->sg_table = table;
 
+#ifdef CONFIG_X86
+	if (!(buffer->flags & ION_FLAG_CACHED))
+		set_memory_wc((unsigned long)page_address(page),
+			      PAGE_ALIGN(len) >> PAGE_SHIFT);
+#endif
+
 	return 0;
 
 free_table:
@@ -334,6 +355,11 @@ static void ion_system_contig_heap_free(struct ion_buffer *buffer)
 	unsigned long pages = PAGE_ALIGN(buffer->size) >> PAGE_SHIFT;
 	unsigned long i;
 
+#ifdef CONFIG_X86
+	if (!(buffer->flags & ION_FLAG_CACHED))
+		set_memory_wb((unsigned long)page_address(page), pages);
+#endif
+
 	for (i = 0; i < pages; i++)
 		__free_page(page + i);
 	sg_free_table(table);
-- 
2.17.1

Powered by blists - more mailing lists

Powered by Openwall GNU/*/Linux Powered by OpenVZ