From nobody Fri Jan 2 05:47:53 2026 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 69896CDB465 for ; Mon, 16 Oct 2023 06:29:41 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S231859AbjJPG32 (ORCPT ); Mon, 16 Oct 2023 02:29:28 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:33888 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S231781AbjJPG3T (ORCPT ); Mon, 16 Oct 2023 02:29:19 -0400 Received: from smtp-out1.suse.de (smtp-out1.suse.de [195.135.220.28]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id A1BA610C for ; Sun, 15 Oct 2023 23:29:16 -0700 (PDT) Received: from imap2.suse-dmz.suse.de (imap2.suse-dmz.suse.de [192.168.254.74]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature ECDSA (P-521) server-digest SHA512) (No client certificate requested) by smtp-out1.suse.de (Postfix) with ESMTPS id A8D1F218B5; Mon, 16 Oct 2023 06:29:14 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=suse.com; s=susede1; t=1697437754; h=from:from:reply-to:date:date:message-id:message-id:to:to:cc:cc: mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=gfiJW8Ts6bK8yjUp0LUTZbfxs1RFtdPcjXwRkvwtN44=; b=Fk73jBwYBGOHZuRQoALHGeKcoHC295iWwjwk1PCqfElvmfip/G6emaGyAxVPmH9aWoZSVj x0I9FY2B8Q73ebzl86astm9dfJnjSyh0Hd9ywBXWw6DGDdq3QjwQtQ9xHzcY8fa3cuOmZ1 9vuT25p+m5wTvydo5rnrsa+KMgowATU= Received: from imap2.suse-dmz.suse.de (imap2.suse-dmz.suse.de [192.168.254.74]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature ECDSA (P-521) server-digest SHA512) (No client certificate requested) by imap2.suse-dmz.suse.de (Postfix) with ESMTPS id 7CBCA138EF; Mon, 16 Oct 2023 06:29:14 +0000 (UTC) Received: from dovecot-director2.suse.de ([192.168.254.65]) by imap2.suse-dmz.suse.de with ESMTPSA id OKUAHTrYLGXIQQAAMHmgww (envelope-from ); Mon, 16 Oct 2023 06:29:14 +0000 From: Juergen Gross To: linux-kernel@vger.kernel.org Cc: Juergen Gross , Stefano Stabellini , Oleksandr Tyshchenko , xen-devel@lists.xenproject.org Subject: [PATCH 7/7] xen/events: remove some info_for_irq() calls in pirq handling Date: Mon, 16 Oct 2023 08:28:31 +0200 Message-Id: <20231016062831.20630-8-jgross@suse.com> X-Mailer: git-send-email 2.35.3 In-Reply-To: <20231016062831.20630-1-jgross@suse.com> References: <20231016062831.20630-1-jgross@suse.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Authentication-Results: smtp-out1.suse.de; none X-Spamd-Result: default: False [-6.10 / 50.00]; ARC_NA(0.00)[]; RCVD_VIA_SMTP_AUTH(0.00)[]; FROM_HAS_DN(0.00)[]; TO_DN_SOME(0.00)[]; TO_MATCH_ENVRCPT_ALL(0.00)[]; R_MISSING_CHARSET(2.50)[]; MIME_GOOD(-0.10)[text/plain]; REPLY(-4.00)[]; BROKEN_CONTENT_TYPE(1.50)[]; RCPT_COUNT_FIVE(0.00)[5]; NEURAL_HAM_LONG(-3.00)[-1.000]; DKIM_SIGNED(0.00)[suse.com:s=susede1]; NEURAL_HAM_SHORT(-1.00)[-1.000]; MID_CONTAINS_FROM(1.00)[]; FROM_EQ_ENVFROM(0.00)[]; MIME_TRACE(0.00)[0:+]; RCVD_COUNT_TWO(0.00)[2]; RCVD_TLS_ALL(0.00)[]; BAYES_HAM(-3.00)[100.00%] Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" Instead of the IRQ number user the struct irq_info pointer as parameter in the internal pirq related functions. This allows to drop some calls of info_for_irq(). Signed-off-by: Juergen Gross Reviewed-by: Oleksandr Tyshchenko --- drivers/xen/events/events_base.c | 113 +++++++++++++++++++------------ 1 file changed, 68 insertions(+), 45 deletions(-) diff --git a/drivers/xen/events/events_base.c b/drivers/xen/events/events_b= ase.c index 47a33d3cbfcb..c75dff276894 100644 --- a/drivers/xen/events/events_base.c +++ b/drivers/xen/events/events_base.c @@ -172,7 +172,7 @@ static int **evtchn_to_irq; #ifdef CONFIG_X86 static unsigned long *pirq_eoi_map; #endif -static bool (*pirq_needs_eoi)(unsigned irq); +static bool (*pirq_needs_eoi)(struct irq_info *info); =20 #define EVTCHN_ROW(e) (e / (PAGE_SIZE/sizeof(**evtchn_to_irq))) #define EVTCHN_COL(e) (e % (PAGE_SIZE/sizeof(**evtchn_to_irq))) @@ -188,7 +188,6 @@ static struct irq_chip xen_lateeoi_chip; static struct irq_chip xen_percpu_chip; static struct irq_chip xen_pirq_chip; static void enable_dynirq(struct irq_data *data); -static void disable_dynirq(struct irq_data *data); =20 static DEFINE_PER_CPU(unsigned int, irq_epoch); =20 @@ -451,10 +450,8 @@ static unsigned int virq_from_irq(struct irq_info *inf= o) return info->u.virq; } =20 -static unsigned pirq_from_irq(unsigned irq) +static unsigned int pirq_from_irq(struct irq_info *info) { - struct irq_info *info =3D info_for_irq(irq); - BUG_ON(info =3D=3D NULL); BUG_ON(info->type !=3D IRQT_PIRQ); =20 @@ -497,15 +494,14 @@ static void do_unmask(struct irq_info *info, u8 reaso= n) } =20 #ifdef CONFIG_X86 -static bool pirq_check_eoi_map(unsigned irq) +static bool pirq_check_eoi_map(struct irq_info *info) { - return test_bit(pirq_from_irq(irq), pirq_eoi_map); + return test_bit(pirq_from_irq(info), pirq_eoi_map); } #endif =20 -static bool pirq_needs_eoi_flag(unsigned irq) +static bool pirq_needs_eoi_flag(struct irq_info *info) { - struct irq_info *info =3D info_for_irq(irq); BUG_ON(info->type !=3D IRQT_PIRQ); =20 return info->u.pirq.flags & PIRQ_NEEDS_EOI; @@ -799,14 +795,13 @@ static void event_handler_exit(struct irq_info *info) clear_evtchn(info->evtchn); } =20 -static void pirq_query_unmask(int irq) +static void pirq_query_unmask(struct irq_info *info) { struct physdev_irq_status_query irq_status; - struct irq_info *info =3D info_for_irq(irq); =20 BUG_ON(info->type !=3D IRQT_PIRQ); =20 - irq_status.irq =3D pirq_from_irq(irq); + irq_status.irq =3D info->u.pirq.pirq; if (HYPERVISOR_physdev_op(PHYSDEVOP_irq_status_query, &irq_status)) irq_status.flags =3D 0; =20 @@ -815,35 +810,57 @@ static void pirq_query_unmask(int irq) info->u.pirq.flags |=3D PIRQ_NEEDS_EOI; } =20 -static void eoi_pirq(struct irq_data *data) +static void do_eoi_pirq(struct irq_info *info) { - struct irq_info *info =3D info_for_irq(data->irq); - evtchn_port_t evtchn =3D info ? info->evtchn : 0; - struct physdev_eoi eoi =3D { .irq =3D pirq_from_irq(data->irq) }; + struct physdev_eoi eoi =3D { .irq =3D pirq_from_irq(info) }; int rc =3D 0; =20 - if (!VALID_EVTCHN(evtchn)) + if (!VALID_EVTCHN(info->evtchn)) return; =20 event_handler_exit(info); =20 - if (pirq_needs_eoi(data->irq)) { + if (pirq_needs_eoi(info)) { rc =3D HYPERVISOR_physdev_op(PHYSDEVOP_eoi, &eoi); WARN_ON(rc); } } =20 +static void eoi_pirq(struct irq_data *data) +{ + struct irq_info *info =3D info_for_irq(data->irq); + + do_eoi_pirq(info); +} + +static void do_disable_dynirq(struct irq_info *info) +{ + if (VALID_EVTCHN(info->evtchn)) + do_mask(info, EVT_MASK_REASON_EXPLICIT); +} + +static void disable_dynirq(struct irq_data *data) +{ + struct irq_info *info =3D info_for_irq(data->irq); + + if (info) + do_disable_dynirq(info); +} + static void mask_ack_pirq(struct irq_data *data) { - disable_dynirq(data); - eoi_pirq(data); + struct irq_info *info =3D info_for_irq(data->irq); + + if (info) { + do_disable_dynirq(info); + do_eoi_pirq(info); + } } =20 -static unsigned int __startup_pirq(unsigned int irq) +static unsigned int __startup_pirq(struct irq_info *info) { struct evtchn_bind_pirq bind_pirq; - struct irq_info *info =3D info_for_irq(irq); - evtchn_port_t evtchn =3D evtchn_from_irq(irq); + evtchn_port_t evtchn =3D info->evtchn; int rc; =20 BUG_ON(info->type !=3D IRQT_PIRQ); @@ -851,20 +868,20 @@ static unsigned int __startup_pirq(unsigned int irq) if (VALID_EVTCHN(evtchn)) goto out; =20 - bind_pirq.pirq =3D pirq_from_irq(irq); + bind_pirq.pirq =3D pirq_from_irq(info); /* NB. We are happy to share unless we are probing. */ bind_pirq.flags =3D info->u.pirq.flags & PIRQ_SHAREABLE ? BIND_PIRQ__WILL_SHARE : 0; rc =3D HYPERVISOR_event_channel_op(EVTCHNOP_bind_pirq, &bind_pirq); if (rc !=3D 0) { - pr_warn("Failed to obtain physical IRQ %d\n", irq); + pr_warn("Failed to obtain physical IRQ %d\n", info->irq); return 0; } evtchn =3D bind_pirq.port; =20 - pirq_query_unmask(irq); + pirq_query_unmask(info); =20 - rc =3D set_evtchn_to_irq(evtchn, irq); + rc =3D set_evtchn_to_irq(evtchn, info->irq); if (rc) goto err; =20 @@ -878,26 +895,28 @@ static unsigned int __startup_pirq(unsigned int irq) out: do_unmask(info, EVT_MASK_REASON_EXPLICIT); =20 - eoi_pirq(irq_get_irq_data(irq)); + do_eoi_pirq(info); =20 return 0; =20 err: - pr_err("irq%d: Failed to set port to irq mapping (%d)\n", irq, rc); + pr_err("irq%d: Failed to set port to irq mapping (%d)\n", info->irq, + rc); xen_evtchn_close(evtchn); return 0; } =20 static unsigned int startup_pirq(struct irq_data *data) { - return __startup_pirq(data->irq); + struct irq_info *info =3D info_for_irq(data->irq); + + return __startup_pirq(info); } =20 static void shutdown_pirq(struct irq_data *data) { - unsigned int irq =3D data->irq; - struct irq_info *info =3D info_for_irq(irq); - evtchn_port_t evtchn =3D evtchn_from_irq(irq); + struct irq_info *info =3D info_for_irq(data->irq); + evtchn_port_t evtchn =3D info->evtchn; =20 BUG_ON(info->type !=3D IRQT_PIRQ); =20 @@ -1031,7 +1050,7 @@ int xen_bind_pirq_gsi_to_irq(unsigned gsi, goto out; } =20 - pirq_query_unmask(info->irq); + pirq_query_unmask(info); /* We try to use the handler with the appropriate semantic for the * type of interrupt: if the interrupt is an edge triggered * interrupt we use handle_edge_irq. @@ -1158,7 +1177,9 @@ int xen_destroy_irq(int irq) =20 int xen_pirq_from_irq(unsigned irq) { - return pirq_from_irq(irq); + struct irq_info *info =3D info_for_irq(irq); + + return pirq_from_irq(info); } EXPORT_SYMBOL_GPL(xen_pirq_from_irq); =20 @@ -1820,28 +1841,30 @@ static void enable_dynirq(struct irq_data *data) do_unmask(info, EVT_MASK_REASON_EXPLICIT); } =20 -static void disable_dynirq(struct irq_data *data) +static void do_ack_dynirq(struct irq_info *info) { - struct irq_info *info =3D info_for_irq(data->irq); - evtchn_port_t evtchn =3D info ? info->evtchn : 0; + evtchn_port_t evtchn =3D info->evtchn; =20 if (VALID_EVTCHN(evtchn)) - do_mask(info, EVT_MASK_REASON_EXPLICIT); + event_handler_exit(info); } =20 static void ack_dynirq(struct irq_data *data) { struct irq_info *info =3D info_for_irq(data->irq); - evtchn_port_t evtchn =3D info ? info->evtchn : 0; =20 - if (VALID_EVTCHN(evtchn)) - event_handler_exit(info); + if (info) + do_ack_dynirq(info); } =20 static void mask_ack_dynirq(struct irq_data *data) { - disable_dynirq(data); - ack_dynirq(data); + struct irq_info *info =3D info_for_irq(data->irq); + + if (info) { + do_disable_dynirq(info); + do_ack_dynirq(info); + } } =20 static void lateeoi_ack_dynirq(struct irq_data *data) @@ -1920,7 +1943,7 @@ static void restore_pirqs(void) =20 printk(KERN_DEBUG "xen: --> irq=3D%d, pirq=3D%d\n", irq, map_irq.pirq); =20 - __startup_pirq(irq); + __startup_pirq(info); } } =20 --=20 2.35.3