From patchwork Thu Nov 24 23:24:30 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Thomas Gleixner X-Patchwork-Id: 25738 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:adf:f944:0:0:0:0:0 with SMTP id q4csp3660269wrr; Thu, 24 Nov 2022 15:27:34 -0800 (PST) X-Google-Smtp-Source: AA0mqf5V+aqhlcFvCllhaLyXSSW3rWKpyd1Y/kKoEWNbSH+8qg6w942b1fYCUMzZjGQurXo6Tj3P X-Received: by 2002:aa7:d5c4:0:b0:46a:af31:7c4f with SMTP id d4-20020aa7d5c4000000b0046aaf317c4fmr914740eds.320.1669332454158; Thu, 24 Nov 2022 15:27:34 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1669332454; cv=none; d=google.com; s=arc-20160816; b=Vz5SdaewOHuQIgGuvBXXV8NG4YiTthAW2G/X863c9u+t3CZSq17EJ/3o67m4htdCcu YiQ42tTExV423BltDFzVGRDhcq5iA3MzZZZLYvIgNgCgndMFHWn6+58bSnGLzV4KbrQH oWDs6mifI/HewYwP40b6qLHqQTj5Rc5xTXTewSWh7sdaoMujyOYBAQEp/K3rgT7pshSq BzI9aK2cMRpeYc/DpIuGgQ2WGLQRoOavHikO91QggM8tfEUisLgpOpc6wzQgiD35475a zRhO+0Oyrpch0vjuxLRL8yKSJbFl+6HHsoZruXU7S1m2V0sMbpElPY/OCzPDWxYaTkO0 JTHg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:date:mime-version:references:subject:cc:to:from :dkim-signature:dkim-signature:message-id; bh=01JZ04pCVGnanIjdp9eHgMGQKSfrcBXNPjV3qqO7Obo=; b=iijwTqVvGKChn5dgHAf21U6tSv7t/vBeQ7fE2y6RHR0UBvG7hJ25xvZ+/H7qL5cJoa 7lbqmk1WI7FykdVwmY0dyF1j3tMrRaqMaSaQg63TX3KqLffUzSCTfdoowEl54i4a/J9t 5uhVTu5QyEz0iqoAw27lte1+L4D5KYCrJU9RGxN59MQKmdG/Kw55tWkfdrLPba8zpJ97 Ie5Z77DVqJ7YW0x3YKq5gJBWHoxcMzJYeNy2I46mYIth3YyZXDEHtudJ3p3h/1woyg0W pByj4h9Z68UfSjWSON/F3XezCI7+cejUhbXvNCmcGjrhKf04iWe1tdcJqxhkZQhvsBJb zkpQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linutronix.de header.s=2020 header.b=z3pU7RGo; dkim=neutral (no key) header.i=@linutronix.de header.b=MjDMTJsr; 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=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=linutronix.de Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id m11-20020a170906258b00b007b790c183d4si1480801ejb.556.2022.11.24.15.27.10; Thu, 24 Nov 2022 15:27:34 -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; dkim=pass header.i=@linutronix.de header.s=2020 header.b=z3pU7RGo; dkim=neutral (no key) header.i=@linutronix.de header.b=MjDMTJsr; 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=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=linutronix.de Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S229756AbiKXXZc (ORCPT + 99 others); Thu, 24 Nov 2022 18:25:32 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:42438 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229813AbiKXXYz (ORCPT ); Thu, 24 Nov 2022 18:24:55 -0500 Received: from galois.linutronix.de (Galois.linutronix.de [IPv6:2a0a:51c0:0:12e:550::1]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 6415287555; Thu, 24 Nov 2022 15:24:34 -0800 (PST) Message-ID: <20221124230314.220788011@linutronix.de> DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linutronix.de; s=2020; t=1669332271; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: references:references; bh=01JZ04pCVGnanIjdp9eHgMGQKSfrcBXNPjV3qqO7Obo=; b=z3pU7RGoRRPgJeppy54pT/zSr0ya+l0FCtfGncBlf9ORM6MT/mfaqyJccbZ36bsJN1R3u4 6bagjSANXEOIoZejSfoy59BkDGjaMqEGXYZmfANOsHOVbC6vPGyC8X9eVj8MG0UyEf8DRd JOEvQ6mwoP2r5W3H8Ms7C2OuFfbRl9W3FTWgoPXmhrqePEyiPQspNZqB6NVaD0nJPZ1NAk hJXMUWS94xkUVxJNcUkfLrfOwMfK6Hpo+Z0+U7H6moQfZZNt05aqTzGgeFh0sYa8N+vunn NNR0JMkUenc2zaVWlMJZiXkZRggc+AtlkQgZWsf/gn5yrKne+qEbl5EOqS100g== DKIM-Signature: v=1; a=ed25519-sha256; c=relaxed/relaxed; d=linutronix.de; s=2020e; t=1669332271; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: references:references; bh=01JZ04pCVGnanIjdp9eHgMGQKSfrcBXNPjV3qqO7Obo=; b=MjDMTJsrMbgqwTfGAYjZodRyQW/x3zG+c4Cl4Se2ECFN6ImiNiJ6IcN9btmLMxg4l44O6L rAJuGkLn9aRSznAw== From: Thomas Gleixner To: LKML Cc: x86@kernel.org, Joerg Roedel , Will Deacon , linux-pci@vger.kernel.org, Bjorn Helgaas , Lorenzo Pieralisi , Marc Zyngier , Greg Kroah-Hartman , Jason Gunthorpe , Dave Jiang , Alex Williamson , Kevin Tian , Dan Williams , Logan Gunthorpe , Ashok Raj , Jon Mason , Allen Hubbe Subject: [patch V3 14/22] genirq/msi: Make descriptor freeing domain aware References: <20221124225331.464480443@linutronix.de> MIME-Version: 1.0 Date: Fri, 25 Nov 2022 00:24:30 +0100 (CET) X-Spam-Status: No, score=-4.4 required=5.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,RCVD_IN_DNSWL_MED,SPF_HELO_NONE, SPF_PASS 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 X-getmail-retrieved-from-mailbox: =?utf-8?q?INBOX?= X-GMAIL-THRID: =?utf-8?q?1750421947653635539?= X-GMAIL-MSGID: =?utf-8?q?1750421947653635539?= Change the descriptor free functions to take a domain id to prepare for the upcoming multi MSI domain per device support. To avoid changing and extending the interfaces over and over use an core internal control struct and hand the pointer through the various functions. Signed-off-by: Thomas Gleixner --- V3: Adopt to the domain/xarray storage change --- include/linux/msi.h | 19 +++++++++++++++-- kernel/irq/msi.c | 58 +++++++++++++++++++++++++++++++++++++++++++--------- 2 files changed, 65 insertions(+), 12 deletions(-) --- a/include/linux/msi.h +++ b/include/linux/msi.h @@ -301,10 +301,25 @@ static inline int msi_insert_msi_desc(st return msi_domain_insert_msi_desc(dev, MSI_DEFAULT_DOMAIN, init_desc); } -void msi_free_msi_descs_range(struct device *dev, unsigned int first_index, unsigned int last_index); +void msi_domain_free_msi_descs_range(struct device *dev, unsigned int domid, + unsigned int first, unsigned int last); /** - * msi_free_msi_descs - Free MSI descriptors of a device + * msi_free_msi_descs_range - Free a range of MSI descriptors of a device + * in the default irqdomain + * + * @dev: Device for which to free the descriptors + * @first: Index to start freeing from (inclusive) + * @last: Last index to be freed (inclusive) + */ +static inline void msi_free_msi_descs_range(struct device *dev, unsigned int first, + unsigned int last) +{ + msi_domain_free_msi_descs_range(dev, MSI_DEFAULT_DOMAIN, first, last); +} + +/** + * msi_free_msi_descs - Free all MSI descriptors of a device in the default irqdomain * @dev: Device to free the descriptors */ static inline void msi_free_msi_descs(struct device *dev) --- a/kernel/irq/msi.c +++ b/kernel/irq/msi.c @@ -19,6 +19,18 @@ #include "internals.h" +/** + * struct msi_ctrl - MSI internal management control structure + * @domid: ID of the domain on which management operations should be done + * @first: First (hardware) slot index to operate on + * @last: Last (hardware) slot index to operate on + */ +struct msi_ctrl { + unsigned int domid; + unsigned int first; + unsigned int last; +}; + /* Invalid Xarray index which is outside of any searchable range */ #define MSI_XA_MAX_INDEX (ULONG_MAX - 1) /* The maximum domain size */ @@ -151,22 +163,29 @@ static bool msi_desc_match(struct msi_de return false; } -/** - * msi_free_msi_descs_range - Free MSI descriptors of a device - * @dev: Device to free the descriptors - * @first_index: Index to start freeing from - * @last_index: Last index to be freed - */ -void msi_free_msi_descs_range(struct device *dev, unsigned int first_index, - unsigned int last_index) +static bool msi_ctrl_valid(struct device *dev, struct msi_ctrl *ctrl) +{ + if (WARN_ON_ONCE(ctrl->domid >= MSI_MAX_DEVICE_IRQDOMAINS || + ctrl->first > ctrl->last || + ctrl->first > MSI_MAX_INDEX || + ctrl->last > MSI_MAX_INDEX)) + return false; + return true; +} + +static void msi_domain_free_descs(struct device *dev, struct msi_ctrl *ctrl) { - struct xarray *xa = &dev->msi.data->__domains[MSI_DEFAULT_DOMAIN].store; struct msi_desc *desc; + struct xarray *xa; unsigned long idx; lockdep_assert_held(&dev->msi.data->mutex); - xa_for_each_range(xa, idx, desc, first_index, last_index) { + if (!msi_ctrl_valid(dev, ctrl)) + return; + + xa = &dev->msi.data->__domains[ctrl->domid].store; + xa_for_each_range(xa, idx, desc, ctrl->first, ctrl->last) { xa_erase(xa, idx); /* Leak the descriptor when it is still referenced */ @@ -176,6 +195,25 @@ void msi_free_msi_descs_range(struct dev } } +/** + * msi_domain_free_msi_descs_range - Free a range of MSI descriptors of a device in an irqdomain + * @dev: Device for which to free the descriptors + * @domid: Id of the domain to operate on + * @first: Index to start freeing from (inclusive) + * @last: Last index to be freed (inclusive) + */ +void msi_domain_free_msi_descs_range(struct device *dev, unsigned int domid, + unsigned int first, unsigned int last) +{ + struct msi_ctrl ctrl = { + .domid = domid, + .first = first, + .last = last, + }; + + msi_domain_free_descs(dev, &ctrl); +} + void __get_cached_msi_msg(struct msi_desc *entry, struct msi_msg *msg) { *msg = entry->msg;