All of lore.kernel.org
 help / color / mirror / Atom feed
From: sashiko-bot@kernel.org
To: "Thanos Makatos" <thanos.makatos@nutanix.com>
Cc: "kvm@vger.kernel.org" <kvm@vger.kernel.org>
Subject: Re: [PATCH v2] KVM: optionally post write on ioeventfd write
Date: Tue, 27 Oct 2026 18:34:11 +0000	[thread overview]
Message-ID: <sashiko-outbox-187032@kernel.org> (raw)
In-Reply-To: <20261027180903.1008-1-thanos.makatos@nutanix.com>

Thank you for your contribution! Sashiko AI review found 1 potential issue(s) to consider:
- [Medium] KVM: eventfd: require natural alignment for post_addr in kvm_assign_ioeventfd_idx()
--

commit c6cd7519e7f3bd3af324596a345f4b346eac3929
Author: Thanos Makatos <thanos.makatos@nutanix.com>

KVM: optionally post write on ioeventfd write

This commit introduces KVM_IOEVENTFD_FLAG_POST_WRITE to copy the value
written by a guest on an ioeventfd MMIO or PIO access to a user-provided
address before signaling the eventfd, along with documentation and x86
selftests.

> diff --git a/virt/kvm/eventfd.c b/virt/kvm/eventfd.c
> index f43b8b25bc854..b0f2a6b43e354 100644
> --- a/virt/kvm/eventfd.c
> +++ b/virt/kvm/eventfd.c

[ ... ]

> @@ -811,8 +819,36 @@ ioeventfd_write(struct kvm_vcpu *vcpu, struct kvm_io_device *this, gpa_t addr,
>  	if (!ioeventfd_in_range(p, addr, len, val))
>  		return -EOPNOTSUPP;
>  
> +	if (p->post_addr) {
> +		u64 _val = ioeventfd_get_val(val, len, unsupported_len);
> +		int r;
> +
> +		switch (len) {
> +		case 1:
> +			r = put_user(_val, (u8 __user *)p->post_addr);
> +			break;
> +		case 2:
> +			r = put_user(_val, (u16 __user *)p->post_addr);
> +			break;
> +		case 4:
> +			r = put_user(_val, (u32 __user *)p->post_addr);
> +			break;
> +		case 8:
> +			r = put_user(_val, (u64 __user *)p->post_addr);
> +			break;
> +		default:
> +			WARN_ON_ONCE(1);
> +			r = 0;
> +			break;
> +		}
> +		if (r)
> +			return r;
> +	}
> +
>  	eventfd_signal(p->eventfd);
>  	return 0;
> +unsupported_len:
> +	return -EOPNOTSUPP;
>  }
>  
>  /*
> @@ -872,6 +908,18 @@ static int kvm_assign_ioeventfd_idx(struct kvm *kvm,
>  	if (IS_ERR(eventfd))
>  		return PTR_ERR(eventfd);
>  
> +	/*
> +	 * Disallow posting to virtual address 0 so that KVM can treat
> +	 * a NULL user pointer as "no posted write".
> +	 */
> +	if ((args->flags & KVM_IOEVENTFD_FLAG_POST_WRITE) &&
> +	    (!args->len || !u64_to_user_ptr(args->post_addr) ||
> +	     args->post_addr != untagged_addr(args->post_addr) ||
> +	     !access_ok(u64_to_user_ptr(args->post_addr), args->len))) {
> +		ret = -EINVAL;
> +		goto fail;
> +	}

[Severity: Medium]
Should kvm_assign_ioeventfd_idx() in virt/kvm/eventfd.c also require
args->post_addr to be naturally aligned to args->len via
IS_ALIGNED(args->post_addr, args->len)?

In Documentation/virt/kvm/api.rst, KVM_IOEVENTFD_FLAG_POST_WRITE documents
that when multiple vCPUs write to the same ioeventfd concurrently, the value
at post_addr reflects one of the writes, and that if the copy to post_addr
fails, the eventfd is not signaled and the write is reported to userspace as
a regular MMIO/PIO exit.

When userspace registers an ioeventfd with KVM_IOEVENTFD_FLAG_POST_WRITE,
args->len in {2, 4, 8}, and an unaligned args->post_addr, subsequent guest
writes invoke ioeventfd_write() -> put_user() on p->post_addr:

1. On x86 and arm64, an unaligned 2-, 4-, or 8-byte put_user() store that
   crosses a cache-line (or 16-byte on arm64) or page boundary is split into
   multiple memory transactions and is not single-copy atomic, so concurrent
   vCPU writes can tear.

2. On RISC-V without CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS,
   __put_user_nocheck() in arch/riscv/include/asm/uaccess.h checks
   !IS_ALIGNED((uintptr_t)__gu_ptr, sizeof(*__gu_ptr)) and falls back to
   __asm_copy_to_user_sum_enabled(), which copies byte-by-byte in
   arch/riscv/lib/uaccess.S and tears on any unaligned post_addr.

3. If an unaligned post_addr straddles a mapped page and an unmapped page,
   put_user() partially overwrites the first page before faulting on the
   second page and returning -EFAULT.

4. On architectures such as MIPS (do_ade() in arch/mips/kernel/unaligned.c
   when unaligned_action == UNALIGNED_ACTION_SIGNAL) and LoongArch (do_ale()
   in arch/loongarch/kernel/traps.c when unaligned emulation is disabled or
   absent), an unaligned put_user() traps in kernel mode and calls
   die_if_kernel() without running fixup_exception().

-- 
Sashiko AI review · https://sashiko.dev/#/patchset/20261027180903.1008-1-thanos.makatos@nutanix.com?part=1

  reply	other threads:[~2026-10-27 18:34 UTC|newest]

Thread overview: 28+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-03-06 12:56 [PATCH] KVM: optionally post write on ioeventfd write Thanos Makatos
2026-03-12 15:02 ` David Woodhouse
2026-03-12 16:12   ` Thanos Makatos
2026-04-21 14:44     ` Sean Christopherson
2026-09-19 15:59       ` David Woodhouse
2026-03-23 15:01 ` Thanos Makatos
2026-04-10 19:11   ` Thanos Makatos
2026-04-21 14:45     ` Sean Christopherson
2026-06-10  7:31       ` John Levon
2026-09-22 13:51 ` Stefan Hajnoczi
2026-09-22 15:28   ` David Woodhouse
2026-09-22 16:47     ` Sean Christopherson
2026-10-04 16:16   ` David Woodhouse
2026-10-05  5:11     ` Sean Christopherson
2026-10-15  8:44     ` David Woodhouse
2026-10-15 18:23       ` Stefan Hajnoczi
2026-10-15 18:43         ` David Woodhouse
2026-10-19 19:48           ` Stefan Hajnoczi
2026-10-26 19:29         ` Thanos Makatos
2026-09-22 17:03 ` Sean Christopherson
2026-10-27 17:50   ` Thanos Makatos
2026-10-27 18:09   ` [PATCH v2] " Thanos Makatos
2026-10-27 18:34     ` sashiko-bot [this message]
2026-10-28  8:32       ` Thanos Makatos
2026-10-28 13:09     ` Stefan Hajnoczi
2026-10-28 16:22       ` Thanos Makatos
2026-10-28 16:47     ` [PATCH v3] " Thanos Makatos
2026-10-28 18:39       ` Stefan Hajnoczi

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=sashiko-outbox-187032@kernel.org \
    --to=sashiko-bot@kernel.org \
    --cc=kvm@vger.kernel.org \
    --cc=sashiko-reviews@lists.linux.dev \
    --cc=thanos.makatos@nutanix.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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.