Received: by 2002:a05:6a10:7420:0:0:0:0 with SMTP id hk32csp596416pxb; Thu, 17 Feb 2022 10:24:41 -0800 (PST) X-Google-Smtp-Source: ABdhPJxaZtq3IFCZyY4/SmUta0TQzV2WTlH/j0K/fs3Ku/8ldzOgSj3pV3Fs0PVPZGRoW0ulRuXq X-Received: by 2002:a17:902:ab18:b0:14f:3c15:8f18 with SMTP id ik24-20020a170902ab1800b0014f3c158f18mr3960219plb.21.1645122281065; Thu, 17 Feb 2022 10:24:41 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1645122281; cv=none; d=google.com; s=arc-20160816; b=xbaTAnHpb5xkzLKXznzNw+R4O77o7qZ9CGvspstRyjr95QM0HfJYwXE0+/u2vKh7Qk S0kSzUQ4MJdHGfIP6dgQ0IYB26Nv5Y4yJPLIyUf7flJIto3AYIGpZZr+rPpexzKuEo4B rbfoGeZn9J2Q/VDjAg7n+kKr6E5YyCHKgSygohz0c588gWK1iq+WxbAry2DRbOJHpbC5 pi3Sl6P/Qp7vdpJtWZ0xOfQrK3jUMXKDFq3qc7KaUQLho53lb7GTXuvX8BXw+SgodYlP gzOmbp9TaEzOYO0LemLE5nR3Zi5YYy2+7rjY0xNFqeebBBFQYR772iHXzCy1jzjKWrCs l84w== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:in-reply-to:from :references:cc:to:subject:user-agent:mime-version:date:message-id; bh=WKjk0SfXocH59EIZU6WmpwdUeZ39EeWfnpLbY2tDJcw=; b=QGZTudKDTCMmljtTMmgPtSmOWKNg2X24NaOipJD4WQXcrklESmpXFMPT5ILAHSuuPm 7FYKJ01keIiBCTi6r70Spu6VCySpd3b+ZKDwa+EVQ18gr8mmOHPgOC+KKXzBPxrhSN30 ApenpSTd3la8cFHwCwV6Gp4on3R+YRXwHvTfK0M2zDdVK2nGCHlcH0sKqa7RasB4DW4+ maqhG8ufU+fCNQURs8f5hUcL2XSMlob2HzDWfzXXBQkmmKitmR3K9es66LcdLF1Wvra3 cebkd+28CzecoFkOO6GyVhZSbasxKwfPRV9iae0YljFLvQZfKUZGp35VePD8U4NVhDOn ip/g== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=QUARANTINE sp=QUARANTINE dis=NONE) header.from=huawei.com Return-Path: Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id t71si325640pfc.264.2022.02.17.10.24.25; Thu, 17 Feb 2022 10:24:41 -0800 (PST) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) client-ip=2620:137:e000::1:20; Authentication-Results: mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=QUARANTINE sp=QUARANTINE dis=NONE) header.from=huawei.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S243578AbiBQRIK (ORCPT + 99 others); Thu, 17 Feb 2022 12:08:10 -0500 Received: from mxb-00190b01.gslb.pphosted.com ([23.128.96.19]:39380 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S243575AbiBQRIJ (ORCPT ); Thu, 17 Feb 2022 12:08:09 -0500 Received: from frasgout.his.huawei.com (frasgout.his.huawei.com [185.176.79.56]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 9F110171852; Thu, 17 Feb 2022 09:07:51 -0800 (PST) Received: from fraeml737-chm.china.huawei.com (unknown [172.18.147.207]) by frasgout.his.huawei.com (SkyGuard) with ESMTP id 4K01TB1dVmz682vL; Fri, 18 Feb 2022 01:06:54 +0800 (CST) Received: from lhreml724-chm.china.huawei.com (10.201.108.75) by fraeml737-chm.china.huawei.com (10.206.15.218) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2308.21; Thu, 17 Feb 2022 18:07:49 +0100 Received: from [10.47.81.42] (10.47.81.42) by lhreml724-chm.china.huawei.com (10.201.108.75) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2308.21; Thu, 17 Feb 2022 17:07:48 +0000 Message-ID: Date: Thu, 17 Feb 2022 17:07:46 +0000 MIME-Version: 1.0 User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:91.0) Gecko/20100101 Thunderbird/91.5.1 Subject: Re: [PATCH 1/2] genirq: Extract irq_set_affinity_masks() from devm_platform_get_irqs_affinity() To: Marc Zyngier , , CC: Greg Kroah-Hartman , Marcin Wojtas , Russell King , "David S. Miller" , Jakub Kicinski , Thomas Gleixner , References: <20220216090845.1278114-1-maz@kernel.org> <20220216090845.1278114-2-maz@kernel.org> From: John Garry In-Reply-To: <20220216090845.1278114-2-maz@kernel.org> Content-Type: text/plain; charset="UTF-8"; format=flowed Content-Transfer-Encoding: 7bit X-Originating-IP: [10.47.81.42] X-ClientProxiedBy: lhreml754-chm.china.huawei.com (10.201.108.204) To lhreml724-chm.china.huawei.com (10.201.108.75) X-CFilter-Loop: Reflected X-Spam-Status: No, score=-4.2 required=5.0 tests=BAYES_00,NICE_REPLY_A, RCVD_IN_DNSWL_MED,RCVD_IN_MSPIKE_H4,RCVD_IN_MSPIKE_WL,SPF_HELO_NONE, SPF_PASS,T_SCC_BODY_TEXT_LINE autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On 16/02/2022 09:08, Marc Zyngier wrote: Hi Marc, > In order to better support drivers that deal with interrupts in a more > "hands-on" way, extract the core of devm_platform_get_irqs_affinity() > and expose it as irq_set_affinity_masks(). > > This helper allows a driver to provide a set of wired interrupts that > are to be configured as managed interrupts. As with the original helper, > this is exported as EXPORT_SYMBOL_GPL. I know you mentioned it in 2/2, but it would be interesting to see how network controller drivers can handle the problem of missing in-flight IO completions for managed irq shutdown. For storage controllers this is all now safely handled in the block layer. > > Signed-off-by: Marc Zyngier Just a small comment, below. Tested-by: John Garry #D05 Thanks, John > --- > drivers/base/platform.c | 20 +++----------------- > include/linux/interrupt.h | 8 ++++++++ > kernel/irq/affinity.c | 27 +++++++++++++++++++++++++++ > 3 files changed, 38 insertions(+), 17 deletions(-) > > diff --git a/drivers/base/platform.c b/drivers/base/platform.c > index 6cb04ac48bf0..b363cf6ce5be 100644 > --- a/drivers/base/platform.c > +++ b/drivers/base/platform.c > @@ -335,7 +335,6 @@ int devm_platform_get_irqs_affinity(struct platform_device *dev, > int **irqs) > { > struct irq_affinity_devres *ptr; > - struct irq_affinity_desc *desc; > size_t size; > int i, ret, nvec; > > @@ -376,31 +375,18 @@ int devm_platform_get_irqs_affinity(struct platform_device *dev, > ptr->irq[i] = irq; > } > > - desc = irq_create_affinity_masks(nvec, affd); > - if (!desc) { > - ret = -ENOMEM; > + ret = irq_set_affinity_masks(affd, ptr->irq, nvec); > + if (ret) { > + dev_err(&dev->dev, "failed to update affinity descriptors (%d)\n", ret); > goto err_free_devres; > } > > - for (i = 0; i < nvec; i++) { > - ret = irq_update_affinity_desc(ptr->irq[i], &desc[i]); > - if (ret) { > - dev_err(&dev->dev, "failed to update irq%d affinity descriptor (%d)\n", > - ptr->irq[i], ret); > - goto err_free_desc; > - } > - } > - > devres_add(&dev->dev, ptr); > > - kfree(desc); > - > *irqs = ptr->irq; > > return nvec; > > -err_free_desc: > - kfree(desc); > err_free_devres: > devres_free(ptr); > return ret; > diff --git a/include/linux/interrupt.h b/include/linux/interrupt.h > index 9367f1cb2e3c..6bfce96206f8 100644 > --- a/include/linux/interrupt.h > +++ b/include/linux/interrupt.h > @@ -381,6 +381,8 @@ irq_create_affinity_masks(unsigned int nvec, struct irq_affinity *affd); > unsigned int irq_calc_affinity_vectors(unsigned int minvec, unsigned int maxvec, > const struct irq_affinity *affd); > > +int irq_set_affinity_masks(struct irq_affinity *affd, int *irqs, int nvec); > + > #else /* CONFIG_SMP */ > > static inline int irq_set_affinity(unsigned int irq, const struct cpumask *m) > @@ -443,6 +445,12 @@ irq_calc_affinity_vectors(unsigned int minvec, unsigned int maxvec, > return maxvec; > } > > +static inline int > +irq_set_affinity_masks(struct irq_affinity *affd, int *irqs, int nvec) > +{ > + return -EINVAL; > +} > + > #endif /* CONFIG_SMP */ > > /* > diff --git a/kernel/irq/affinity.c b/kernel/irq/affinity.c > index f7ff8919dc9b..c0f868cd5b87 100644 > --- a/kernel/irq/affinity.c > +++ b/kernel/irq/affinity.c > @@ -512,3 +512,30 @@ unsigned int irq_calc_affinity_vectors(unsigned int minvec, unsigned int maxvec, > > return resv + min(set_vecs, maxvec - resv); > } > + > +/* > + * irq_set_affinity_masks - Set the affinity masks of a number of interrupts > + * for multiqueue spreading > + * @affd: Description of the affinity requirements > + * @irqs: An array of interrupt numbers > + * @nvec: The total number of interrupts > + */ > +int irq_set_affinity_masks(struct irq_affinity *affd, int *irqs, int nvec) > +{ > + struct irq_affinity_desc *desc; > + int i, err = 0; nit: it might be worth doing something similar to how pci_alloc_irq_vectors_affinity() handles sets with no pre- and post-vectors with msi_default_affd > + > + desc = irq_create_affinity_masks(nvec, affd); > + if (!desc) > + return -ENOMEM; > + > + for (i = 0; i < nvec; i++) { > + err = irq_update_affinity_desc(irqs[i], desc + i); > + if (err) > + break; > + } > + > + kfree(desc); > + return err; > +} > +EXPORT_SYMBOL_GPL(irq_set_affinity_masks);