From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from kanga.kvack.org (kanga.kvack.org [205.233.56.17]) by smtp.lore.kernel.org (Postfix) with ESMTP id 226A9C74A5B for ; Thu, 30 Mar 2023 02:06:12 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 488CE6B0072; Wed, 29 Mar 2023 22:06:12 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id 438966B0074; Wed, 29 Mar 2023 22:06:12 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 327C66B0075; Wed, 29 Mar 2023 22:06:12 -0400 (EDT) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0016.hostedemail.com [216.40.44.16]) by kanga.kvack.org (Postfix) with ESMTP id 248AE6B0072 for ; Wed, 29 Mar 2023 22:06:12 -0400 (EDT) Received: from smtpin24.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay02.hostedemail.com (Postfix) with ESMTP id C16B2120882 for ; Thu, 30 Mar 2023 02:06:11 +0000 (UTC) X-FDA: 80623924542.24.623EA36 Received: from loongson.cn (mail.loongson.cn [114.242.206.163]) by imf26.hostedemail.com (Postfix) with ESMTP id C71CD140008 for ; Thu, 30 Mar 2023 02:06:08 +0000 (UTC) Authentication-Results: imf26.hostedemail.com; dkim=none; spf=pass (imf26.hostedemail.com: domain of zhangqing@loongson.cn designates 114.242.206.163 as permitted sender) smtp.mailfrom=zhangqing@loongson.cn; dmarc=none ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1680141970; a=rsa-sha256; cv=none; b=5J1tR2msWwxSj5RymF/AyJP2S9Nv0JgxzDLqikgCiRlyt/tYMEJCXVGSXcnz9p+IMimWv4 gxu+ekyv7NDCMkHQkZ214ZnZqcNUtmM9bUm8S+bgydvSxI/J7FbAxtoIvDXfnJtlugWuDh e/crEhmXhLbMhCCe4z53ZZU/Y/YDgos= ARC-Authentication-Results: i=1; imf26.hostedemail.com; dkim=none; spf=pass (imf26.hostedemail.com: domain of zhangqing@loongson.cn designates 114.242.206.163 as permitted sender) smtp.mailfrom=zhangqing@loongson.cn; dmarc=none ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1680141970; h=from:from:sender:reply-to:subject:subject:date:date: message-id:message-id:to:to:cc:cc:mime-version:mime-version: content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=U+g6Y5JzvLGP0jhGpnxPSHffGBY07LEpQ+2IPlDG9nA=; b=K5cHt3QWRV/sX4FmbNpVTnNjbH1kMK+sqKSwwlxckIV7cbfq3PZqR9R3H/9P3xFUqbgGxO NTduNQ1x/EcbeyQbsaHGHS+9OTDa2ZgEPvGxEyTXuHqJ8Mt9bnNVmvY/gxDvccGyAB/ShT 1chOvZutgH/N13kXRVYBx8g1uYPp0d8= Received: from loongson.cn (unknown [113.200.148.30]) by gateway (Coremail) with SMTP id _____8BxedmM7iRkSykUAA--.31012S3; Thu, 30 Mar 2023 10:06:04 +0800 (CST) Received: from [10.130.0.102] (unknown [113.200.148.30]) by localhost.localdomain (Coremail) with SMTP id AQAAf8AxHL6I7iRkjugQAA--.13156S3; Thu, 30 Mar 2023 10:06:03 +0800 (CST) Subject: Re: [PATCH] LoongArch: Add kernel address sanitizer support To: Andrey Konovalov Cc: Jonathan Corbet , Huacai Chen , Andrew Morton , Alexander Potapenko , Dmitry Vyukov , Vincenzo Frascino , WANG Xuerui , Jiaxun Yang , kasan-dev@googlegroups.com, linux-doc@vger.kernel.org, linux-mm@kvack.org, loongarch@lists.linux.dev, linux-kernel@vger.kernel.org, linux-hardening@vger.kernel.org, Andrey Ryabinin References: <20230328111714.2056-1-zhangqing@loongson.cn> From: Qing Zhang Message-ID: Date: Thu, 30 Mar 2023 10:06:00 +0800 User-Agent: Mozilla/5.0 (X11; Linux mips64; rv:68.0) Gecko/20100101 Thunderbird/68.7.0 MIME-Version: 1.0 In-Reply-To: Content-Type: text/plain; charset=utf-8; format=flowed Content-Language: en-US Content-Transfer-Encoding: 8bit X-CM-TRANSID:AQAAf8AxHL6I7iRkjugQAA--.13156S3 X-CM-SenderInfo: x2kd0wptlqwqxorr0wxvrqhubq/ X-Coremail-Antispam: 1Uk129KBjvJXoW3Gw4rZr1UJF48tw1rtF1UJrb_yoW7WF4fpF yDGFy8AF4IqF1qga9rAr1Uur1UJwnak3WxKFs09r4rCa4UWrykJFyDWF9Iyrn3urW7AFya yws3Wa9xAw4jq3DanT9S1TB71UUUUUJqnTZGkaVYY2UrUUUUj1kv1TuYvTs0mT0YCTnIWj qI5I8CrVACY4xI64kE6c02F40Ex7xfYxn0WfASr-VFAUDa7-sFnT9fnUUIcSsGvfJTRUUU bfkYFVCjjxCrM7AC8VAFwI0_Jr0_Gr1l1xkIjI8I6I8E6xAIw20EY4v20xvaj40_Wr0E3s 1l1IIY67AEw4v_JrI_Jryl8cAvFVAK0II2c7xJM28CjxkF64kEwVA0rcxSw2x7M28EF7xv wVC0I7IYx2IY67AKxVW8JVW5JwA2z4x0Y4vE2Ix0cI8IcVCY1x0267AKxVW8JVWxJwA2z4 x0Y4vEx4A2jsIE14v26F4j6r4UJwA2z4x0Y4vEx4A2jsIEc7CjxVAFwI0_Gr1j6F4UJwAa w2AFwI0_Jrv_JF1le2I262IYc4CY6c8Ij28IcVAaY2xG8wAqjxCEc2xF0cIa020Ex4CE44 I27wAqx4xG64xvF2IEw4CE5I8CrVC2j2WlYx0E2Ix0cI8IcVAFwI0_Jrv_JF1lYx0Ex4A2 jsIE14v26r1j6r4UMcvjeVCFs4IE7xkEbVWUJVW8JwACjcxG0xvEwIxGrwCYjI0SjxkI62 AI1cAE67vIY487MxAIw28IcxkI7VAKI48JMxC20s026xCaFVCjc4AY6r1j6r4UMxCIbckI 1I0E14v26r1Y6r17MI8I3I0E5I8CrVAFwI0_Jr0_Jr4lx2IqxVCjr7xvwVAFwI0_JrI_Jr Wlx4CE17CEb7AF67AKxVW8ZVWrXwCIc40Y0x0EwIxGrwCI42IY6xIIjxv20xvE14v26r1j 6r1xMIIF0xvE2Ix0cI8IcVCY1x0267AKxVWUJVW8JwCI42IY6xAIw20EY4v20xvaj40_Jr 0_JF4lIxAIcVC2z280aVAFwI0_Jr0_Gr1lIxAIcVC2z280aVCY1x0267AKxVWUJVW8JbIY CTnIWIevJa73UjIFyTuYvjxU2G-eUUUUU X-Rspam-User: X-Rspamd-Queue-Id: C71CD140008 X-Rspamd-Server: rspam01 X-Stat-Signature: daqbdkbb869ixw9spm56otpy6j4jscig X-HE-Tag: 1680141968-833072 X-HE-Meta: U2FsdGVkX1/2bPc61QWnDEjayBQk8Ly5tjB1Hy7BuHBRT35lDMFZfRqKUY+6CF2yOLOK49z81Cgrzr1PZ6tXSnCnTHyC94fRFkUqGyE9wCeZwvG8MkKtsGhQm7JWwyHpOvmqkJAuxNXdXK07+CLygdHFltuZNIgtSDYyXCwtcCHoVSta/bKuAzekqjl8ph7WevSkkD/IVrOMJABFA/VF+TaSTaiXwmSN8fNDUhZY3DcTl8jOU+TethJBBzSq/kWnPyu+O9LI+Q9TRmjyifdChmU0pKfj6NwXf8VacKUiiPU+9UgdGuX2Wyq5zcAW8w0PxbtxQTCwjow3lUuSJu63eS5sMUNh2ryNa/hFXwxhEKYUrD+TCg1cv3UrlNmdHs92N0ABTbhy3bQ+eYqr3vnPA9GtXIntAyjRUDB4FK92dMRB1xhlpTJWmsyafLKs1LEoVO8J7VkoOZLjVA497u4crMofXVv9/4EtYKNU63b4C26kEAlUyTdqjE+uYWHHrlNn2ATkX7nP3HvWQFZwLnz63j0zjzE+L/JAItOMSIcOiYD4uECB5j9Q6m4rWUrPtMj1lWMtLqOSUFfzierI9S3vF7vE3YC38ihtKZGlrrufWMHO/sLyykmUnOXPcmEsV41EquYgp6ZvcG2okgMDKVw5WB0jG1WEl2m3pFgfN0zTRUU91qb3tUBxVaKBPZwJ+i49xHIDkWqBy1v0U+Dt6VbJV0rbExMyTT8s8g9AAZReswRvPfPoFULrJ6gT4CaY1wJliIZ2VA8/1OcCluDoltrrFWL2LBRiQA/AVXjG6jNfyA0qEZKWxxVHlrMVO7cR8XmVedMOVUZ5kP9zofNrAF/b2ka5SlRppll8TMAmZEnYM33F3tzOAl/+x76gccDPYf0LTXrYGA9lvvB+J1dQDzIzXhqcXont5eGyFiu4oJAl7no2FNLiYaGBg4QyFhi+SIH24ov9zTLLHfNz+qzzaOw rkArm+PH 13bQ0b49cC0B0IxOrmO9MIXhKV5q+rwLRTeEukLJf7xJYpveAwp+05slWRtH8x3DaNFr63NPoPpLRFMZ0C07cBHCeHM8o/4R4Dt8SKbkN2I/DYDM5TAt4+goPCD8aX3JT5KM5fN32ynfQM/g= X-Bogosity: Ham, tests=bogofilter, spamicity=0.000000, version=1.2.4 Sender: owner-linux-mm@kvack.org Precedence: bulk X-Loop: owner-majordomo@kvack.org List-ID: Hi, Andrey On 2023/3/30 上午3:02, Andrey Konovalov wrote: >> diff --git a/include/linux/kasan.h b/include/linux/kasan.h >> index f7ef70661ce2..3b91b941873d 100644 >> --- a/include/linux/kasan.h >> +++ b/include/linux/kasan.h >> @@ -54,11 +54,13 @@ extern p4d_t kasan_early_shadow_p4d[MAX_PTRS_PER_P4D]; >> int kasan_populate_early_shadow(const void *shadow_start, >> const void *shadow_end); >> >> +#ifndef __HAVE_ARCH_SHADOW_MAP >> static inline void *kasan_mem_to_shadow(const void *addr) >> { >> return (void *)((unsigned long)addr >> KASAN_SHADOW_SCALE_SHIFT) >> + KASAN_SHADOW_OFFSET; >> } >> +#endif >> >> int kasan_add_zero_shadow(void *start, unsigned long size); >> void kasan_remove_zero_shadow(void *start, unsigned long size); >> diff --git a/mm/kasan/generic.c b/mm/kasan/generic.c >> index e5eef670735e..f86194750df5 100644 >> --- a/mm/kasan/generic.c >> +++ b/mm/kasan/generic.c >> @@ -175,6 +175,11 @@ static __always_inline bool check_region_inline(unsigned long addr, >> if (unlikely(!addr_has_metadata((void *)addr))) >> return !kasan_report(addr, size, write, ret_ip); >> >> +#ifndef __HAVE_ARCH_SHADOW_MAP >> + if (unlikely(kasan_mem_to_shadow((unsigned long *)addr) == NULL)) >> + return !kasan_report(addr, size, write, ret_ip); >> +#endif > > This should have been ifdef, right? > Sorry, it was a clerical error, Here it is #ifndef __HAVE_ARCH_SHADOW_MAP if (unlikely(! addr_has_metadata((void *)addr))) return ! kasan_report(addr, size, write, ret_ip); #else if (unlikely(kasan_mem_to_shadow((void *)addr) == NULL)) { kasan_report(addr, size, write, ret_ip); return; } #endif > But I don't think you need this check here at all: addr_has_metadata > already checks that shadow exists. > On LongArch, there's a lot of holes between different segments, so kasan shadow area is some different type of memory that we concatenate, we can't use if (unlikely((void *)addr < kasan_shadow_to_mem((void *)KASAN_SHADOW_START))) to determine the validity, and in arch/loongarch/include/asm/kasan.h I construct invalid NULL. >> + >> if (likely(!memory_is_poisoned(addr, size))) >> return true; >> >> diff --git a/mm/kasan/init.c b/mm/kasan/init.c >> index cc64ed6858c6..860061a22ca9 100644 >> --- a/mm/kasan/init.c >> +++ b/mm/kasan/init.c >> @@ -166,8 +166,9 @@ static int __ref zero_pud_populate(p4d_t *p4d, unsigned long addr, >> if (!p) >> return -ENOMEM; >> } else { >> - pud_populate(&init_mm, pud, >> - early_alloc(PAGE_SIZE, NUMA_NO_NODE)); >> + p = early_alloc(PAGE_SIZE, NUMA_NO_NODE); >> + pmd_init(p); >> + pud_populate(&init_mm, pud, p); >> } >> } >> zero_pmd_populate(pud, addr, next); >> @@ -207,8 +208,9 @@ static int __ref zero_p4d_populate(pgd_t *pgd, unsigned long addr, >> if (!p) >> return -ENOMEM; >> } else { >> - p4d_populate(&init_mm, p4d, >> - early_alloc(PAGE_SIZE, NUMA_NO_NODE)); >> + p = early_alloc(PAGE_SIZE, NUMA_NO_NODE); >> + pud_init(p); >> + p4d_populate(&init_mm, p4d, p); > > Please explain why these changes are needed in the patch description. This is because in pagetable_init on loongarch/mips, we populate pmd/pud with invalid_pmd_table/invalid_pud_table, So pmd_init/pud_init(p) is required, perhaps we define them as __weak in mm/kasan/init.c, like mm/sparse-vmemmap.c. diff --git a/include/linux/mm.h b/include/linux/mm.h ... +void pmd_init(void *addr); +void pud_init(void *addr); ... diff --git a/mm/sparse-vmemmap.c b/mm/sparse-vmemmap.c ... +void __weak __meminit pmd_init(void *addr) + { +} + @@-203,11 +207,16 @@pud_t * __meminit vmemmap_pud_populate(p4d_t *p4d, unsigned long addr, int node) void *p = vmemmap_alloc_block_zero(PAGE_SIZE, node); if (! p) return NULL; + pmd_init(p); pud_populate(&init_mm, pud, p); } return pud; } +void __weak __meminit pud_init(void *addr) + { +} + p4d_t * __meminit vmemmap_p4d_populate(pgd_t *pgd, unsigned long addr, int node) { p4d_t *p4d = p4d_offset(pgd, addr); @@-215,6 +224,7 @@p4d_t * __meminit vmemmap_p4d_populate(pgd_t *pgd, unsigned long addr, int node) void *p = vmemmap_alloc_block_zero(PAGE_SIZE, node); if (! p) return NULL; + pud_init(p); p4d_populate(&init_mm, p4d, p); } return p4d; Thanks, - Qing > >> } >> } >> zero_pud_populate(p4d, addr, next); >> diff --git a/mm/kasan/kasan.h b/mm/kasan/kasan.h >> index a61eeee3095a..033335c13b25 100644 >> --- a/mm/kasan/kasan.h >> +++ b/mm/kasan/kasan.h >> @@ -291,16 +291,22 @@ struct kasan_stack_ring { >> >> #if defined(CONFIG_KASAN_GENERIC) || defined(CONFIG_KASAN_SW_TAGS) >> >> +#ifndef __HAVE_ARCH_SHADOW_MAP >> static inline const void *kasan_shadow_to_mem(const void *shadow_addr) >> { >> return (void *)(((unsigned long)shadow_addr - KASAN_SHADOW_OFFSET) >> << KASAN_SHADOW_SCALE_SHIFT); >> } >> +#endif >> >> static __always_inline bool addr_has_metadata(const void *addr) >> { >> +#ifdef __HAVE_ARCH_SHADOW_MAP >> + return (kasan_mem_to_shadow((void *)addr) != NULL); >> +#else >> return (kasan_reset_tag(addr) >= >> kasan_shadow_to_mem((void *)KASAN_SHADOW_START)); >> +#endif >> } >> >> /** >> -- >> 2.20.1 >>