All of lore.kernel.org
 help / color / mirror / Atom feed
From: Oleksii Kurochko <oleksii.kurochko@gmail.com>
To: Baptiste Le Duc <baptiste.le-duc@vates.tech>
Cc: xen-devel@lists.xenproject.org,
	"Romain Caritey" <Romain.Caritey@microchip.com>,
	"Zheng Zhang" <zhangzheng@iscas.ac.cn>,
	"Alistair Francis" <alistair.francis@wdc.com>,
	"Connor Davis" <connojdavis@gmail.com>,
	"Andrew Cooper" <andrew.cooper3@citrix.com>,
	"Anthony PERARD" <anthony.perard@vates.tech>,
	"Michal Orzel" <michal.orzel@amd.com>,
	"Jan Beulich" <jbeulich@suse.com>,
	"Julien Grall" <julien@xen.org>,
	"Roger Pau Monné" <roger@xenproject.org>,
	"Stefano Stabellini" <sstabellini@kernel.org>
Subject: Re: [PATCH v3 35/39] xen/riscv: wake up a descheduled vCPU on a guest external interrupt
Date: Fri, 6 Nov 2026 11:58:44 +0100	[thread overview]
Message-ID: <41f3a77d-0fda-4f43-adb8-27fc2d92b57f@gmail.com> (raw)
In-Reply-To: <1793788661.8631fc262581453bbf619ec5b2062170.1a1a622ce02000403d@vates.tech>



On 11/4/26 11:37 AM, Baptiste Le Duc wrote:
>> While a vCPU is running, MSIs written to its h/w IMSIC guest interrupt
>> file are delivered straight to VS-mode. Once the vCPU is descheduled
>> nobody observes that file anymore, so a guest blocked on such an
>> interrupt would stay blocked until some unrelated event happens to
>> schedule it again.
>>
>> Let Xen observe the file in that window: on deschedule set the vCPU's
>> bit in HGEIE, which turns an interrupt pending in its VS-file into an
>> HS-level SGEI, and clear the bit again on schedule-in. HGEIP only
>> reports an interrupt file number, so to find the vCPU to kick, keep a
>> per-pCPU owners[] array indexed by file number and updated in
>> vgein_assign()/vgein_release() together with the VGEIN bitmap. The SGEI
>> handler clears the HGEIE bits it has seen before kicking their owners,
>> so that the interrupt doesn't keep firing until the vCPU is switched in.
> 
> Please explain why this is enough for a descheduled
> vCPU to never miss a wake-up: an interrupt pending in a VS-file always
> shows up in HGEIP, but it reaches VS-mode only if hstatus.VGEIN selects
> that file, and traps to Xen as an SGEI only if the file's HGEIE bit is
> set. While the vCPU is descheduled, HGEIE is therefore Xen's only way to
> notice it. And as HGEIP reflects the file's current state rather than
> being latched, an interrupt which arrived before the bit got set still
> raises the SGEI once it is.

Will add, thanks.

>> [ ... 49 lines skipped ... ]
> 
>> --- a/xen/arch/riscv/aia.c
>> +++ b/xen/arch/riscv/aia.c
>> @@ -18,6 +18,13 @@ struct vgein_ctrl {
>>       /* The least-significant bits are implemented first, apart from bit 0 */
>>       unsigned long bmp;
>>       spinlock_t lock;
>> +    /*
>> +     * Guest interrupt file IDs run from 1 to geilen inclusive (0 means that
>> +     * no guest external interrupt source is selected), and geilen can never
>> +     * exceed BITS_PER_LONG - 1, so indexing this array by the ID directly
>> +     * always fits.
>> +     */
>> +    struct vcpu *owners[BITS_PER_LONG];
> 
> It looks like owners[] already carries the information bmp provides.
> Couldn't we drop bmp and use owners[] alone, with owners[i] == NULL
> meaning that file i is free? That would avoid having to keep the two in
> sync, and vgein_release() could then check ASSERT(owners[id] == v)
> rather than just that the bit was set. A linear scan over 1..geilen in
> vgein_assign() should be fine given geilen < BITS_PER_LONG.
> 
> If you agree, it would probably be cleaner to introduce owners[] in
> place of bmp in the earlier "add basic VGEIN management" patch, rather
> than adding bmp there and replacing it here.

It would work, but I'd rather keep bmp: it's updated together with
owners[], under the same lock, in vgein_assign() and vgein_release()
only, so there isn't much to keep in sync. It also keeps the state of
all the files in a single word, so a free VGEIN ID is found with a
single find_next_zero_bit() rather than by iterating over owners[] (but 
I could agree that likely not a big win), and the debug output can print 
it as is.

The stronger check in vgein_release() is a good idea regardless, so I'll
add ASSERT(vgein->owners[vgein_id] == v) here.

>> [ ... 26 lines skipped ... ]
>> +
>> +void hgei_interrupt(void)
>> +{
>> +    unsigned long hgei_mask, flags;
>> +    struct vgein_ctrl *vgein = &this_cpu(vgein);
>> +
>> +    hgei_mask = csr_read(CSR_HGEIP);
>> +    hgei_mask &= csr_read(CSR_HGEIE);
>> +
>> +    csr_clear(CSR_HGEIE, hgei_mask);
>> +
>> +    spin_lock_irqsave(&vgein->lock, flags);
>> +
>> +    /*
>> +     * Bit 0 of HGEIP/HGEIE is read-only zero: guest interrupt file ID 0
>> +     * means that no guest external interrupt source is selected.
>> +     */
>> +    ASSERT(!(hgei_mask & 1));
> 
> Is this ASSERT() really needed? Bit 0 of HGEIP/HGEIE is read-only zero
> per the spec, and vgein_init() already relies on that when computing
> geilen. Even if it were ever reported, owners[0] is never assigned, so
> the loop below would simply skip it.

Agreed, lets drop it.

>> [ ... 35 lines skipped ... ]
>> --- a/xen/arch/riscv/imsic.c
>> +++ b/xen/arch/riscv/imsic.c
>> @@ -555,12 +555,37 @@ void cf_check imsic_ctxt_switch_from(struct vcpu *p)
>>   
>>       write_lock_irqsave(&imsic_state->vsfile_lock, flags);
>>       imsic_state->vsfile_cpu = p->processor;
>> +    /*
>> +     * Start to observe the VS-file from HS-mode: while the vCPU isn't
>> +     * running an interrupt pending in its VS-file is reported through HGEIP
>> +     * instead of being delivered to VS-mode, which lets Xen wake the vCPU up.
> 
> "instead of" reads as if HGEIP only reports it while the vCPU isn't
> running. It always does; what changes is that VGEIN no longer selects
> the file and the HGEIE bit set below turns it into an SGEI.
> 

Right, I'll reword it accordingly.

>> [ ... 29 lines skipped ... ]
>>   int imsic_map_guest_file(struct vcpu *v, unsigned int vsfile_id)
>> @@ -695,6 +720,12 @@ static void cf_check imsic_vsfile_local_read_clear(void *data)
>>       struct imsic_mrif *mrif = idata->mrif;
>>       unsigned long new_hstatus, old_hstatus, old_vsiselect;
>>   
>> +    /*
>> +     * The HGEIE bit imsic_ctxt_switch_from() armed belongs to the old owner
>> +     * only.
>> +     */
> "Old owner" is ambiguous: it reads like another vCPU, but it's the same
> vCPU on the file it is leaving. To mirror imsic_local_hgeie_set(), I'd
> rather have an imsic_local_hgeie_clear() called from here, documenting
> the pairing the same way, e.g.:
> 
> /*
>   * Stop observing an interrupt file which a vCPU leaves when it moves to
>   * another pCPU by clearing the bit imsic_ctxt_switch_from() set.
>   *
>   * Counterpart of imsic_local_hgeie_set() for the new file.
>   */
> 
> In that case ...
>> +    csr_clear(CSR_HGEIE, BIT(idata->hgei, UL));
>> +
>>       /*
>>        * The file is reached by retargeting hstatus.VGEIN, and
>>        * imsic_vs_csr_swap() alters vsiselect. Both belong to the vCPU running
>> @@ -1044,6 +1075,21 @@ int __init vimsic_make_domu_dt_node(struct kernel_info *kinfo,
>>       return fdt_end_node(fdt);
>>   }
>>   
>> +/*
>> + * Start to observe the interrupt file from HS-mode, the same way
>> + * imsic_ctxt_switch_from() does it for a vCPU which is switched out.
>> + *
>> + * The counterpart, clearing the bit of the interrupt file which is left
>> + * behind, is done by imsic_vsfile_local_read_clear(), which already runs on
>> + * the pCPU owning that file.
>   ... this wouldn't be needed at all.
> 

Agreed, I'll introduce imsic_local_hgeie_clear() next to
imsic_local_hgeie_set(), with your comment. It'll take the file number
rather than void *, though, as it's called directly from
imsic_vsfile_local_read_clear() and not through imsic_call_on_cpu().

~ Oleksii


  reply	other threads:[~2026-11-06 10:59 UTC|newest]

Thread overview: 152+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-09-30 16:18 [PATCH v3 00/39] [PATCH v2 00/39] [RISC-V] virtual interrupt controller (vAPLIC/vIMSIC) support Oleksii Kurochko
2026-09-30 16:18 ` [PATCH v3 01/39] xen/riscv: drop INSN_{16,32}BIT_MASK and report unknown instruction lengths Oleksii Kurochko
2026-10-05 10:01   ` Baptiste Le Duc
2026-10-08 14:35     ` Jan Beulich
2026-09-30 16:18 ` [PATCH v3 02/39] xen/riscv: set the domain type for 64-bit kernel images Oleksii Kurochko
2026-10-05 10:01   ` Baptiste Le Duc
2026-10-08 14:36     ` Jan Beulich
2026-09-30 16:18 ` [PATCH v3 03/39] xen/riscv: introduce csr_volatile_read64() Oleksii Kurochko
2026-10-05 10:01   ` Baptiste Le Duc
2026-10-09 13:29     ` Oleksii Kurochko
2026-10-08 14:46   ` Jan Beulich
2026-10-09 14:00     ` Oleksii Kurochko
2026-10-09 14:19       ` Jan Beulich
2026-09-30 16:18 ` [PATCH v3 04/39] xen/riscv: request a G-stage flush on vmenter when VMIDs are disabled Oleksii Kurochko
2026-10-05 10:01   ` Baptiste Le Duc
2026-10-08 14:53     ` Jan Beulich
2026-09-30 16:18 ` [PATCH v3 05/39] xen/riscv: use ~0 instead of ULONG_MAX to disable the VS-timer Oleksii Kurochko
2026-10-08 14:54   ` Jan Beulich
2026-09-30 16:18 ` [PATCH v3 06/39] xen/riscv: introduce device-agnostic MMIO emulation dispatch Oleksii Kurochko
2026-10-05 10:01   ` Baptiste Le Duc
2026-10-08 14:57     ` Jan Beulich
2026-10-12 13:51       ` Oleksii Kurochko
2026-10-12 13:50     ` Oleksii Kurochko
2026-10-12 15:28   ` Jan Beulich
2026-10-14 10:51     ` Oleksii Kurochko
2026-09-30 16:18 ` [PATCH v3 07/39] xen/riscv: introduce CPU_NONE Oleksii Kurochko
2026-10-05 14:53   ` Baptiste Le Duc
2026-10-12 14:27     ` Oleksii Kurochko
2026-10-12 15:40   ` Jan Beulich
2026-10-14 11:35     ` Oleksii Kurochko
2026-09-30 16:18 ` [PATCH v3 08/39] xen/riscv: implement virtual APLIC MMIO emulation Oleksii Kurochko
2026-10-05 14:53   ` Baptiste Le Duc
2026-10-13 16:06     ` Oleksii Kurochko
2026-10-14  6:16       ` Jan Beulich
2026-10-14 11:45         ` Oleksii Kurochko
2026-10-14 13:52   ` Jan Beulich
2026-10-15 14:57     ` Oleksii Kurochko
2026-09-30 16:18 ` [PATCH v3 09/39] xen/riscv: build the target hart index via aplic_hart_index() Oleksii Kurochko
2026-10-06  9:02   ` Baptiste Le Duc
2026-10-14 13:42     ` Oleksii Kurochko
2026-10-14 14:03   ` Jan Beulich
2026-10-15  8:32     ` Oleksii Kurochko
2026-09-30 16:23 ` [PATCH v3 10/39] xen/riscv: add helper to check APLIC MSI mode Oleksii Kurochko
2026-09-30 16:23 ` [PATCH v3 11/39] xen/riscv: implement vCPU context switching Oleksii Kurochko
2026-10-06 16:50   ` Baptiste Le Duc
2026-10-07  8:04     ` Jan Beulich
2026-10-07  8:27       ` Baptiste Le Duc
2026-10-14 14:05     ` Oleksii Kurochko
2026-11-10 15:52   ` Jan Beulich
2026-11-12 11:00     ` Oleksii Kurochko
2026-09-30 16:23 ` [PATCH v3 12/39] xen/riscv: save and restore vsiselect on vCPU context switch Oleksii Kurochko
2026-10-07  8:53   ` Baptiste Le Duc
2026-10-14 14:53     ` Oleksii Kurochko
2026-11-10 16:46     ` Jan Beulich
2026-09-30 16:23 ` [PATCH v3 13/39] xen/riscv: introduce vintc_ctxt_switch_{from,to}() Oleksii Kurochko
2026-10-07  9:11   ` Baptiste Le Duc
2026-09-30 16:23 ` [PATCH v3 14/39] xen/riscv: add IMSIC vCPU context switch handlers Oleksii Kurochko
2026-10-08  9:54   ` Baptiste Le Duc
2026-10-14 15:12     ` Oleksii Kurochko
2026-11-10 16:49   ` Jan Beulich
2026-09-30 16:23 ` [PATCH v3 15/39] xen/riscv: extend exception tables with type and data fields Oleksii Kurochko
2026-10-20 14:59   ` Baptiste Le Duc
2026-11-04 11:00     ` Oleksii Kurochko
2026-09-30 16:23 ` [PATCH v3 16/39] xen/riscv: decouple INSN_PSEUDO_VS_* from the hypervisor's XLEN Oleksii Kurochko
2026-10-20 14:59   ` Baptiste Le Duc
2026-11-10 16:52   ` Jan Beulich
2026-09-30 16:23 ` [PATCH v3 17/39] xen/riscv: add guest page fault handling stub Oleksii Kurochko
2026-10-20 14:59   ` Baptiste Le Duc
2026-11-04 11:33     ` Oleksii Kurochko
2026-09-30 16:23 ` [PATCH v3 18/39] xen/riscv: implement trap redirection to a guest Oleksii Kurochko
2026-10-20 15:22   ` Baptiste Le Duc
     [not found]   ` <179250973602.489973.14893581320042795275.b4-review@b4>
2026-10-20 15:25     ` Baptiste Le Duc
2026-11-04 11:41       ` Oleksii Kurochko
2026-09-30 16:23 ` [PATCH v3 19/39] xen/riscv: detect Shtvala Oleksii Kurochko
2026-10-20 15:26   ` Baptiste Le Duc
2026-11-10 16:53     ` Jan Beulich
2026-09-30 16:23 ` [PATCH v3 20/39] xen/riscv: resolve the faulting guest physical address Oleksii Kurochko
2026-10-21 11:45   ` Baptiste Le Duc
2026-11-04 11:49     ` Oleksii Kurochko
2026-09-30 16:23 ` [PATCH v3 21/39] xen/riscv: add guest memory read helper Oleksii Kurochko
2026-10-21 14:56   ` Baptiste Le Duc
2026-11-04 12:25     ` Oleksii Kurochko
2026-10-21 15:11   ` Baptiste Le Duc
2026-11-04 12:39     ` Oleksii Kurochko
2026-11-04 13:28       ` Jan Beulich
2026-11-04 15:25         ` Oleksii Kurochko
2026-09-30 16:23 ` [PATCH v3 22/39] xen/riscv: look up the exception table for any trap taken in Xen context Oleksii Kurochko
2026-10-21 15:28   ` Baptiste Le Duc
2026-09-30 16:23 ` [PATCH v3 23/39] xen/riscv: add helpers for decoding a trapped load or store Oleksii Kurochko
2026-10-22 10:02   ` Baptiste Le Duc
2026-11-04 16:38     ` Oleksii Kurochko
2026-11-05  8:17       ` Jan Beulich
2026-11-05  8:48         ` Oleksii Kurochko
2026-11-05  9:35       ` Baptiste Le Duc
2026-09-30 16:23 ` [PATCH v3 24/39] xen/riscv: add guest load emulation for trapped MMIO accesses Oleksii Kurochko
2026-10-15 14:59   ` Oleksii Kurochko
2026-10-22 12:13     ` Baptiste Le Duc
2026-11-04 16:44       ` Oleksii Kurochko
2026-10-22 12:30     ` Baptiste Le Duc
2026-11-04 16:46       ` Oleksii Kurochko
2026-09-30 16:23 ` [PATCH v3 25/39] xen/riscv: add guest store " Oleksii Kurochko
2026-10-22 12:37   ` Baptiste Le Duc
2026-11-04 16:51     ` Oleksii Kurochko
2026-09-30 16:23 ` [PATCH v3 26/39] xen/riscv: introduce arch_move_irqs() Oleksii Kurochko
2026-09-30 16:23 ` [PATCH v3 27/39] xen/riscv: handle the case when no vCPU migration is needed Oleksii Kurochko
2026-10-22 12:39   ` Baptiste Le Duc
2026-09-30 16:23 ` [PATCH v3 28/39] xen/riscv: introduce vaplic_reconfigure_target() Oleksii Kurochko
2026-10-22 13:38   ` Baptiste Le Duc
2026-11-05 11:43     ` Oleksii Kurochko
2026-09-30 16:23 ` [PATCH v3 29/39] xen/riscv: prepare new IMSIC VS-file Oleksii Kurochko
2026-10-23 12:55   ` Baptiste Le Duc
2026-11-05 12:49     ` Oleksii Kurochko
2026-11-05 15:27       ` Baptiste Le Duc
2026-11-05 16:41         ` Oleksii Kurochko
2026-09-30 16:23 ` [PATCH v3 30/39] xen/riscv: implement APLIC-IMSIC-hart sync barrier for vCPU migration Oleksii Kurochko
2026-10-06 14:25   ` Oleksii Kurochko
2026-10-23 13:51     ` Baptiste Le Duc
2026-11-05 14:21       ` Oleksii Kurochko
2026-11-05 15:32         ` Baptiste Le Duc
2026-11-05 15:49           ` Oleksii Kurochko
2026-11-05 15:59             ` Baptiste Le Duc
2026-11-05 16:26               ` Oleksii Kurochko
2026-09-30 16:23 ` [PATCH v3 31/39] xen/riscv: remap interrupts to new IMSIC VS-file Oleksii Kurochko
2026-10-26 14:06   ` Baptiste Le Duc
2026-11-05 16:57     ` Oleksii Kurochko
2026-11-06 13:26       ` Baptiste Le Duc
2026-11-09 10:19         ` Oleksii Kurochko
2026-11-09 15:01           ` Oleksii Kurochko
2026-11-09 15:22             ` Baptiste Le Duc
2026-09-30 16:23 ` [PATCH v3 32/39] xen/riscv: save and clear the old IMSIC VS-file on vCPU migration Oleksii Kurochko
2026-11-03 16:02   ` Baptiste Le Duc
2026-11-06  9:52     ` Oleksii Kurochko
2026-11-06 13:31       ` Baptiste Le Duc
2026-09-30 16:23 ` [PATCH v3 33/39] xen/riscv: restore register state in the new IMSIC VS-file Oleksii Kurochko
2026-11-03 16:45   ` Baptiste Le Duc
2026-11-06 10:04     ` Oleksii Kurochko
2026-11-06 13:33       ` Baptiste Le Duc
2026-09-30 16:23 ` [PATCH v3 34/39] xen/riscv: add basic VGEIN management for AIA guests Oleksii Kurochko
2026-09-30 16:23 ` [PATCH v3 35/39] xen/riscv: wake up a descheduled vCPU on a guest external interrupt Oleksii Kurochko
2026-11-04 10:37   ` Baptiste Le Duc
2026-11-06 10:58     ` Oleksii Kurochko [this message]
2026-09-30 16:23 ` [PATCH v3 36/39] xen/riscv: map IMSIC interrupt file for vCPUs Oleksii Kurochko
2026-09-30 16:23 ` [PATCH v3 37/39] xen/riscv: implement continue_new_vcpu() Oleksii Kurochko
2026-11-04 14:00   ` Baptiste Le Duc
2026-11-06 11:31     ` Oleksii Kurochko
2026-09-30 16:23 ` [PATCH v3 38/39] xen/riscv: set the guest's XLEN explicitly in hstatus.VSXL Oleksii Kurochko
2026-11-04 14:37   ` Baptiste Le Duc
2026-11-06 11:59     ` Oleksii Kurochko
2026-11-06 13:43       ` Baptiste Le Duc
2026-09-30 16:23 ` [PATCH v3 39/39] xen/riscv: introduce IMSIC h/w interrupt file attaching to vcpu Oleksii Kurochko
2026-11-04 15:06   ` Baptiste Le Duc
2026-11-06 12:31     ` Oleksii Kurochko

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=41f3a77d-0fda-4f43-adb8-27fc2d92b57f@gmail.com \
    --to=oleksii.kurochko@gmail.com \
    --cc=Romain.Caritey@microchip.com \
    --cc=alistair.francis@wdc.com \
    --cc=andrew.cooper3@citrix.com \
    --cc=anthony.perard@vates.tech \
    --cc=baptiste.le-duc@vates.tech \
    --cc=connojdavis@gmail.com \
    --cc=jbeulich@suse.com \
    --cc=julien@xen.org \
    --cc=michal.orzel@amd.com \
    --cc=roger@xenproject.org \
    --cc=sstabellini@kernel.org \
    --cc=xen-devel@lists.xenproject.org \
    --cc=zhangzheng@iscas.ac.cn \
    /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.