From nobody Thu Dec 18 20:36:39 2025 Received: from mail-pj1-f53.google.com (mail-pj1-f53.google.com [209.85.216.53]) (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 7D75022DFAD for ; Mon, 13 Jan 2025 15:09:47 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.216.53 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1736780989; cv=none; b=howvgk5paFC+1ImkF2r92h5/Y5ZZG1ZNhsXH2eqLyCMBaDmE7mIPDWa+C229uSWtRf1CmVIqZ53Bfkaa8bJkD2bmzKnsHudZsSBMqg4+VI4YJm3IyEoJr7xAp9WMgDogWxDJVVLBQtT+XMLCMa7a6GEDRPCKyiLuvcf7UBFmULY= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1736780989; c=relaxed/simple; bh=iT3jmLR1uPS8aABHGiEzjJK8RK3CjpdbGbn1YdTJ6uw=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=hA6wz7+KBbxHMyRdSNActLfQ8CM59gQcNvzR+1W67pdN4EOkoP0UK9oxLYDgsF+SkOldHsaTV+Fgku1d5j1Ji/ybRz7/7vHgb9qqHRXA1RjnSurKiZa99cDVGd7ui5klar5GOdYR3faCIk2uUD8iaM2GprxksV5/kEXxOtKB6kE= 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=CTLG2m7r; arc=none smtp.client-ip=209.85.216.53 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="CTLG2m7r" Received: by mail-pj1-f53.google.com with SMTP id 98e67ed59e1d1-2f42992f608so6094150a91.0 for ; Mon, 13 Jan 2025 07:09:47 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bytedance.com; s=google; t=1736780987; x=1737385787; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=hA7KmP8ZbCQ+IJq/rgtrcH9RXEk5WsfJ1uvgsMI6f1g=; b=CTLG2m7rTQkoR4CpPL4bkpYEoWBkSpwdsL2iOkFb08D+OrpeX+/pVQG3VVkOP/ouMy 33YkdPOSeUGP4gx6tqWidce4XOcZ93UYd+FRxrOovzmwL+pzDnSrGKq6QCCmiQDqRM75 c0kIJ3VWgV4qVhQ9vmC1bf/UQMmaZNavsSGZ7YLryth74X28nXg0Zykqcr3ZVh0viEfk ZRE+qhVZ9gW5MQfNmkFUkzNIwRzLvVa+ieB55mmz/NIN4EXOJM4bVMv2+g49jYD+tmBP v0ZoDV5swd3zMdkInyTsngxVTBJBe5ju5lC2YrkejOS4tSTgo2rnekLdldEpEeT8ASVF b0zQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1736780987; x=1737385787; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=hA7KmP8ZbCQ+IJq/rgtrcH9RXEk5WsfJ1uvgsMI6f1g=; b=F5s/PTEVehSGTy0TlZHhRlwcAszoQK+WXDR2m90fzbkLmWSfjsdvpGTHcFOO1pmTMj ZuV5UL5oP2hb7mG57CroEc4GcycOiripsCTTQAiVs8EWJ+YgD81tSlWbUUrukTaV+/9B T6rAx2RnOWmfSs6iHWuqqYvVHNE4hIvCdyrDmzs+rOx8iHLtlp9KRzwTIKZfP/XcWlXx qNysLJldA1hvpbeV3J6PbHKcCM78QpHtpDM1oqFp6m5gzHCRw9EZ9mX3uRjoqXTBUjCb tCf7achZX7qHadHeov2/bjdNdkM8ShF6q1CwrLzAG/w288+dphyp/kO3ctkL/HmWQMZt hc3A== X-Forwarded-Encrypted: i=1; AJvYcCWQ7NbaeFbgxZVCj1ghK7GmT0mr5IBAt79msEZ5TneZugWFZvGUBlBPZA/Lwaeq1pWsrcKKFJrVQYTTzw0=@vger.kernel.org X-Gm-Message-State: AOJu0YzG9mYTjS8rCvRugIZKrYULNbDGDGwwfTPgATtk+b83HYkiTqCZ 8deBIOVsVn5u5cmLGMZx6PZkI7uMVA38sZww2iUZN19TkQ7Msmmp/8CinfSiUf0= X-Gm-Gg: ASbGncs7XvU1XWxWKU54eOZfFZLrdCEcLYbKDuxAfH/DQda6px7VapaKHv9TfTLaz8C MkVXOtfnzXahZWYNjodhSjFFVY2OIfrEXEeMAISkOup7GMMBwQQflcjMEs6vAu5JYeeWFw8maCY 6YtQ4CF7wTsXoY+Vz09+l0veMxFutkV850gTqzD1xtZ97seoXvWrJ4bZgT9EK/eMsR4gTUnWUc0 ta/64sgYZ8yFtf5Qt1Gf1aYkeZrMEmUh/+RsWtPhyZp8kRGTotzn5Al0DQB7QxJdoHae3qhnd4/ zJd3Kuj35bmg4W8Fj3JCHqHgHELy5Q+m+pJfb4I= X-Google-Smtp-Source: AGHT+IHJzieMKhjl4iGkh9csBV7gdhyeugpPqTshmdPmOPggJ8E3A5U82RjvM0JQCCbIFygmdThhGQ== X-Received: by 2002:a17:90a:d00c:b0:2ee:c5ea:bd91 with SMTP id 98e67ed59e1d1-2f548f1d783mr30239515a91.29.1736780986704; Mon, 13 Jan 2025 07:09:46 -0800 (PST) Received: from J9GPGXL7NT.bytedance.net ([61.213.176.56]) by smtp.gmail.com with ESMTPSA id 98e67ed59e1d1-2f54a26ae2fsm10193120a91.9.2025.01.13.07.09.42 (version=TLS1_3 cipher=TLS_CHACHA20_POLY1305_SHA256 bits=256/256); Mon, 13 Jan 2025 07:09:46 -0800 (PST) From: Xu Lu To: daniel.lezcano@linaro.org, tglx@linutronix.de, anup@brainfault.org, paul.walmsley@sifive.com, palmer@dabbelt.com Cc: lihangjing@bytedance.com, xieyongji@bytedance.com, linux-riscv@lists.infradead.org, linux-kernel@vger.kernel.org, Xu Lu Subject: [PATCH 1/5] irqchip/riscv-intc: Balance priority and fairness during irq handling Date: Mon, 13 Jan 2025 23:09:29 +0800 Message-Id: <20250113150933.65121-2-luxu.kernel@bytedance.com> X-Mailer: git-send-email 2.39.5 (Apple Git-154) In-Reply-To: <20250113150933.65121-1-luxu.kernel@bytedance.com> References: <20250113150933.65121-1-luxu.kernel@bytedance.com> 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" Both csr cause and csr topi record the pending bit with the highest priority. If interrupts with high priority arrive frequently within a certain period of time, the interrupts with low priority won't get a chance to be handled. For example, if external interrupts and software interrupts arrive very frequently, the timer interrupts will never be handled. Then buddy watchdog on a buddy CPU will report a hardlockup on the current CPU while current CPU actually can receive irq. This commit solves this problem by handling all pending irqs in a round. During each round, this commit handles pending irqs by their priority. Signed-off-by: Xu Lu --- drivers/irqchip/irq-riscv-intc.c | 32 ++++++++++++++++++++++++++------ 1 file changed, 26 insertions(+), 6 deletions(-) diff --git a/drivers/irqchip/irq-riscv-intc.c b/drivers/irqchip/irq-riscv-i= ntc.c index f653c13de62b..bc2ec26aa9e9 100644 --- a/drivers/irqchip/irq-riscv-intc.c +++ b/drivers/irqchip/irq-riscv-intc.c @@ -26,20 +26,40 @@ static unsigned int riscv_intc_nr_irqs __ro_after_init = =3D BITS_PER_LONG; static unsigned int riscv_intc_custom_base __ro_after_init =3D BITS_PER_LO= NG; static unsigned int riscv_intc_custom_nr_irqs __ro_after_init; =20 +static unsigned int riscv_prio_irqs[] =3D { +#ifdef CONFIG_RISCV_M_MODE + IRQ_M_EXT, IRQ_M_SOFT, IRQ_M_TIMER, +#endif + IRQ_S_EXT, IRQ_S_SOFT, IRQ_S_TIMER, IRQ_S_GEXT, + IRQ_VS_EXT, IRQ_VS_SOFT, IRQ_VS_TIMER, + IRQ_PMU_OVF, +}; + static void riscv_intc_irq(struct pt_regs *regs) { - unsigned long cause =3D regs->cause & ~CAUSE_IRQ_FLAG; - - if (generic_handle_domain_irq(intc_domain, cause)) - pr_warn_ratelimited("Failed to handle interrupt (cause: %ld)\n", cause); + unsigned long pending =3D csr_read(CSR_IP) & csr_read(CSR_IE); + unsigned int i; + + for (i =3D 0; i < ARRAY_SIZE(riscv_prio_irqs); i++) + if (pending & (1UL << riscv_prio_irqs[i])) + if (generic_handle_domain_irq(intc_domain, riscv_prio_irqs[i])) + pr_warn_ratelimited("Failed to handle interrupt (cause: %u)\n", + riscv_prio_irqs[i]); } =20 static void riscv_intc_aia_irq(struct pt_regs *regs) { unsigned long topi; + unsigned long pending; + unsigned int i; + + while ((topi =3D csr_read(CSR_TOPI))) { + pending =3D csr_read(CSR_IP) & csr_read(CSR_IE); =20 - while ((topi =3D csr_read(CSR_TOPI))) - generic_handle_domain_irq(intc_domain, topi >> TOPI_IID_SHIFT); + for (i =3D 0; i < ARRAY_SIZE(riscv_prio_irqs); i++) + if (pending & (1UL << riscv_prio_irqs[i])) + generic_handle_domain_irq(intc_domain, riscv_prio_irqs[i]); + } } =20 /* --=20 2.20.1