* [PATCH] irqchip/riscv-imsic: Adjust vs irq files num according to MMIO resources
@ 2025-12-20 8:55 Xu Lu
2025-12-20 9:03 ` Xu Lu
0 siblings, 1 reply; 3+ messages in thread
From: Xu Lu @ 2025-12-20 8:55 UTC (permalink / raw)
To: anup, atish.patra, pjw, palmer, aou, alex, tglx
Cc: kvm, kvm-riscv, linux-riscv, linux-kernel, Xu Lu
During initialization, kernel maps the MMIO resources of IMSIC, which is
parsed from ACPI or DTS and may not strictly contains all guest
interrupt files. Page fault happens when KVM wrongly allocates an
unmapped guest interrupt file and writes it.
Thus, during initialization, we calculate the number of available guest
interrupt files according to MMIO resources and constrain the number of
guest interrupt files that can be allocated by KVM.
Signed-off-by: Xu Lu <luxu.kernel@bytedance.com>
---
arch/riscv/kvm/aia.c | 2 +-
drivers/irqchip/irq-riscv-imsic-state.c | 7 ++++++-
include/linux/irqchip/riscv-imsic.h | 3 +++
3 files changed, 10 insertions(+), 2 deletions(-)
diff --git a/arch/riscv/kvm/aia.c b/arch/riscv/kvm/aia.c
index dad3181856600..7b1f6adcf22d6 100644
--- a/arch/riscv/kvm/aia.c
+++ b/arch/riscv/kvm/aia.c
@@ -630,7 +630,7 @@ int kvm_riscv_aia_init(void)
*/
if (gc)
kvm_riscv_aia_nr_hgei = min((ulong)kvm_riscv_aia_nr_hgei,
- BIT(gc->guest_index_bits) - 1);
+ BIT(gc->nr_guest_files) - 1);
else
kvm_riscv_aia_nr_hgei = 0;
diff --git a/drivers/irqchip/irq-riscv-imsic-state.c b/drivers/irqchip/irq-riscv-imsic-state.c
index dc95ad856d80a..1e982ce024a47 100644
--- a/drivers/irqchip/irq-riscv-imsic-state.c
+++ b/drivers/irqchip/irq-riscv-imsic-state.c
@@ -794,7 +794,7 @@ static int __init imsic_parse_fwnode(struct fwnode_handle *fwnode,
int __init imsic_setup_state(struct fwnode_handle *fwnode, void *opaque)
{
- u32 i, j, index, nr_parent_irqs, nr_mmios, nr_handlers = 0;
+ u32 i, j, index, nr_parent_irqs, nr_mmios, nr_guest_files, nr_handlers = 0;
struct imsic_global_config *global;
struct imsic_local_config *local;
void __iomem **mmios_va = NULL;
@@ -888,6 +888,7 @@ int __init imsic_setup_state(struct fwnode_handle *fwnode, void *opaque)
}
/* Configure handlers for target CPUs */
+ global->nr_guest_files = BIT(global->guest_index_bits) - 1;
for (i = 0; i < nr_parent_irqs; i++) {
rc = imsic_get_parent_hartid(fwnode, i, &hartid);
if (rc) {
@@ -928,6 +929,10 @@ int __init imsic_setup_state(struct fwnode_handle *fwnode, void *opaque)
local->msi_pa = mmios[index].start + reloff;
local->msi_va = mmios_va[index] + reloff;
+ nr_guest_files = (resource_size(&mmios[index]) - reloff) / IMSIC_MMIO_PAGE_SZ - 1;
+ global->nr_guest_files = global->nr_guest_files > nr_guest_files ? nr_guest_files :
+ global->nr_guest_files;
+
nr_handlers++;
}
diff --git a/include/linux/irqchip/riscv-imsic.h b/include/linux/irqchip/riscv-imsic.h
index 7494952c55187..43aed52385008 100644
--- a/include/linux/irqchip/riscv-imsic.h
+++ b/include/linux/irqchip/riscv-imsic.h
@@ -69,6 +69,9 @@ struct imsic_global_config {
/* Number of guest interrupt identities */
u32 nr_guest_ids;
+ /* Number of guest interrupt files per core */
+ u32 nr_guest_files;
+
/* Per-CPU IMSIC addresses */
struct imsic_local_config __percpu *local;
};
--
2.20.1
^ permalink raw reply related [flat|nested] 3+ messages in thread
* Re: [PATCH] irqchip/riscv-imsic: Adjust vs irq files num according to MMIO resources
2025-12-20 8:55 [PATCH] irqchip/riscv-imsic: Adjust vs irq files num according to MMIO resources Xu Lu
@ 2025-12-20 9:03 ` Xu Lu
2025-12-20 15:22 ` Thomas Gleixner
0 siblings, 1 reply; 3+ messages in thread
From: Xu Lu @ 2025-12-20 9:03 UTC (permalink / raw)
To: anup, atish.patra, pjw, palmer, aou, alex, tglx
Cc: kvm, kvm-riscv, linux-riscv, linux-kernel
On Sat, Dec 20, 2025 at 4:56 PM Xu Lu <luxu.kernel@bytedance.com> wrote:
>
> During initialization, kernel maps the MMIO resources of IMSIC, which is
> parsed from ACPI or DTS and may not strictly contains all guest
> interrupt files. Page fault happens when KVM wrongly allocates an
> unmapped guest interrupt file and writes it.
>
> Thus, during initialization, we calculate the number of available guest
> interrupt files according to MMIO resources and constrain the number of
> guest interrupt files that can be allocated by KVM.
>
> Signed-off-by: Xu Lu <luxu.kernel@bytedance.com>
> ---
> arch/riscv/kvm/aia.c | 2 +-
> drivers/irqchip/irq-riscv-imsic-state.c | 7 ++++++-
> include/linux/irqchip/riscv-imsic.h | 3 +++
> 3 files changed, 10 insertions(+), 2 deletions(-)
>
> diff --git a/arch/riscv/kvm/aia.c b/arch/riscv/kvm/aia.c
> index dad3181856600..7b1f6adcf22d6 100644
> --- a/arch/riscv/kvm/aia.c
> +++ b/arch/riscv/kvm/aia.c
> @@ -630,7 +630,7 @@ int kvm_riscv_aia_init(void)
> */
> if (gc)
> kvm_riscv_aia_nr_hgei = min((ulong)kvm_riscv_aia_nr_hgei,
> - BIT(gc->guest_index_bits) - 1);
> + BIT(gc->nr_guest_files) - 1);
Typo here. I will resend this patch.
> else
> kvm_riscv_aia_nr_hgei = 0;
>
> diff --git a/drivers/irqchip/irq-riscv-imsic-state.c b/drivers/irqchip/irq-riscv-imsic-state.c
> index dc95ad856d80a..1e982ce024a47 100644
> --- a/drivers/irqchip/irq-riscv-imsic-state.c
> +++ b/drivers/irqchip/irq-riscv-imsic-state.c
> @@ -794,7 +794,7 @@ static int __init imsic_parse_fwnode(struct fwnode_handle *fwnode,
>
> int __init imsic_setup_state(struct fwnode_handle *fwnode, void *opaque)
> {
> - u32 i, j, index, nr_parent_irqs, nr_mmios, nr_handlers = 0;
> + u32 i, j, index, nr_parent_irqs, nr_mmios, nr_guest_files, nr_handlers = 0;
> struct imsic_global_config *global;
> struct imsic_local_config *local;
> void __iomem **mmios_va = NULL;
> @@ -888,6 +888,7 @@ int __init imsic_setup_state(struct fwnode_handle *fwnode, void *opaque)
> }
>
> /* Configure handlers for target CPUs */
> + global->nr_guest_files = BIT(global->guest_index_bits) - 1;
> for (i = 0; i < nr_parent_irqs; i++) {
> rc = imsic_get_parent_hartid(fwnode, i, &hartid);
> if (rc) {
> @@ -928,6 +929,10 @@ int __init imsic_setup_state(struct fwnode_handle *fwnode, void *opaque)
> local->msi_pa = mmios[index].start + reloff;
> local->msi_va = mmios_va[index] + reloff;
>
> + nr_guest_files = (resource_size(&mmios[index]) - reloff) / IMSIC_MMIO_PAGE_SZ - 1;
> + global->nr_guest_files = global->nr_guest_files > nr_guest_files ? nr_guest_files :
> + global->nr_guest_files;
> +
> nr_handlers++;
> }
>
> diff --git a/include/linux/irqchip/riscv-imsic.h b/include/linux/irqchip/riscv-imsic.h
> index 7494952c55187..43aed52385008 100644
> --- a/include/linux/irqchip/riscv-imsic.h
> +++ b/include/linux/irqchip/riscv-imsic.h
> @@ -69,6 +69,9 @@ struct imsic_global_config {
> /* Number of guest interrupt identities */
> u32 nr_guest_ids;
>
> + /* Number of guest interrupt files per core */
> + u32 nr_guest_files;
> +
> /* Per-CPU IMSIC addresses */
> struct imsic_local_config __percpu *local;
> };
> --
> 2.20.1
>
^ permalink raw reply [flat|nested] 3+ messages in thread
* Re: [PATCH] irqchip/riscv-imsic: Adjust vs irq files num according to MMIO resources
2025-12-20 9:03 ` Xu Lu
@ 2025-12-20 15:22 ` Thomas Gleixner
0 siblings, 0 replies; 3+ messages in thread
From: Thomas Gleixner @ 2025-12-20 15:22 UTC (permalink / raw)
To: Xu Lu, anup, atish.patra, pjw, palmer, aou, alex
Cc: kvm, kvm-riscv, linux-riscv, linux-kernel
On Sat, Dec 20 2025 at 17:03, Xu Lu wrote:
>> kvm_riscv_aia_nr_hgei = min((ulong)kvm_riscv_aia_nr_hgei,
>> - BIT(gc->guest_index_bits) - 1);
>> + BIT(gc->nr_guest_files) - 1);
>
> Typo here. I will resend this patch.
And please change the subject line to something comprehensible. 'vs irq
files num' says absolutely nothing.
Thanks,
tglx
^ permalink raw reply [flat|nested] 3+ messages in thread
end of thread, other threads:[~2025-12-20 15:22 UTC | newest]
Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2025-12-20 8:55 [PATCH] irqchip/riscv-imsic: Adjust vs irq files num according to MMIO resources Xu Lu
2025-12-20 9:03 ` Xu Lu
2025-12-20 15:22 ` Thomas Gleixner
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).