Received: by 2002:a05:7412:a9a2:b0:e2:908c:2ebd with SMTP id o34csp1305554rdh; Fri, 27 Oct 2023 10:07:12 -0700 (PDT) X-Google-Smtp-Source: AGHT+IHZ1NRnDyCBSg+trB4mtX3t5thJwYwAyY/8nBV97OpaNu3ugHoSA8yAIOEK8fQf7kuPH39K X-Received: by 2002:a05:6830:3155:b0:6b8:691e:ec53 with SMTP id c21-20020a056830315500b006b8691eec53mr4045022ots.11.1698426431916; Fri, 27 Oct 2023 10:07:11 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1698426431; cv=none; d=google.com; s=arc-20160816; b=LDQC+VRGno2NenyweMO/8VWmgbTVUewoIMmmiKH+IONJUOJwY1OxMxYhFQwUH88fIO 3tiQxuosgdnjSCm3kyoDWAbtr+4HU2w5BDN+7kGpKgBWcl8AlyQdwWZ2Ol2+PqGZWFZP nS3pwZApdwEreXr3KcF+wwDs28tghx2ZWdtRG+HDp7US6AlJYcmtMKc/1BlgvpKHQOMO 9xq5gQgz1fh4QNFs/lGwf1ktRUt/wEBAOSJ5Fjo6mx7dz9sNj23iMc4hrNXEC3+ZOIOB tAPa9NFCn88gwZ2i7W8b1QmPBUlMW7lhaaNviGn1AWpPsfZKJJI5DsiF2rHRo0x5+Xsp wgGQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :references:in-reply-to:message-id:date:subject:cc:to:from :dkim-signature; bh=zBtQ3PPokw0BNU3I9HNWFOufSJpPBQDSZcXdl3pSuiw=; fh=k582jSlci6uTztoHpzXN2a6Foym20J+xbJc48KNsUhM=; b=YPd2stuvZD/VwGRllY4Qyh4lQEmGfM3eZyXsw7a/Den+02hAjjiE7gk6YtMPKTkL3O I3Bbcmuw06PdK8OxBH1sgqX6tUeZDwkHB4rQsoQjdHguaO5Pn+62826kJCRT4qYJl+W8 uGBJxyxrc76tNAN7HMLb3z/+nMPieFoYPrhJptwLX4hqQWIi5WmFY5f76jorHZAROcic mjKltphnWvEcm2dpL2CyUsE7k5aJPN8zIZHMFZkuDPgUfXa79Q4ARKlzjr6g0sBYvz6Q +Ju6mZYZJm0b3OnK127eHJL6ykXt+G7DAx8BMQAID0NSKQquULTguYx15Ep1VCKonPBT r10g== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@intel.com header.s=Intel header.b=B0qa6+aR; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::3:7 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=intel.com Return-Path: Received: from snail.vger.email (snail.vger.email. [2620:137:e000::3:7]) by mx.google.com with ESMTPS id h9-20020a056102358900b00457bc5ad228si433873vsu.665.2023.10.27.10.06.58 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 27 Oct 2023 10:07:11 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::3:7 as permitted sender) client-ip=2620:137:e000::3:7; Authentication-Results: mx.google.com; dkim=pass header.i=@intel.com header.s=Intel header.b=B0qa6+aR; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::3:7 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=intel.com Received: from out1.vger.email (depot.vger.email [IPv6:2620:137:e000::3:0]) by snail.vger.email (Postfix) with ESMTP id AACDA8138985; Fri, 27 Oct 2023 10:02:57 -0700 (PDT) X-Virus-Status: Clean X-Virus-Scanned: clamav-milter 0.103.10 at snail.vger.email Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1346420AbjJ0RCo (ORCPT + 99 others); Fri, 27 Oct 2023 13:02:44 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:43362 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1346225AbjJ0RBn (ORCPT ); Fri, 27 Oct 2023 13:01:43 -0400 Received: from mgamail.intel.com (mgamail.intel.com [192.198.163.8]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id D51CCD4C; Fri, 27 Oct 2023 10:01:36 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1698426097; x=1729962097; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=dCYNGaS6u8lNWArc0rXK+9yXFKPwyzJs8u5KXSyF0Rc=; b=B0qa6+aRaZkEUOAng/x41z/x4Ib8d89tIVRrswwYFYSnHFlRExkpZQ14 ydJPDIQvjHRBZLneZPhJxUxHdZltWqBqOnJ/x1jeLeTOLanXPOUyYZCuB uZ1QwcRJ4d3kbTEiwuBqGIsCsLb6jkKuMFd1OR5PWt64f4vnKPrsA+c40 v6YdTMm+eAteZyNh0egUXJd4uNWMkQvMqpzn/HVoiIT4fo0h6QkrzD1Vk PoYD93vZy2MMSCWCLTAD3oqdmpggTgxRdxfjWXL67RhD0R3t+IxAXd+tE bYeYqBi2qOIYIGnxTB8ARo07BgPT/hb/cxVPADLwMMlzBXKGh/5vJFf4C Q==; X-IronPort-AV: E=McAfee;i="6600,9927,10876"; a="612064" X-IronPort-AV: E=Sophos;i="6.03,256,1694761200"; d="scan'208";a="612064" Received: from fmsmga005.fm.intel.com ([10.253.24.32]) by fmvoesa102.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 27 Oct 2023 10:01:20 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=McAfee;i="6600,9927,10876"; a="1090988215" X-IronPort-AV: E=Sophos;i="6.03,256,1694761200"; d="scan'208";a="1090988215" Received: from rchatre-ws.ostc.intel.com ([10.54.69.144]) by fmsmga005-auth.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 27 Oct 2023 10:01:18 -0700 From: Reinette Chatre To: jgg@nvidia.com, yishaih@nvidia.com, shameerali.kolothum.thodi@huawei.com, kevin.tian@intel.com, alex.williamson@redhat.com Cc: kvm@vger.kernel.org, dave.jiang@intel.com, jing2.liu@intel.com, ashok.raj@intel.com, fenghua.yu@intel.com, tom.zanussi@linux.intel.com, reinette.chatre@intel.com, linux-kernel@vger.kernel.org, patches@lists.linux.dev Subject: [RFC PATCH V3 18/26] vfio/pci: Preserve per-interrupt contexts Date: Fri, 27 Oct 2023 10:00:50 -0700 Message-Id: <12630e207092c11a69efe691a9273abcef831c18.1698422237.git.reinette.chatre@intel.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: References: MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Spam-Status: No, score=-2.1 required=5.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF, RCVD_IN_DNSWL_BLOCKED,SPF_HELO_NONE,SPF_NONE,URIBL_BLOCKED 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-Greylist: Sender passed SPF test, not delayed by milter-greylist-4.6.4 (snail.vger.email [0.0.0.0]); Fri, 27 Oct 2023 10:02:58 -0700 (PDT) Interrupt management for PCI passthrough devices create a new per-interrupt context every time an interrupt is allocated, freeing it when the interrupt is freed. The per-interrupt context contains the properties of a particular interrupt. Without a property that guides interrupt allocation and free it is acceptable to always create a new per-interrupt context. Maintain per-interrupt context across interrupt allocate and free events in preparation for per-interrupt properties that guide interrupt allocation and free. Examples of such properties are: (a) whether the interrupt is emulated or not, which guides whether the backend should indeed allocate and/or free an interrupt, (b) an instance cookie associated with the interrupt that needs to be provided to interrupt allocation when the interrupt is backed by IMS. This means that existence of per-interrupt context no longer implies a valid trigger, pointers to freed memory should be cleared, and a new per-interrupt context cannot be assumed needing allocation when an interrupt is allocated. Signed-off-by: Reinette Chatre --- Changes since RFC V2: - New patch drivers/vfio/pci/vfio_pci_intrs.c | 41 ++++++++++++++++++++++--------- 1 file changed, 29 insertions(+), 12 deletions(-) diff --git a/drivers/vfio/pci/vfio_pci_intrs.c b/drivers/vfio/pci/vfio_pci_intrs.c index 80040fde6f6b..8d84e7d62594 100644 --- a/drivers/vfio/pci/vfio_pci_intrs.c +++ b/drivers/vfio/pci/vfio_pci_intrs.c @@ -429,7 +429,7 @@ static int vfio_msi_set_vector_signal(struct vfio_pci_intr_ctx *intr_ctx, ctx = vfio_irq_ctx_get(intr_ctx, vector); - if (ctx) { + if (ctx && ctx->trigger) { irq_bypass_unregister_producer(&ctx->producer); irq = pci_irq_vector(pdev, vector); cmd = vfio_pci_memory_lock_and_enable(vdev); @@ -437,8 +437,9 @@ static int vfio_msi_set_vector_signal(struct vfio_pci_intr_ctx *intr_ctx, vfio_pci_memory_unlock_and_restore(vdev, cmd); /* Interrupt stays allocated, will be freed at MSI-X disable. */ kfree(ctx->name); + ctx->name = NULL; eventfd_ctx_put(ctx->trigger); - vfio_irq_ctx_free(intr_ctx, ctx, vector); + ctx->trigger = NULL; } if (fd < 0) @@ -451,16 +452,17 @@ static int vfio_msi_set_vector_signal(struct vfio_pci_intr_ctx *intr_ctx, return irq; } - ctx = vfio_irq_ctx_alloc(intr_ctx, vector); - if (!ctx) - return -ENOMEM; + /* Per-interrupt context remain allocated. */ + if (!ctx) { + ctx = vfio_irq_ctx_alloc(intr_ctx, vector); + if (!ctx) + return -ENOMEM; + } ctx->name = kasprintf(GFP_KERNEL_ACCOUNT, "vfio-msi%s[%d](%s)", msix ? "x" : "", vector, pci_name(pdev)); - if (!ctx->name) { - ret = -ENOMEM; - goto out_free_ctx; - } + if (!ctx->name) + return -ENOMEM; trigger = eventfd_ctx_fdget(fd); if (IS_ERR(trigger)) { @@ -504,8 +506,7 @@ static int vfio_msi_set_vector_signal(struct vfio_pci_intr_ctx *intr_ctx, eventfd_ctx_put(trigger); out_free_name: kfree(ctx->name); -out_free_ctx: - vfio_irq_ctx_free(intr_ctx, ctx, vector); + ctx->name = NULL; return ret; } @@ -704,7 +705,7 @@ static int vfio_pci_set_msi_trigger(struct vfio_pci_intr_ctx *intr_ctx, for (i = start; i < start + count; i++) { ctx = vfio_irq_ctx_get(intr_ctx, i); - if (!ctx) + if (!ctx || !ctx->trigger) continue; if (flags & VFIO_IRQ_SET_DATA_NONE) { eventfd_signal(ctx->trigger, 1); @@ -810,6 +811,22 @@ static void _vfio_pci_init_intr_ctx(struct vfio_pci_intr_ctx *intr_ctx) static void _vfio_pci_release_intr_ctx(struct vfio_pci_intr_ctx *intr_ctx) { + struct vfio_pci_irq_ctx *ctx; + unsigned long i; + + /* + * Per-interrupt context remains allocated after interrupt is + * freed. Per-interrupt context need to be freed separately. + */ + mutex_lock(&intr_ctx->igate); + xa_for_each(&intr_ctx->ctx, i, ctx) { + WARN_ON_ONCE(ctx->trigger); + WARN_ON_ONCE(ctx->name); + xa_erase(&intr_ctx->ctx, i); + kfree(ctx); + } + mutex_unlock(&intr_ctx->igate); + mutex_destroy(&intr_ctx->igate); } -- 2.34.1