From: Like Xu <like.xu.linux@gmail.com>
To: Marc Zyngier <maz@kernel.org>, Jiaqi Yan <jiaqiyan@google.com>
Cc: oupton@kernel.org, sebott@redhat.com, gshan@redhat.com,
yuzenghui@huawei.com, rananta@google.com, joey.gouly@arm.com,
suzuki.poulose@arm.com, pbonzini@redhat.com, shuah@kernel.org,
linux-arm-kernel@lists.infradead.org, kvmarm@lists.linux.dev,
kvm@vger.kernel.org, linux-kselftest@vger.kernel.org,
linux-kernel@vger.kernel.org
Subject: Re: [PATCH v1] KVM: selftests: Improve sea_to_user test
Date: Mon, 17 Aug 2026 20:34:53 +0800 [thread overview]
Message-ID: <79ec6855-6764-407f-bf46-add1bdf36b69@gmail.com> (raw)
In-Reply-To: <86y0le9cvz.wl-maz@kernel.org>
On 1/31/26 8:37 PM, Marc Zyngier wrote:
> On Fri, 30 Jan 2026 19:28:37 +0000,
> Jiaqi Yan <jiaqiyan@google.com> wrote:
>>
>> Several improvments to the test for KVM_EXIT_ARM_SEA:
>>
>> - Refactor run_vm to catch GUEST_FAIL, instead of causing confusing
>> unhandled MMIO kvm exit.
>>
>> - Sync far_invalid to guest.
>>
>> - Exit test with KSFT_SKIP or KSFT_FAIL when should.
>>
>> - Add comment about VM backing memory type.
>>
>> Signed-off-by: Jiaqi Yan <jiaqiyan@google.com>
>> ---
>> .../testing/selftests/kvm/arm64/sea_to_user.c | 94 +++++++++++--------
>> 1 file changed, 53 insertions(+), 41 deletions(-)
>
> Overall, this test is still pretty broken.
>
> For example, on my Altra box:
>
> maz@filthy-habits:~$ ./sea_to_user
> Random seed: 0x6b8b4567
> # Mapped 0x40000 pages: gva=0x80000000 to gpa=0xff80000000
> # Before EINJect: data=0xbaadcafe
> # EINJ_GVA=0x81234bad, einj_gpa=0xff81234bad, einj_hva=0xffff41234bad, einj_hpa=0xbad
> ok 1 # SKIP EINJ table not available in firmware
>
> Well, not quite. EINJ *is* available, it is just that this test,
> contrary to *all* the other tests, requires some insanely high
> privileges. But the test is making stupid assumption.
>
> But that's not all:
>
> maz@filthy-habits:~$ sudo ./sea_to_user
> Random seed: 0x6b8b4567
> # Mapped 0x40000 pages: gva=0x80000000 to gpa=0xff80000000
> # Before EINJect: data=0xbaadcafe
> # EINJ_GVA=0x81234bad, einj_gpa=0xff81234bad, einj_hva=0xffff41234bad, einj_hpa=0x80041234bad
> # echo 0x10 > /sys/kernel/debug/apei/einj/error_type - done
> # echo 0x2 > /sys/kernel/debug/apei/einj/flags - done
> # echo 0x80041234bad > /sys/kernel/debug/apei/einj/param1 - done
> # echo 0xffffffffffffffff > /sys/kernel/debug/apei/einj/param2 - done
> # echo 0x1 > /sys/kernel/debug/apei/einj/notrigger - done
> sh: 1: echo: echo: I/O error
> Bail out! Failed to write EINJ entry: Success (0)
> # Totals: pass:0 fail:0 xfail:0 xpass:0 skip:0 error:0
>
> Failed? Or Success? Who knows...
>
> But frankly, the whole "embedded shell script" is disgusting. What is
> wrong with driving the injection from the test itself, rather than
> this access()+popen()? popen() itself is a liability (see the man page
> for system()), and should never be used for this sort of things.
>
>>
>> diff --git a/tools/testing/selftests/kvm/arm64/sea_to_user.c b/tools/testing/selftests/kvm/arm64/sea_to_user.c
>> index 573dd790aeb8e..4a3511fa1f940 100644
>> --- a/tools/testing/selftests/kvm/arm64/sea_to_user.c
>> +++ b/tools/testing/selftests/kvm/arm64/sea_to_user.c
>> @@ -12,6 +12,11 @@
>> * including the notrigger feature. Otherwise the test will be skipped.
>> * The under-test platform's APEI should be unable to claim SEA. Otherwise
>> * the test will also be skipped.
>> + *
>> + * The VM backing memory is tied to HugeTLB 1G hugepage so far. Make sure
>> + * there are more than 4 1G hugepage on the system. They can be allocated
>
> Why *more than*? Isn't that *at least* instead?
>
>> + * at runtime by:
>> + * echo 4 > /sys/kernel/mm/hugepages/hugepages-1048576kB/nr_hugepages
>> */
>
> Why can't you provide an adequate diagnostic instead of this stuff:
>
> maz@filthy-habits:~$ ./sea_to_user
> Random seed: 0x6b8b4567
> ==== Test Assertion Failure ====
> include/kvm_syscalls.h:58: mem != MAP_FAILED
> pid=887 tid=887 errno=12 - Cannot allocate memory
> 1 0x0000000000405b4f: __kvm_mmap at kvm_syscalls.h:58 (discriminator 3)
> 2 (inlined by) kvm_mmap at kvm_syscalls.h:65 (discriminator 3)
> 3 (inlined by) vm_mem_add at kvm_util.c:1036 (discriminator 3)
> 4 0x0000000000402373: vm_create_with_sea_handler at sea_to_user.c:290
> 5 (inlined by) main at sea_to_user.c:336
> 6 0x0000ffffb0dc229b: ?? ??:0
> 7 0x0000ffffb0dc237b: ?? ??:0
> 8 0x00000000004027ef: _start at ??:?
> mmap() failed, rc: -1 errno: 12 (Cannot allocate memory)
>
> What is preventing you from not requiring huge pages? And not
> requiring 4kB as the base page size?
>
> Given how broken this is, I'm likely to disable this test until you
> fix it for real.
Pls help review the expect output:
# selftests: kvm: sea_to_user
# Random seed: 0x6b8b4567
# # Mapped 0x40000 pages: gva=0x80000000 to gpa=0xff80000000
# # Before EINJect: data=0xbaadcafe
# # EINJ_GVA=0x81234bad, einj_gpa=0xff81234bad, einj_hva=0xffff41234bad,
einj_hpa=0x2141234bad
# 1..0 # SKIP EINJ debugfs interface not available; run as root with
CONFIG_ACPI_APEI_EINJ and firmware EINJ support
ok 1 selftests: kvm: sea_to_user # SKIP
# 1 skipped test(s) detected. Consider enabling relevant config options
to improve coverage.
# Totals: pass:0 fail:0 xfail:0 xpass:0 skip:1 error:0
, and the diff behind:
diff --git a/tools/testing/selftests/kvm/arm64/sea_to_user.c
b/tools/testing/selftests/kvm/arm64/sea_to_user.c
index a23d74ed45035..7e86cbeb55291 100644
--- a/tools/testing/selftests/kvm/arm64/sea_to_user.c
+++ b/tools/testing/selftests/kvm/arm64/sea_to_user.c
@@ -86,25 +86,32 @@ static u64 translate_hva_to_hpa(unsigned long hva)
static void write_einj_entry(const char *einj_path, u64 val)
{
- char cmd[256] = {0};
- FILE *cmdfile = NULL;
+ char buf[32];
+ int fd, len, ret;
- sprintf(cmd, "echo %#lx > %s", val, einj_path);
- cmdfile = popen(cmd, "r");
+ fd = open(einj_path, O_WRONLY);
+ if (fd < 0)
+ ksft_exit_fail_perror(einj_path);
- if (pclose(cmdfile) == 0)
- ksft_print_msg("echo %#lx > %s - done\n", val, einj_path);
- else
- ksft_exit_fail_perror("Failed to write EINJ entry");
+ len = snprintf(buf, sizeof(buf), "%#lx\n", val);
+ ret = write(fd, buf, len);
+ if (ret != len)
+ ksft_exit_fail_perror(einj_path);
+
+ close(fd);
+ ksft_print_msg("%#lx > %s - done\n", val, einj_path);
}
static void inject_uer(u64 hpa)
{
- if (access("/sys/firmware/acpi/tables/EINJ", R_OK) == -1)
- ksft_test_result_skip("EINJ table no available in firmware");
-
+ /*
+ * Reading the ACPI EINJ table requires CAP_SYS_ADMIN, so a plain
+ * access() check gives a false negative for unprivileged runs. Probe
+ * the debugfs EINJ interface instead: it is only present when both
+ * firmware and the kernel EINJ driver support error injection.
+ */
if (access(EINJ_ETYPE, R_OK | W_OK) == -1)
- ksft_test_result_skip("EINJ module probably not loaded?");
+ ksft_exit_skip("EINJ debugfs interface not available; run as root
with CONFIG_ACPI_APEI_EINJ and firmware EINJ support\n");
write_einj_entry(EINJ_ETYPE, ERROR_TYPE_MEMORY_UER);
write_einj_entry(EINJ_FLAGS, MASK_MEMORY_UER);
>
> Thanks,
>
> M.
>
next prev parent reply other threads:[~2026-08-17 12:35 UTC|newest]
Thread overview: 4+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-01-30 19:28 [PATCH v1] KVM: selftests: Improve sea_to_user test Jiaqi Yan
2026-01-31 12:37 ` Marc Zyngier
2026-08-17 12:34 ` Like Xu [this message]
2026-08-17 12:56 ` Marc Zyngier
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=79ec6855-6764-407f-bf46-add1bdf36b69@gmail.com \
--to=like.xu.linux@gmail.com \
--cc=gshan@redhat.com \
--cc=jiaqiyan@google.com \
--cc=joey.gouly@arm.com \
--cc=kvm@vger.kernel.org \
--cc=kvmarm@lists.linux.dev \
--cc=linux-arm-kernel@lists.infradead.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-kselftest@vger.kernel.org \
--cc=maz@kernel.org \
--cc=oupton@kernel.org \
--cc=pbonzini@redhat.com \
--cc=rananta@google.com \
--cc=sebott@redhat.com \
--cc=shuah@kernel.org \
--cc=suzuki.poulose@arm.com \
--cc=yuzenghui@huawei.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox