From nobody Sat Feb 7 17:42:20 2026 Received: from mail-pj1-f46.google.com (mail-pj1-f46.google.com [209.85.216.46]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 7AA352EBB83 for ; Sat, 20 Dec 2025 08:56:04 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.216.46 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1766220966; cv=none; b=OxE1U7nW+lkzoV2RqSpaNujDetFhAOE2/uIbTz3YOOEhJIfALmiNIXySc6WC3aROAlzN/mdocgr/BET3FKr7uEIvVwDWWj0518W9OcK6VA4lzNVj3Buk34e5ZoCeYHFCuwk4dtoRW8j4futYrn29j0BGmIS5FMftrb+0eHVILsU= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1766220966; c=relaxed/simple; bh=i2h9SH23wmQJ3NJ51Aqm8ccq2WKMVX1YE4DufG4Ua5M=; h=From:To:Cc:Subject:Date:Message-ID:MIME-Version; b=pZP2Q0RyVyThytdpu7V0A+RbuLur1xJP9zUoo+CNx3eHgm5sivT5iuUUVGyGuGKzuUugeQubIx5nfAz2VYVdJov+/iRM3QZzpNE5MM7KgQQ5P1dcZxSgk5j9F9BJB0MrB/PA0O4ZbrC2YVQoTODCDf8dMYN7Uzv5kKeNSj2EYPA= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=bytedance.com; spf=pass smtp.mailfrom=bytedance.com; dkim=pass (2048-bit key) header.d=bytedance.com header.i=@bytedance.com header.b=el/c8c7i; arc=none smtp.client-ip=209.85.216.46 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=bytedance.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=bytedance.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=bytedance.com header.i=@bytedance.com header.b="el/c8c7i" Received: by mail-pj1-f46.google.com with SMTP id 98e67ed59e1d1-34ccdcbe520so1215927a91.1 for ; Sat, 20 Dec 2025 00:56:04 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bytedance.com; s=google; t=1766220964; x=1766825764; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:message-id:date:subject:cc :to:from:from:to:cc:subject:date:message-id:reply-to; bh=HXENzr5z2plkFWLtxmfbha96E8Xbo/nXRtWKuaAr4kw=; b=el/c8c7i6UykLHTAj5GmqBIv2CPDgpwHuMs/mbtJ8bfs4Ys5rjxQTXo/JpZ+5pDf7l D7GLO42XxBp6FfFwo/QqxovstaQld4mRLBjRhzTjbmYVvLi0p9tvLBZLIyNdPRVU8ygV Rmqf+lKqXjNvC68kdEVJFC1meQgrXjnFiBeL7qIj2OjN8zYbVGBDv2QRIYLmhww35RJi 77FdE0UPK34hEG8yvmBD8NRsmwfmE9mE1q0Slfq7Pi4XV4TEWRoz/0mH1QUwROPyWNe1 0+SGIjfLmSTisvHjautBLaYYdvE8CDMjUuRKC0G+z7QA0HY5fpOsFJ0/bhdJ8HYAPjrB ttdQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1766220964; x=1766825764; h=content-transfer-encoding:mime-version:message-id:date:subject:cc :to:from:x-gm-gg:x-gm-message-state:from:to:cc:subject:date :message-id:reply-to; bh=HXENzr5z2plkFWLtxmfbha96E8Xbo/nXRtWKuaAr4kw=; b=wTRSZHrdAlnNOv8B1qT/MHuNyK5XU+jYupk82RsHWQJ5FuHZJTQpdVWuFpAt1skWqU RKHZReURj9E6Hx5rjFxe+pokEFjrdaEe3v7ekuhLugOEBN6i8IBKPsoT4mF4hXyVw3Y9 xLgK/2GE8DI5a3i/fN37/70WJR/lDcY2K4PpumeOm8qXY3eLyAk7S7eM12YCU0DTustr gPZsQdBxQXHRmAGMWRZW++92hlCBjIXDYFFk8EylyHwmLx6TNYeXTal+9VaEmJpUWn/5 LUKLPprPqLN8gp290UZZPaYd7mlkvoEeOg6OkwcdxnR2yiYYm7NA2Hj958Xvt5zyWdqZ DZhA== X-Forwarded-Encrypted: i=1; AJvYcCUXkrbcZOgBqbZFH29JBcVMmulfOoxfasfO+DLXuu86ca/XKEhUhe5KNx5hPbtecozOayQ7boOBGbFFVFE=@vger.kernel.org X-Gm-Message-State: AOJu0YxKG9ohPdBu3E09abqIK+RA58wfo3N6E5dYSJ3Tg+MRL9n0UVoT NA83TLH5U0sOMFLMkm57+3XQyPE6aOOtQu6zThmaxFKmXo8vCt0kXI4YoX40N38z5GU= X-Gm-Gg: AY/fxX4+krCRRkV4IgH34koJGWC0kghkrBMN5qul07lUGAkYAW3nBDtFSnWWwmbiT6q I840gzXjcOnSi5lsNrVKFjKC7TPKjTzwH8Ycq/pdz6gdYlPl1vhyzitAsfDkvRvwHY+tL6Ga8QG oedtr0vBLLx5FPNbJbSuN30L3l6PTeDOjyKzu8FuOodrxh+EYE1Xjj1HRXXs4rX6S3Cgcg8bT/g F8FlV5+TjruRZ6+OS7tU75u+xN3meAtJguZTv8nUM70Uy8R8Bl+9AnM/8CGgo/aABnrENinaceO BKsmEqxtDjTrJQlxgjUgmrfokKLuP8dKdRo9nGMu0oUc65MNSCpDMBQIGfqV5octeIQeYs/7yoe t051Cg56PaQaX7s3irMeL8SKnVr2VPsU6dqiFcNu6KCwqHkL+QsNV+om3XyIWd+LXLCXGdUvv8J W/66fb8rn5WKH1hiFrZdZA/LhNG7HC53UOkir1ZmDFTdsga2x6+xtK X-Google-Smtp-Source: AGHT+IF05noiQi3hAuPe2AeRVjxn4xsojmQL6ESiyGT6IBKYv3sJCcgsagLTeD2lo/eEy1e2Bo8hYA== X-Received: by 2002:a17:90a:fc4c:b0:343:e692:f8d7 with SMTP id 98e67ed59e1d1-34e90dcfcb4mr4666180a91.11.1766220963620; Sat, 20 Dec 2025 00:56:03 -0800 (PST) Received: from J9GPGXL7NT.bytedance.net ([139.177.225.247]) by smtp.gmail.com with ESMTPSA id 98e67ed59e1d1-34e70dbcb6esm7506626a91.9.2025.12.20.00.55.58 (version=TLS1_3 cipher=TLS_CHACHA20_POLY1305_SHA256 bits=256/256); Sat, 20 Dec 2025 00:56:03 -0800 (PST) From: Xu Lu To: anup@brainfault.org, atish.patra@linux.dev, pjw@kernel.org, palmer@dabbelt.com, aou@eecs.berkeley.edu, alex@ghiti.fr, tglx@linutronix.de Cc: kvm@vger.kernel.org, kvm-riscv@lists.infradead.org, linux-riscv@lists.infradead.org, linux-kernel@vger.kernel.org, Xu Lu Subject: [PATCH] irqchip/riscv-imsic: Adjust vs irq files num according to MMIO resources Date: Sat, 20 Dec 2025 16:55:50 +0800 Message-ID: <20251220085550.42647-1-luxu.kernel@bytedance.com> X-Mailer: git-send-email 2.50.1 Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" 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 --- 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 =3D 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 =3D 0; =20 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_hand= le *fwnode, =20 int __init imsic_setup_state(struct fwnode_handle *fwnode, void *opaque) { - u32 i, j, index, nr_parent_irqs, nr_mmios, nr_handlers =3D 0; + u32 i, j, index, nr_parent_irqs, nr_mmios, nr_guest_files, nr_handlers = =3D 0; struct imsic_global_config *global; struct imsic_local_config *local; void __iomem **mmios_va =3D NULL; @@ -888,6 +888,7 @@ int __init imsic_setup_state(struct fwnode_handle *fwno= de, void *opaque) } =20 /* Configure handlers for target CPUs */ + global->nr_guest_files =3D BIT(global->guest_index_bits) - 1; for (i =3D 0; i < nr_parent_irqs; i++) { rc =3D imsic_get_parent_hartid(fwnode, i, &hartid); if (rc) { @@ -928,6 +929,10 @@ int __init imsic_setup_state(struct fwnode_handle *fwn= ode, void *opaque) local->msi_pa =3D mmios[index].start + reloff; local->msi_va =3D mmios_va[index] + reloff; =20 + nr_guest_files =3D (resource_size(&mmios[index]) - reloff) / IMSIC_MMIO_= PAGE_SZ - 1; + global->nr_guest_files =3D global->nr_guest_files > nr_guest_files ? nr_= guest_files : + global->nr_guest_files; + nr_handlers++; } =20 diff --git a/include/linux/irqchip/riscv-imsic.h b/include/linux/irqchip/ri= scv-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; =20 + /* Number of guest interrupt files per core */ + u32 nr_guest_files; + /* Per-CPU IMSIC addresses */ struct imsic_local_config __percpu *local; }; --=20 2.20.1