Received: by 2002:a05:6902:102b:0:0:0:0 with SMTP id x11csp1333632ybt; Sun, 14 Jun 2020 19:21:56 -0700 (PDT) X-Google-Smtp-Source: ABdhPJzy7UMswKZRHtafz5sDNoGK5/IJnAsxhxAfj8vgdajsn/zQ/ApfQQ3jvb6tZmzJS77jeX7j X-Received: by 2002:a17:906:f185:: with SMTP id gs5mr22781558ejb.223.1592187715845; Sun, 14 Jun 2020 19:21:55 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1592187715; cv=none; d=google.com; s=arc-20160816; b=skO0f0T+U0TDM7vT6wz8eCx6vsizN+AqSntnXlfrAgRverM7Yxb/n4qUFn8fKCs/6F YG52jqjOjWk6Ji+c5DfqNiCwf562PhsJ9tt6lUQKyC7u/WiwzJMrQSy3MwkKp4w08RbR BsutQXoJweR/VV/xaRdFnSbio4g5b9HcMabrRvyfXtnmFZJgSKrzv7P+luX/2eakBBPy 5azsMHwMlkK88473SlO6UU2+Nx0+fLXanZgZtVcD/O0m7F94JQ67osMqWyVMeMt6YAlQ 6cjJ6rzg45H8ZcOyQPjZvxQigr6vhq1QSLwl1fPg3SxF9NG50jpprW+yaHSWM0E3pWsF MI7A== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-transfer-encoding :content-language:in-reply-to:mime-version:user-agent:date :message-id:from:references:to:subject:cc:ironport-sdr:ironport-sdr; bh=qdFW7vBnBAzN0jTOhTTDEw7oXvtTCbksk7Y19wqYJW0=; b=JgPyLnq1Q5zUeufvzzJDzVN2QeYb1YjpxY/WqTiIApUFScCOWTDjEvoUN0B01WlQNV inTorooK2ngJxgW+S3sDpRE2uxOYEfhNJAV/QFO3wwBkf6v6PUd8KtQ8FlSvLZ0RfnLY Joa82JPX/9qEuVbLjHCibxGnKAjVgeGICwOwcggpOjK8jhm6fRqP7eYeaC7HxioN9Bgz Q63AvoJmeZj3tDFr22+2fh63R96bPzeczimU4BicFoA9dxssiHbKKMaL1sEHxvNJysV9 OBW9xplNz/W7EoPBW76emF3s+IgtHzuhTXPPLPkirgoiDVeVPK2TtIEzfEvU9LuDFMRS KY4A== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=intel.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id m11si7858579edl.424.2020.06.14.19.21.33; Sun, 14 Jun 2020 19:21:55 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=intel.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1728062AbgFOCRt (ORCPT + 99 others); Sun, 14 Jun 2020 22:17:49 -0400 Received: from mga09.intel.com ([134.134.136.24]:35930 "EHLO mga09.intel.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727946AbgFOCRt (ORCPT ); Sun, 14 Jun 2020 22:17:49 -0400 IronPort-SDR: OUg25t2X5eSOIiPXTPsmTf4XIehvwkMrxVD2vE2pwWUS41zbJjOjydhoQNBeP4JFOihJLAdz1c 75mmKZoHDvaw== X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from fmsmga004.fm.intel.com ([10.253.24.48]) by orsmga102.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 14 Jun 2020 19:17:48 -0700 IronPort-SDR: Uob3CZWz0xNCSTRrbf7iB54YQSoy4usLaGVasoq/ksqhTs/VRiosycehEva16KGBqYrPirqqzE ar0CvARaiFHw== X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.73,513,1583222400"; d="scan'208";a="298321650" Received: from allen-box.sh.intel.com (HELO [10.239.159.139]) ([10.239.159.139]) by fmsmga004.fm.intel.com with ESMTP; 14 Jun 2020 19:17:43 -0700 Cc: baolu.lu@linux.intel.com, linux-kernel , x86 , iommu@lists.linux-foundation.org, amd-gfx , linuxppc-dev Subject: Re: [PATCH v2 11/12] x86/mmu: Allocate/free PASID To: Fenghua Yu , Thomas Gleixner , Ingo Molnar , Borislav Petkov , H Peter Anvin , David Woodhouse , Frederic Barrat , Andrew Donnellan , Felix Kuehling , Joerg Roedel , Dave Hansen , Tony Luck , Ashok Raj , Jacob Jun Pan , Dave Jiang , Yu-cheng Yu , Sohil Mehta , Ravi V Shankar References: <1592008893-9388-1-git-send-email-fenghua.yu@intel.com> <1592008893-9388-12-git-send-email-fenghua.yu@intel.com> From: Lu Baolu Message-ID: <4d759c15-d539-cd1a-569d-eefa5fb6f039@linux.intel.com> Date: Mon, 15 Jun 2020 10:13:42 +0800 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:68.0) Gecko/20100101 Thunderbird/68.8.0 MIME-Version: 1.0 In-Reply-To: <1592008893-9388-12-git-send-email-fenghua.yu@intel.com> Content-Type: text/plain; charset=utf-8; format=flowed Content-Language: en-US Content-Transfer-Encoding: 7bit Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Hi Fenghua, On 6/13/20 8:41 AM, Fenghua Yu wrote: > A PASID is allocated for an "mm" the first time any thread attaches > to an SVM capable device. Later device attachments (whether to the same > device or another SVM device) will re-use the same PASID. > > The PASID is freed when the process exits (so no need to keep > reference counts on how many SVM devices are sharing the PASID). > > Signed-off-by: Fenghua Yu > Reviewed-by: Tony Luck > --- > v2: > - Define a helper free_bind() to simplify error exit code in bind_mm() > (Thomas) > - Fix a ret error code in bind_mm() (Thomas) > - Change pasid's type from "int" to "unsigned int" to have consistent > pasid type in iommu (Thomas) > - Simplify alloc_pasid() a bit. > > arch/x86/include/asm/iommu.h | 2 + > arch/x86/include/asm/mmu_context.h | 14 ++++ > drivers/iommu/intel/svm.c | 101 +++++++++++++++++++++++++---- > 3 files changed, 105 insertions(+), 12 deletions(-) > > diff --git a/arch/x86/include/asm/iommu.h b/arch/x86/include/asm/iommu.h > index bf1ed2ddc74b..ed41259fe7ac 100644 > --- a/arch/x86/include/asm/iommu.h > +++ b/arch/x86/include/asm/iommu.h > @@ -26,4 +26,6 @@ arch_rmrr_sanity_check(struct acpi_dmar_reserved_memory *rmrr) > return -EINVAL; > } > > +void __free_pasid(struct mm_struct *mm); > + > #endif /* _ASM_X86_IOMMU_H */ > diff --git a/arch/x86/include/asm/mmu_context.h b/arch/x86/include/asm/mmu_context.h > index 47562147e70b..f8c91ce8c451 100644 > --- a/arch/x86/include/asm/mmu_context.h > +++ b/arch/x86/include/asm/mmu_context.h > @@ -13,6 +13,7 @@ > #include > #include > #include > +#include > > extern atomic64_t last_mm_ctx_id; > > @@ -117,9 +118,22 @@ static inline int init_new_context(struct task_struct *tsk, > init_new_context_ldt(mm); > return 0; > } > + > +static inline void free_pasid(struct mm_struct *mm) > +{ > + if (!IS_ENABLED(CONFIG_INTEL_IOMMU_SVM)) > + return; > + > + if (!cpu_feature_enabled(X86_FEATURE_ENQCMD)) > + return; > + > + __free_pasid(mm); > +} > + > static inline void destroy_context(struct mm_struct *mm) > { > destroy_context_ldt(mm); > + free_pasid(mm); > } > > extern void switch_mm(struct mm_struct *prev, struct mm_struct *next, > diff --git a/drivers/iommu/intel/svm.c b/drivers/iommu/intel/svm.c > index 4e775e12ae52..27dc866b8461 100644 > --- a/drivers/iommu/intel/svm.c > +++ b/drivers/iommu/intel/svm.c > @@ -425,6 +425,53 @@ int intel_svm_unbind_gpasid(struct device *dev, unsigned int pasid) > return ret; > } > > +static void free_bind(struct intel_svm *svm, struct intel_svm_dev *sdev, > + bool new_pasid) > +{ > + if (new_pasid) > + ioasid_free(svm->pasid); > + kfree(svm); > + kfree(sdev); > +} > + > +/* > + * If this mm already has a PASID, use it. Otherwise allocate a new one. > + * Let the caller know if a new PASID is allocated via 'new_pasid'. > + */ > +static int alloc_pasid(struct intel_svm *svm, struct mm_struct *mm, > + unsigned int pasid_max, bool *new_pasid, > + unsigned int flags) > +{ > + unsigned int pasid; > + > + *new_pasid = false; > + > + /* > + * Reuse the PASID if the mm already has a PASID and not a private > + * PASID is requested. > + */ > + if (mm && mm->pasid && !(flags & SVM_FLAG_PRIVATE_PASID)) { > + /* > + * Once a PASID is allocated for this mm, the PASID > + * stays with the mm until the mm is dropped. Reuse > + * the PASID which has been already allocated for the > + * mm instead of allocating a new one. > + */ > + ioasid_set_data(mm->pasid, svm); How about adding some sanity checks here? For example, void *p = ioasid_find(NULL, mm->pasid, NULL); if (!p) ioasid_set_data(mm->pasid, svm); else if (IS_ERR(p) || p != svm) return INVALID_IOSASID; Best regards, baolu