From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from out30-113.freemail.mail.aliyun.com (out30-113.freemail.mail.aliyun.com [115.124.30.113]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 9973313B584 for ; Thu, 28 May 2026 03:17:25 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=115.124.30.113 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1779938248; cv=none; b=iY+4KubToCtvqZDGPb/vrVAQwlFRMaQcSqsRBi3pEMKFALe9cbDH9/Z9DaexglAlTTWzg0XpK2ghARH2bLxeWsMAs5sj4UeysUw+w3Et9OaitXAH+Rxs3NnQITFkCnSFLxxSocuMzLBU2hrB/o0C3/YDMfmAkUArHfhwNXZpdN8= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1779938248; c=relaxed/simple; bh=qprczUQrXiDk7Mb1QZRNaMmG50o01cX3CKeSIBRhwkk=; h=Message-ID:Date:MIME-Version:Subject:To:Cc:References:From: In-Reply-To:Content-Type; b=s1ZRq66v9M5kk2YteyWFXQNWOORO92/zRig8urK71g7OkhCRgmC9q2yUAaiq8hWu9qTabVeRhsXFd36SS9PxqJ2QvZHHD0u4e5FEh0ZGNF1QHnAo5GEpE/nSXQ37V6rsMClsoailf0BGoGPwYz+9Pl4/gG7CXzyFyVQx7G+G0fk= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.alibaba.com; spf=pass smtp.mailfrom=linux.alibaba.com; dkim=pass (1024-bit key) header.d=linux.alibaba.com header.i=@linux.alibaba.com header.b=dxYcDD9V; arc=none smtp.client-ip=115.124.30.113 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.alibaba.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=linux.alibaba.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=linux.alibaba.com header.i=@linux.alibaba.com header.b="dxYcDD9V" DKIM-Signature:v=1; a=rsa-sha256; c=relaxed/relaxed; d=linux.alibaba.com; s=default; t=1779938243; h=Message-ID:Date:MIME-Version:Subject:To:From:Content-Type; bh=Aw74MRuVap+euim+m8O+eFhYn9p3tagNAama2H6na1E=; b=dxYcDD9VGTmcjD/5cnE29dU6lCDOdI9aXzRTJwMKQLvY0a0Qo1Xx+MgpjP1tLDWSoloREo542gLVN4wDognt8jXIu/iA09NQeIvR5k54jWlYTveNg9TzLOsj4wLGJvVwwKt27DO7x9k8m/6dVO7YfI6VtREhfEJlpnu8NlU2TRY= X-Alimail-AntiSpam:AC=PASS;BC=-1|-1;BR=01201311R441e4;CH=green;DM=||false|;DS=||;FP=0|-1|-1|-1|0|-1|-1|-1;HT=maildocker-contentspam033045098064;MF=xueshuai@linux.alibaba.com;NM=1;PH=DS;RN=27;SR=0;TI=SMTPD_---0X3lAIi6_1779938240; Received: from 30.246.179.14(mailfrom:xueshuai@linux.alibaba.com fp:SMTPD_---0X3lAIi6_1779938240 cluster:ay36) by smtp.aliyun-inc.com; Thu, 28 May 2026 11:17:21 +0800 Message-ID: <2e413153-c9e7-41dc-ad8e-522871381bf7@linux.alibaba.com> Date: Thu, 28 May 2026 11:17:17 +0800 Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 User-Agent: Mozilla Thunderbird Subject: Re: [PATCH v14 8/8] lib/tests: memcpy_kunit: add memcpy_mc() and memcpy_mc_large() test To: Ruidong Tian , catalin.marinas@arm.com, will@kernel.org, rafael@kernel.org, tony.luck@intel.com, guohanjun@huawei.com, mchehab@kernel.org, tongtiangen@huawei.com, james.morse@arm.com, robin.murphy@arm.com, andreyknvl@gmail.com, dvyukov@google.com, vincenzo.frascino@arm.com, mpe@ellerman.id.au, npiggin@gmail.com, ryabinin.a.a@gmail.com, glider@google.com, christophe.leroy@csgroup.eu, aneesh.kumar@kernel.org, naveen.n.rao@linux.ibm.com, tglx@linutronix.de, mingo@redhat.com Cc: linux-arm-kernel@lists.infradead.org, linux-mm@kvack.org, linuxppc-dev@lists.ozlabs.org, linux-kernel@vger.kernel.org, kasan-dev@googlegroups.com References: <20260518084956.2538442-1-tianruidong@linux.alibaba.com> <20260518084956.2538442-9-tianruidong@linux.alibaba.com> From: Shuai Xue In-Reply-To: <20260518084956.2538442-9-tianruidong@linux.alibaba.com> Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 7bit On 5/18/26 4:49 PM, Ruidong Tian wrote: > memcpy_mc() is the Machine-Check safe memcpy variant that returns the > number of bytes NOT copied on a hardware memory error, or 0 on success. > > Add two test cases modeled after the existing memcpy_test() and > memcpy_large_test() implementations: Same build issue as with copy_mc_page_test: memcpy_mc() is an arm64- only symbol. 1. Cross-architecture build break (BLOCKER, same as patch 6) These tests are gated on CONFIG_ARCH_HAS_COPY_MC, which is also selected by x86_64 and ppc64. Neither architecture provides a memcpy_mc() symbol -- they use copy_mc_to_kernel() directly. On x86_64: lib/tests/memcpy_kunit.c: error: implicit declaration of function 'memcpy_mc' [-Werror=implicit-function-declaration] Fix: guard with __HAVE_ARCH_MEMCPY_MC instead: #ifdef __HAVE_ARCH_MEMCPY_MC static void memcpy_mc_test(...) { ... } static void memcpy_mc_large_test(...) { ... } #endif > > Signed-off-by: Ruidong Tian > --- > lib/tests/memcpy_kunit.c | 113 ++++++++++++++++++++++++++++++++++++++- > 1 file changed, 112 insertions(+), 1 deletion(-) > > diff --git a/lib/tests/memcpy_kunit.c b/lib/tests/memcpy_kunit.c > index 85df53ccfb0c..b4b2dafb50f1 100644 > --- a/lib/tests/memcpy_kunit.c > +++ b/lib/tests/memcpy_kunit.c > @@ -552,6 +552,115 @@ static void copy_mc_page_test(struct kunit *test) > memcmp(page_dst + PAGE_SIZE, page_zero, PAGE_SIZE), 0, > "copy_mc_page overflow into adjacent page"); > } > +/* > + * memcpy_mc() is a Machine-Check safe memcpy variant. > + * Signature: int memcpy_mc(void *dst, const void *src, size_t len) > + * Returns: 0 on success, or number of bytes NOT copied on MC error. > + * > + * In the normal (no-poison) path it must behave identically to memcpy() > + * and always return 0. > + */ > +static void memcpy_mc_test(struct kunit *test) > +{ > +#define TEST_OP "memcpy_mc" > + struct some_bytes control = { > + .data = { 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, > + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, > + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, > + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, > + }, > + }; > + struct some_bytes zero = { }; > + struct some_bytes middle = { > + .data = { 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, > + 0x20, 0x20, 0x20, 0x20, 0x00, 0x00, 0x00, 0x00, > + 0x00, 0x00, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, > + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, > + }, > + }; > + struct some_bytes three = { > + .data = { 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, > + 0x20, 0x00, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, > + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, > + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, > + }, > + }; > + struct some_bytes dest = { }; > + int ret, count; > + u8 *ptr; > + > + /* Verify static initializers. */ > + check(control, 0x20); > + check(zero, 0); > + compare("static initializers", dest, zero); > + > + /* Verify assignment. */ > + dest = control; > + compare("direct assignment", dest, control); > + > + /* Verify complete overwrite. */ > + ret = memcpy_mc(dest.data, control.data, sizeof(dest.data)); > + KUNIT_ASSERT_EQ(test, ret, 0); > + compare("complete overwrite", dest, control); > + > + /* Verify middle overwrite: 7 bytes at offset 12. */ > + dest = control; > + ret = memcpy_mc(dest.data + 12, zero.data, 7); > + KUNIT_ASSERT_EQ(test, ret, 0); > + compare("middle overwrite", dest, middle); > + > + /* Verify zero-length copy is a no-op. */ > + dest = control; > + ret = memcpy_mc(dest.data, zero.data, 0); > + KUNIT_ASSERT_EQ(test, ret, 0); > + compare("zero length", dest, control); > + > + /* Verify argument side-effects aren't repeated. */ > + dest = control; > + ptr = dest.data; > + count = 1; > + memcpy(ptr++, zero.data, count++); > + ptr += 8; > + memcpy(ptr++, zero.data, count++); This is a verbatim paste from memcpy_test(). The intent is to verify that the memcpy_mc macro doesn't double-evaluate arguments, but the test doesn't actually call memcpy_mc(). Please change the two memcpy() calls to memcpy_mc() and assert their return values. Thanks Shuai