{"id":816455,"url":"http://patchwork.ozlabs.org/api/patches/816455/?format=json","web_url":"http://patchwork.ozlabs.org/project/sparclinux/patch/20170920201714.19817-10-pasha.tatashin@oracle.com/","project":{"id":10,"url":"http://patchwork.ozlabs.org/api/projects/10/?format=json","name":"Linux SPARC Development ","link_name":"sparclinux","list_id":"sparclinux.vger.kernel.org","list_email":"sparclinux@vger.kernel.org","web_url":null,"scm_url":null,"webscm_url":null,"list_archive_url":"","list_archive_url_format":"","commit_url_format":""},"msgid":"<20170920201714.19817-10-pasha.tatashin@oracle.com>","list_archive_url":null,"date":"2017-09-20T20:17:11","name":"[v9,09/12] mm/kasan: kasan specific map populate function","commit_ref":null,"pull_url":null,"state":"not-applicable","archived":false,"hash":"f2db2ed17853c8c3fa1f2bdbe71ebf8365c111f9","submitter":{"id":71010,"url":"http://patchwork.ozlabs.org/api/people/71010/?format=json","name":"Pavel Tatashin","email":"pasha.tatashin@oracle.com"},"delegate":{"id":34,"url":"http://patchwork.ozlabs.org/api/users/34/?format=json","username":"davem","first_name":"David","last_name":"Miller","email":"davem@davemloft.net"},"mbox":"http://patchwork.ozlabs.org/project/sparclinux/patch/20170920201714.19817-10-pasha.tatashin@oracle.com/mbox/","series":[{"id":4223,"url":"http://patchwork.ozlabs.org/api/series/4223/?format=json","web_url":"http://patchwork.ozlabs.org/project/sparclinux/list/?series=4223","date":"2017-09-20T20:17:06","name":"complete deferred page initialization","version":9,"mbox":"http://patchwork.ozlabs.org/series/4223/mbox/"}],"comments":"http://patchwork.ozlabs.org/api/patches/816455/comments/","check":"pending","checks":"http://patchwork.ozlabs.org/api/patches/816455/checks/","tags":{},"related":[],"headers":{"Return-Path":"<sparclinux-owner@vger.kernel.org>","X-Original-To":"patchwork-incoming@ozlabs.org","Delivered-To":"patchwork-incoming@ozlabs.org","Authentication-Results":"ozlabs.org;\n\tspf=none (mailfrom) smtp.mailfrom=vger.kernel.org\n\t(client-ip=209.132.180.67; helo=vger.kernel.org;\n\tenvelope-from=sparclinux-owner@vger.kernel.org;\n\treceiver=<UNKNOWN>)","Received":["from vger.kernel.org (vger.kernel.org [209.132.180.67])\n\tby ozlabs.org (Postfix) with ESMTP id 3xyB380q0dz9ryv\n\tfor <patchwork-incoming@ozlabs.org>;\n\tThu, 21 Sep 2017 06:21:24 +1000 (AEST)","(majordomo@vger.kernel.org) by vger.kernel.org via listexpand\n\tid S1751798AbdITUVK (ORCPT <rfc822;patchwork-incoming@ozlabs.org>);\n\tWed, 20 Sep 2017 16:21:10 -0400","from userp1040.oracle.com ([156.151.31.81]:41123 \"EHLO\n\tuserp1040.oracle.com\" rhost-flags-OK-OK-OK-OK) by vger.kernel.org\n\twith ESMTP id S1751554AbdITUSn (ORCPT\n\t<rfc822; sparclinux@vger.kernel.org>); Wed, 20 Sep 2017 16:18:43 -0400","from userv0021.oracle.com (userv0021.oracle.com [156.151.31.71])\n\tby userp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with\n\tESMTP id v8KKHY3i007910\n\t(version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256\n\tverify=OK); Wed, 20 Sep 2017 20:17:35 GMT","from aserv0121.oracle.com (aserv0121.oracle.com [141.146.126.235])\n\tby userv0021.oracle.com (8.14.4/8.14.4) with ESMTP id\n\tv8KKHYDU028642\n\t(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256\n\tverify=OK); Wed, 20 Sep 2017 20:17:34 GMT","from abhmp0008.oracle.com (abhmp0008.oracle.com [141.146.116.14])\n\tby aserv0121.oracle.com (8.14.4/8.13.8) with ESMTP id\n\tv8KKHY6a007266; Wed, 20 Sep 2017 20:17:34 GMT","from xakep.us.oracle.com (/10.154.127.176)\n\tby default (Oracle Beehive Gateway v4.0)\n\twith ESMTP ; Wed, 20 Sep 2017 13:17:34 -0700"],"From":"Pavel Tatashin <pasha.tatashin@oracle.com>","To":"linux-kernel@vger.kernel.org, sparclinux@vger.kernel.org,\n\tlinux-mm@kvack.org, linuxppc-dev@lists.ozlabs.org,\n\tlinux-s390@vger.kernel.org, linux-arm-kernel@lists.infradead.org,\n\tx86@kernel.org, kasan-dev@googlegroups.com, borntraeger@de.ibm.com,\n\theiko.carstens@de.ibm.com, davem@davemloft.net,\n\twilly@infradead.org, mhocko@kernel.org, ard.biesheuvel@linaro.org,\n\tmark.rutland@arm.com, will.deacon@arm.com, catalin.marinas@arm.com,\n\tsam@ravnborg.org, mgorman@techsingularity.net,\n\tsteven.sistare@oracle.com, daniel.m.jordan@oracle.com,\n\tbob.picco@oracle.com","Subject":"[PATCH v9 09/12] mm/kasan: kasan specific map populate function","Date":"Wed, 20 Sep 2017 16:17:11 -0400","Message-Id":"<20170920201714.19817-10-pasha.tatashin@oracle.com>","X-Mailer":"git-send-email 2.14.1","In-Reply-To":"<20170920201714.19817-1-pasha.tatashin@oracle.com>","References":"<20170920201714.19817-1-pasha.tatashin@oracle.com>","X-Source-IP":"userv0021.oracle.com [156.151.31.71]","Sender":"sparclinux-owner@vger.kernel.org","Precedence":"bulk","List-ID":"<sparclinux.vger.kernel.org>","X-Mailing-List":"sparclinux@vger.kernel.org"},"content":"During early boot, kasan uses vmemmap_populate() to establish its shadow\nmemory. But, that interface is intended for struct pages use.\n\nBecause of the current project, vmemmap won't be zeroed during allocation,\nbut kasan expects that memory to be zeroed. We are adding a new\nkasan_map_populate() function to resolve this difference.\n\nSigned-off-by: Pavel Tatashin <pasha.tatashin@oracle.com>\n---\n arch/arm64/include/asm/pgtable.h |  3 ++\n include/linux/kasan.h            |  2 ++\n mm/kasan/kasan_init.c            | 67 ++++++++++++++++++++++++++++++++++++++++\n 3 files changed, 72 insertions(+)","diff":"diff --git a/arch/arm64/include/asm/pgtable.h b/arch/arm64/include/asm/pgtable.h\nindex bc4e92337d16..d89713f04354 100644\n--- a/arch/arm64/include/asm/pgtable.h\n+++ b/arch/arm64/include/asm/pgtable.h\n@@ -381,6 +381,9 @@ extern pgprot_t phys_mem_access_prot(struct file *file, unsigned long pfn,\n \t\t\t\t PUD_TYPE_TABLE)\n #endif\n \n+#define pmd_large(pmd)\t\tpmd_sect(pmd)\n+#define pud_large(pud)\t\tpud_sect(pud)\n+\n static inline void set_pmd(pmd_t *pmdp, pmd_t pmd)\n {\n \t*pmdp = pmd;\ndiff --git a/include/linux/kasan.h b/include/linux/kasan.h\nindex a5c7046f26b4..7e13df1722c2 100644\n--- a/include/linux/kasan.h\n+++ b/include/linux/kasan.h\n@@ -78,6 +78,8 @@ size_t kasan_metadata_size(struct kmem_cache *cache);\n \n bool kasan_save_enable_multi_shot(void);\n void kasan_restore_multi_shot(bool enabled);\n+int __meminit kasan_map_populate(unsigned long start, unsigned long end,\n+\t\t\t\t int node);\n \n #else /* CONFIG_KASAN */\n \ndiff --git a/mm/kasan/kasan_init.c b/mm/kasan/kasan_init.c\nindex 554e4c0f23a2..57a973f05f63 100644\n--- a/mm/kasan/kasan_init.c\n+++ b/mm/kasan/kasan_init.c\n@@ -197,3 +197,70 @@ void __init kasan_populate_zero_shadow(const void *shadow_start,\n \t\tzero_p4d_populate(pgd, addr, next);\n \t} while (pgd++, addr = next, addr != end);\n }\n+\n+/* Creates mappings for kasan during early boot. The mapped memory is zeroed */\n+int __meminit kasan_map_populate(unsigned long start, unsigned long end,\n+\t\t\t\t int node)\n+{\n+\tunsigned long addr, pfn, next;\n+\tunsigned long long size;\n+\tpgd_t *pgd;\n+\tp4d_t *p4d;\n+\tpud_t *pud;\n+\tpmd_t *pmd;\n+\tpte_t *pte;\n+\tint ret;\n+\n+\tret = vmemmap_populate(start, end, node);\n+\t/*\n+\t * We might have partially populated memory, so check for no entries,\n+\t * and zero only those that actually exist.\n+\t */\n+\tfor (addr = start; addr < end; addr = next) {\n+\t\tpgd = pgd_offset_k(addr);\n+\t\tif (pgd_none(*pgd)) {\n+\t\t\tnext = pgd_addr_end(addr, end);\n+\t\t\tcontinue;\n+\t\t}\n+\n+\t\tp4d = p4d_offset(pgd, addr);\n+\t\tif (p4d_none(*p4d)) {\n+\t\t\tnext = p4d_addr_end(addr, end);\n+\t\t\tcontinue;\n+\t\t}\n+\n+\t\tpud = pud_offset(p4d, addr);\n+\t\tif (pud_none(*pud)) {\n+\t\t\tnext = pud_addr_end(addr, end);\n+\t\t\tcontinue;\n+\t\t}\n+\t\tif (pud_large(*pud)) {\n+\t\t\t/* This is PUD size page */\n+\t\t\tnext = pud_addr_end(addr, end);\n+\t\t\tsize = PUD_SIZE;\n+\t\t\tpfn = pud_pfn(*pud);\n+\t\t} else {\n+\t\t\tpmd = pmd_offset(pud, addr);\n+\t\t\tif (pmd_none(*pmd)) {\n+\t\t\t\tnext = pmd_addr_end(addr, end);\n+\t\t\t\tcontinue;\n+\t\t\t}\n+\t\t\tif (pmd_large(*pmd)) {\n+\t\t\t\t/* This is PMD size page */\n+\t\t\t\tnext = pmd_addr_end(addr, end);\n+\t\t\t\tsize = PMD_SIZE;\n+\t\t\t\tpfn = pmd_pfn(*pmd);\n+\t\t\t} else {\n+\t\t\t\tpte = pte_offset_kernel(pmd, addr);\n+\t\t\t\tnext = addr + PAGE_SIZE;\n+\t\t\t\tif (pte_none(*pte))\n+\t\t\t\t\tcontinue;\n+\t\t\t\t/* This is base size page */\n+\t\t\t\tsize = PAGE_SIZE;\n+\t\t\t\tpfn = pte_pfn(*pte);\n+\t\t\t}\n+\t\t}\n+\t\tmemset(phys_to_virt(PFN_PHYS(pfn)), 0, size);\n+\t}\n+\treturn ret;\n+}\n","prefixes":["v9","09/12"]}