All of lore.kernel.org
 help / color / mirror / Atom feed
From: Oleksii Kurochko <oleksii.kurochko@gmail.com>
To: Jan Beulich <jbeulich@suse.com>
Cc: "Romain Caritey" <Romain.Caritey@microchip.com>,
	"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>,
	"Julien Grall" <julien@xen.org>,
	"Roger Pau Monné" <roger.pau@citrix.com>,
	"Stefano Stabellini" <sstabellini@kernel.org>,
	xen-devel@lists.xenproject.org
Subject: Re: [PATCH v1 16/27] xen/riscv: implement IRQ mapping for device passthrough
Date: Mon, 20 Apr 2026 17:31:22 +0200	[thread overview]
Message-ID: <6042263f-49e5-4139-978f-38cb10769c0e@gmail.com> (raw)
In-Reply-To: <0ccf093f-cc2a-4729-bf8f-b39bf73fd202@suse.com>



On 4/20/26 5:21 PM, Jan Beulich wrote:
> On 20.04.2026 16:34, Oleksii Kurochko wrote:
>>
>>
>> On 4/20/26 3:45 PM, Jan Beulich wrote:
>>> On 20.04.2026 13:39, Oleksii Kurochko wrote:
>>>> On 4/16/26 2:51 PM, Jan Beulich wrote:
>>>>> On 14.04.2026 13:29, Oleksii Kurochko wrote:
>>>>>> On 4/2/26 2:22 PM, Jan Beulich wrote:
>>>>>>> On 10.03.2026 18:08, Oleksii Kurochko wrote:
>>>>>>>> +int vaplic_map_device_irqs_to_domain(struct domain *d,
>>>>>>>> +                                     struct dt_device_node *dev,
>>>>>>>> +                                     bool need_mapping,
>>>>>>>> +                                     struct rangeset *irq_ranges)
>>>>>>>> +{
>>>>>>>> +    unsigned int i, nirq;
>>>>>>>> +    int res, irq;
>>>>>>>> +    struct dt_raw_irq rirq;
>>>>>>>> +    uint32_t *auth_irq_bmp = d->arch.vintc->private;
>>>>>>>> +    unsigned int reg_num;
>>>>>>>> +
>>>>>>>> +    nirq = dt_number_of_irq(dev);
>>>>>>>> +
>>>>>>>> +    /* Give permission and map IRQs */
>>>>>>>> +    for ( i = 0; i < nirq; i++ )
>>>>>>>> +    {
>>>>>>>> +        res = dt_device_get_raw_irq(dev, i, &rirq);
>>>>>>>> +        if ( res )
>>>>>>>> +        {
>>>>>>>> +            printk(XENLOG_ERR "Unable to retrieve irq %u for %s\n",
>>>>>>>> +                   i, dt_node_full_name(dev));
>>>>>>>> +            return res;
>>>>>>>> +        }
>>>>>>>> +
>>>>>>>> +        /*
>>>>>>>> +         * Don't map IRQ that have no physical meaning
>>>>>>>> +         * ie: IRQ whose controller is not APLIC/IMSIC/PLIC.
>>>>>>>> +         */
>>>>>>>> +        if ( rirq.controller != dt_interrupt_controller )
>>>>>>>> +        {
>>>>>>>> +            dt_dprintk("irq %u not connected to primary controller."
>>>>>>>> +                       "Connected to %s\n", i,
>>>>>>>> +                       dt_node_full_name(rirq.controller));
>>>>>>>> +            continue;
>>>>>>>> +        }
>>>>>>>> +
>>>>>>>> +        irq = platform_get_irq(dev, i);
>>>>>>>> +        if ( irq < 0 )
>>>>>>>> +        {
>>>>>>>> +            printk("Unable to get irq %u for %s\n", i, dt_node_full_name(dev));
>>>>>>>> +            return irq;
>>>>>>>> +        }
>>>>>>>> +
>>>>>>>> +        res = irq_permit_access(d, irq);
>>>>>>>> +        if ( res )
>>>>>>>> +        {
>>>>>>>> +            printk(XENLOG_ERR "Unable to permit to %pd access to IRQ %u\n", d,
>>>>>>>> +                   irq);
>>>>>>> This time the other way around: %d please with plain int. (Again at least
>>>>>>> once further down.)
>>>>>>>
>>>>>>>> +            return res;
>>>>>>>> +        }
>>>>>>>> +
>>>>>>>> +        reg_num = irq / APLIC_NUM_REGS;
>>>>>>>> +
>>>>>>>> +        if ( is_irq_shared_among_domains(d, irq) )
>>>>>>>> +        {
>>>>>>>> +            printk("%s: Shared IRQ isn't supported\n", __func__);
>>>>>>>> +            return -EINVAL;
>>>>>>>> +        }
>>>>>>>> +
>>>>>>>> +        auth_irq_bmp[reg_num] |= BIT(irq % APLIC_NUM_REGS, U);
>>>>>>> ... all of this leaves me with the impression that IRQ numbering isn't really
>>>>>>> virtualized. IRQs are merely split into groups, one group per domain (and
>>>>>>> maybe some unused). How are you going to fit in truly virtual IRQs?
>>>>>> What do you mean by truly virtual IRQs?
>>>>> Ones where no aspects are represented by any piece of hardware.
>>>>>
>>>>>> I can't totally agree that the current approach isn't use virtual IRQs,
>>>>>> yes, they are 1:1 mapped but on the other side Xen is responsible to
>>>>>> give an IRQ number for guest's device and Xen is responsible that guest
>>>>>> isn't trying to reach IRQ which not belongs to it.
>>>>> In a non-virtualized environment I expect IRQs are going to be "sparse"
>>>>> (i.e. with perhaps large blocks of items used elsewhere). If you had
>>>>> proper translation of IRQ numbers, the same could be true for your
>>>>> guests.
>>>> Partial FDT, which is used to tell which device be passthroughed to
>>>> guest, is using physical IRQ number (which I am just considering for
>>>> simplicity to be 1:1 mapped to virtual IRQ number). So if we have the
>>>> following configuration:
>>>>      Physical (bare-metal) IRQ layout is sparse:
>>>>        IRQ 5  → UART -> domU0
>>>>        IRQ 23 → Ethernet -> domU1
>>>>        IRQ 47 → PCIe -> domU0
>>>>        IRQ 100 → Storage -> domU1
>>>> (gaps everywhere, driven by hardware wiring)
>>>>
>>>> For such configuration we will have for each domain auth_irq_bmp[] which
>>>> contains:
>>>>     IRQ 5 and IRQ47 for domU0
>>>> and
>>>>     IRQ 23 and IRQ 100 for domU1
>>>>
>>>> And here vIRQ5 = pIRQ5, vIRQ47 = pIRQ47 and so on. auth_irq_bmp just
>>>> transform xIRQ number to bit position which it will have in real APLIC
>>>> register. Just as an example, lets take vIRQ5 and vIRQ47.
>>>>
>>>> As reading or writing register setie[k] reads or potentially modifies
>>>> the enable bits for interrupt sources k × 32 through k × 32 + 31. For an
>>>> implemented interrupt source i within that range, the enable bit for
>>>> source i corresponds with register bit (i mod 32).
>>>> So for:
>>>>     - vIRQ5 == pIRQ5 we have to set bit 5 in setie[0]
>>>>     - vIRQ47 == pIRQ47 we have to set bit 15 in setie[1]
>>>>
>>>> Probably it was not the best idea to declare auth_irq_bmp as it will
>>>> look in h/w and maybe just 'bool auth_irq_bmp[1024]' would be more clearer.
>>>>
>>>> So irqs number are still stay "sparsed" in guest.
>>> Well, twice (or more) as sparse in the example you give, compared to the
>>> host.
>>
>> Just to be sure that I fully understand your concern here.
>>
>> The difference between xIRQ5 and xIRQ47 is 42 bits (if for 1 irq we are
>> using 1 bit) which leads to that we have somewhere allocated 48 bit
>> bitmap where only two bits will be set, all others will be zero.
> 
> Why 48-bit bitmap? As you inherit the property from the host, it'll be e.g.
> 1024 bits. Compared to the host, each guest will have yet fewer bits set in
> there.

48-bit bitmap specifically in this example because IRQ47 is the highest 
mentioned here, so if we won't compress zeros between IRQ0-4 and IRQ6-46 
it will be needed 48-bit to cover IRQs from IRQ0 to IRQ47. I thought 
about that as it seems like I misunderstood what you mean by "sparsed in 
guest" and the way how I have to deal with that.

> 
>> Instead it would be better to have to do mapping: pIRQ5 -> vIRQ1, pIRQ47
>> ->vIRQ2, right?
> 
> Which specific mapping I don't care very much. There may also be conventions
> to adhere to (on x86 for example there are).

If just bitmap is okay here ... then I am okay with using it.

> 
>> If yes, won't we still store somewhere this mapping? it seems like
>> having 'unsigned int auth_irq_bmp[1024]' is a good option where index
>> will be vIRQ number and 'unsigned int' will be pIRQ number. But at the
>> moment I think that we could go with 1:1 IRQ number mapping and then
>> have 'bool auth_irq_bmp[1024]' will be more then enough and will safe
>> some memory.
> 
> Well, if using 1:1 mapping was clearly identified as "for the time being",
> then that might be acceptable (for the time being).
> 
> As to you (again) suggesting "bool auth_irq_bmp[1024]" - why would you use
> an array of bool-s when a bitmap can do the same in 1/8th of the space?

... just bitmap will better.

Thanks.

~ Oleksii


  reply	other threads:[~2026-04-20 15:31 UTC|newest]

Thread overview: 123+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-03-10 17:08 [PATCH v1 00/27] [RISC-V] Introduce enablemenant of dom0less Oleksii Kurochko
2026-03-10 17:08 ` [PATCH v1 01/27] xen/riscv: Implement ARCH_PAGING_MEMPOOL Oleksii Kurochko
2026-03-11  8:18   ` Jan Beulich
2026-04-09 10:31     ` Oleksii Kurochko
2026-03-10 17:08 ` [PATCH v1 02/27] xen/riscv: Implement construct_domain() Oleksii Kurochko
2026-03-24  9:37   ` Jan Beulich
2026-04-09 11:26     ` Oleksii Kurochko
2026-04-09 12:58       ` Jan Beulich
2026-04-09 13:39         ` Oleksii Kurochko
2026-04-09 14:01           ` Oleksii Kurochko
2026-04-14  6:26           ` Julien Grall
2026-03-10 17:08 ` [PATCH v1 03/27] xen/riscv: implement prerequisites for domain_create() Oleksii Kurochko
2026-04-01 12:57   ` Jan Beulich
2026-04-09 11:55     ` Oleksii Kurochko
2026-03-10 17:08 ` [PATCH v1 04/27] xen/riscv: rework G-stage mode handling Oleksii Kurochko
2026-04-01 13:19   ` Jan Beulich
2026-04-07 10:47     ` Oleksii Kurochko
2026-04-07 13:43       ` Jan Beulich
2026-03-10 17:08 ` [PATCH v1 05/27] xen/riscv: introduce guest riscv,isa string Oleksii Kurochko
2026-04-01 13:49   ` Jan Beulich
2026-04-10 10:24     ` Oleksii Kurochko
2026-04-10 10:50       ` Jan Beulich
2026-03-10 17:08 ` [PATCH v1 06/27] xen/riscv: implement make_cpus_node() Oleksii Kurochko
2026-04-01 14:11   ` Jan Beulich
2026-04-10 11:19     ` Oleksii Kurochko
2026-04-10 12:02       ` Jan Beulich
2026-03-10 17:08 ` [PATCH v1 07/27] xen/riscv: implement make_timer_node() Oleksii Kurochko
2026-04-01 14:24   ` Jan Beulich
2026-04-10 11:54     ` Oleksii Kurochko
2026-03-10 17:08 ` [PATCH v1 08/27] xen/riscv: implement make_arch_nodes() Oleksii Kurochko
2026-04-01 14:29   ` Jan Beulich
2026-04-10 13:32     ` Oleksii Kurochko
2026-03-10 17:08 ` [PATCH v1 09/27] xen/riscv: implement make_intc_domU_node() Oleksii Kurochko
2026-04-01 14:38   ` Jan Beulich
2026-04-10 14:00     ` Oleksii Kurochko
2026-04-10 14:23       ` Jan Beulich
2026-03-10 17:08 ` [PATCH v1 10/27] xen/riscv: generate IMSIC DT node for guest domains Oleksii Kurochko
2026-04-01 15:05   ` Jan Beulich
2026-04-10 15:40     ` Oleksii Kurochko
2026-04-16 11:42       ` Jan Beulich
2026-04-17  8:10         ` Oleksii Kurochko
2026-04-17 13:50           ` Jan Beulich
2026-04-17 14:01             ` Oleksii Kurochko
2026-04-17 14:10               ` Jan Beulich
2026-03-10 17:08 ` [PATCH v1 11/27] xen/riscv: create APLIC " Oleksii Kurochko
2026-04-01 15:16   ` Jan Beulich
2026-04-13  8:43     ` Oleksii Kurochko
2026-04-13  8:48       ` Oleksii Kurochko
2026-04-16 11:49       ` Jan Beulich
2026-04-17  9:01         ` Oleksii Kurochko
2026-04-17 13:53           ` Jan Beulich
2026-04-17 14:27             ` Oleksii Kurochko
2026-03-10 17:08 ` [PATCH v1 12/27] xen/riscv: introduce aia_init() and aia_available() Oleksii Kurochko
2026-04-02  9:00   ` Jan Beulich
2026-04-13  9:32     ` Oleksii Kurochko
2026-04-16 12:06       ` Jan Beulich
2026-04-17  9:37         ` Oleksii Kurochko
2026-03-10 17:08 ` [PATCH v1 13/27] xen/riscv: add basic VGEIN management for AIA guests Oleksii Kurochko
2026-04-02 10:03   ` Jan Beulich
2026-04-13 14:42     ` Oleksii Kurochko
2026-04-16 12:21       ` Jan Beulich
2026-04-17 11:34         ` Oleksii Kurochko
2026-04-17 14:07           ` Jan Beulich
2026-04-20  7:52             ` Oleksii Kurochko
2026-03-10 17:08 ` [PATCH v1 14/27] xen/riscv: introduce per-vCPU IMSIC state Oleksii Kurochko
2026-04-02 11:31   ` Jan Beulich
2026-04-14  9:22     ` Oleksii Kurochko
2026-04-16 12:31       ` Jan Beulich
2026-04-16 12:31       ` Jan Beulich
2026-04-17 13:47         ` Oleksii Kurochko
2026-04-20  8:29           ` Jan Beulich
2026-03-10 17:08 ` [PATCH v1 15/27] xen/riscv: add very early virtual APLIC (vAPLIC) initialization support Oleksii Kurochko
2026-04-02 11:58   ` Jan Beulich
2026-04-14 10:27     ` Oleksii Kurochko
2026-04-16 12:42       ` Jan Beulich
2026-04-20 10:25         ` Oleksii Kurochko
2026-04-20 10:47           ` Jan Beulich
2026-03-10 17:08 ` [PATCH v1 16/27] xen/riscv: implement IRQ mapping for device passthrough Oleksii Kurochko
2026-04-02 12:22   ` Jan Beulich
2026-04-14 11:29     ` Oleksii Kurochko
2026-04-16 12:51       ` Jan Beulich
2026-04-20 11:39         ` Oleksii Kurochko
2026-04-20 13:45           ` Jan Beulich
2026-04-20 14:34             ` Oleksii Kurochko
2026-04-20 15:21               ` Jan Beulich
2026-04-20 15:31                 ` Oleksii Kurochko [this message]
2026-03-10 17:08 ` [PATCH v1 17/27] xen/riscv: add missing APLIC register offsets, masks to asm/aplic.h Oleksii Kurochko
2026-04-02 12:51   ` Jan Beulich
2026-04-14 11:42     ` Oleksii Kurochko
2026-03-10 17:08 ` [PATCH v1 18/27] xen/riscv: add vaplic access check Oleksii Kurochko
2026-04-02 13:10   ` Jan Beulich
2026-04-14 11:45     ` Oleksii Kurochko
2026-04-15  7:35       ` Oleksii Kurochko
2026-04-16 13:01       ` Jan Beulich
2026-04-20 11:53         ` Oleksii Kurochko
2026-04-20 12:03           ` Jan Beulich
2026-03-10 17:08 ` [PATCH v1 19/27] xen/riscv: emulate guest writes to virtual APLIC MMIO Oleksii Kurochko
2026-04-02 14:18   ` Jan Beulich
2026-04-14 16:04     ` Oleksii Kurochko
2026-04-16 13:19       ` Jan Beulich
2026-04-20 15:02         ` Oleksii Kurochko
2026-04-20 15:27           ` Jan Beulich
2026-03-10 17:08 ` [PATCH v1 20/27] xen/riscv: emulate guest reads from " Oleksii Kurochko
2026-03-10 17:08 ` [PATCH v1 21/27] xen/riscv: introduce (de)initialization helpers for vINTC Oleksii Kurochko
2026-04-02 14:58   ` Jan Beulich
2026-04-15  7:50     ` Oleksii Kurochko
2026-04-16 13:23       ` Jan Beulich
2026-03-10 17:08 ` [PATCH v1 22/27] xen/riscv: implement init_intc_phandle() Oleksii Kurochko
2026-04-02 15:00   ` Jan Beulich
2026-03-10 17:08 ` [PATCH v1 23/27] xen/riscv: call do_initcalls() in start_xen() Oleksii Kurochko
2026-04-02 15:01   ` Jan Beulich
2026-03-10 17:08 ` [PATCH v1 24/27] xen/riscv: init rcu Oleksii Kurochko
2026-04-02 15:03   ` Jan Beulich
2026-04-14 11:50     ` Oleksii Kurochko
2026-03-10 17:08 ` [PATCH v1 25/27] xen/riscv: setup system domains Oleksii Kurochko
2026-03-10 17:08 ` [PATCH v1 26/27] xen/riscv: provide init_vuart() Oleksii Kurochko
2026-04-07 13:52   ` Jan Beulich
2026-03-10 17:09 ` [PATCH v1 27/27] xen/riscv: add initial dom0less infrastructure support Oleksii Kurochko
2026-04-07 14:11   ` Jan Beulich
2026-04-15 10:00     ` Oleksii Kurochko
2026-04-16 14:13       ` Jan Beulich
2026-04-15 10:28     ` Oleksii Kurochko
2026-04-16 14:15       ` Jan Beulich

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=6042263f-49e5-4139-978f-38cb10769c0e@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=connojdavis@gmail.com \
    --cc=jbeulich@suse.com \
    --cc=julien@xen.org \
    --cc=michal.orzel@amd.com \
    --cc=roger.pau@citrix.com \
    --cc=sstabellini@kernel.org \
    --cc=xen-devel@lists.xenproject.org \
    /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.