Received: by 2002:a25:6193:0:0:0:0:0 with SMTP id v141csp853037ybb; Wed, 25 Mar 2020 10:51:46 -0700 (PDT) X-Google-Smtp-Source: ADFU+vtMBw/cweZ0Ns4iCKdfOAsq6LZ2/nWwbX8GuRYtWS/C4eyd3YHdtpfgWQ+v+wb4RDLQ5TVG X-Received: by 2002:a05:6830:1e38:: with SMTP id t24mr3231140otr.125.1585158705927; Wed, 25 Mar 2020 10:51:45 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1585158705; cv=none; d=google.com; s=arc-20160816; b=xvnfSikzsodtwZS7ZxBN9ynkQCrgTZQSI8RcD6eYnE7elMnKxhqRLEtINfZM0z3DGR rttwSCGhcwDVy26ds/5QEQ6Ipc+MtdZSYWJ5SKyUDO3Eg8pfuKljm/4WVc+dSh9MimcF ZyFbizI+KNn1vXA7TKFI9JiWGkOkMlmIvnUHRsLF4ZZkqchSXUhqQMNX0kyl6yTQPMjk HS+qfsj12UfqI+XuP8PZU1qZONCC93uW6jDITVZ1vSqSbW4D15FIuhWBhNtwxqEf4fIR jG7JJ8Z0R8EfuafHXIxM+whxde+4MqQr3ts6Q1nooXO6Du3Vzj2+LjciQHuU9jdw1Ios S+gw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:references:in-reply-to:message-id:date :subject:cc:to:from:ironport-sdr:ironport-sdr; bh=TYTaVkvFN4yeKYCbx6xRj+4Kx71t3Yfq8lip0boU4/8=; b=sZ41Xhnb/JyJHoI3fZmo4LpYsppRBLt1FSD0IqX4+W4qDMjzk71LplgaoFLirRFDaP kj/3dWUS5VhIvRu+OZfqtxgw5JPjS6A5aiJExRF3TLs1pAxAA0dtmCrKEH2rzywrPpX/ 0QME14m3bc4SjzZ8qdqM01eqFaFClmnhgNw2FC5SOD58toRos+czRC6albJ0Hi+QoF8u wJo15uUIkzcA6CAIqALln6QWGaeKLThb58P+puWlUiuATsjr8FGzDmqy4FUdGLfnHkHo WgDsg7yBbOkGy1DYiPA7HRgkHhZ8mt+mtnZDKxeppUOHawV5sIJATgdC6dklgzvLULOg WtIw== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 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. [209.132.180.67]) by mx.google.com with ESMTP id f18si10553118oti.289.2020.03.25.10.51.33; Wed, 25 Mar 2020 10:51:45 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 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 S1728209AbgCYRtx (ORCPT + 99 others); Wed, 25 Mar 2020 13:49:53 -0400 Received: from mga12.intel.com ([192.55.52.136]:57499 "EHLO mga12.intel.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1728069AbgCYRtu (ORCPT ); Wed, 25 Mar 2020 13:49:50 -0400 IronPort-SDR: 7Q3VCDn5zsvOCWl1Czg3M1U/2Hh1Ijo4i0tYNy/H4ZYmQxtx40oS8HzjL70zta0lJegz7XkA/c a650s5v3VODQ== X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from orsmga004.jf.intel.com ([10.7.209.38]) by fmsmga106.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 25 Mar 2020 10:49:48 -0700 IronPort-SDR: BihTnyWnSBPc+OwyYlWCAPoMgLHJvTnwNeKA8KxGMt7J0VxYvhkJLlGZ7bnDac4xgABtMwbQQC 2mWvpE41GAkg== X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.72,305,1580803200"; d="scan'208";a="393702203" Received: from jacob-builder.jf.intel.com ([10.7.199.155]) by orsmga004.jf.intel.com with ESMTP; 25 Mar 2020 10:49:48 -0700 From: Jacob Pan To: Joerg Roedel , Alex Williamson , "Lu Baolu" , iommu@lists.linux-foundation.org, LKML , David Woodhouse , Jean-Philippe Brucker Cc: "Yi Liu" , "Tian, Kevin" , Raj Ashok , "Christoph Hellwig" , Jonathan Cameron , Eric Auger , Jacob Pan Subject: [PATCH 05/10] iommu/ioasid: Create an IOASID set for host SVA use Date: Wed, 25 Mar 2020 10:55:26 -0700 Message-Id: <1585158931-1825-6-git-send-email-jacob.jun.pan@linux.intel.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1585158931-1825-1-git-send-email-jacob.jun.pan@linux.intel.com> References: <1585158931-1825-1-git-send-email-jacob.jun.pan@linux.intel.com> Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Bare metal SVA allocates IOASIDs for native process addresses. This should be separated from VM allocated IOASIDs thus under its own set. This patch creates a system IOASID set with its quota set to PID_MAX. This is a reasonable default in that SVM capable devices can only bind to limited user processes. Signed-off-by: Jacob Pan --- drivers/iommu/intel-iommu.c | 8 +++++++- drivers/iommu/ioasid.c | 9 +++++++++ include/linux/ioasid.h | 9 +++++++++ 3 files changed, 25 insertions(+), 1 deletion(-) diff --git a/drivers/iommu/intel-iommu.c b/drivers/iommu/intel-iommu.c index ec3fc121744a..af7a1ef7b31e 100644 --- a/drivers/iommu/intel-iommu.c +++ b/drivers/iommu/intel-iommu.c @@ -3511,8 +3511,14 @@ static int __init init_dmars(void) goto free_iommu; /* PASID is needed for scalable mode irrespective to SVM */ - if (intel_iommu_sm) + if (intel_iommu_sm) { ioasid_install_capacity(intel_pasid_max_id); + /* We should not run out of IOASIDs at boot */ + if (ioasid_alloc_system_set(PID_MAX_DEFAULT)) { + pr_err("Failed to enable host PASID allocator\n"); + intel_iommu_sm = 0; + } + } /* * for each drhd diff --git a/drivers/iommu/ioasid.c b/drivers/iommu/ioasid.c index 6265d2dbbced..9135af171a7c 100644 --- a/drivers/iommu/ioasid.c +++ b/drivers/iommu/ioasid.c @@ -39,6 +39,9 @@ struct ioasid_data { static ioasid_t ioasid_capacity; static ioasid_t ioasid_capacity_avail; +int system_ioasid_sid; +static DECLARE_IOASID_SET(system_ioasid); + /* System capacity can only be set once */ void ioasid_install_capacity(ioasid_t total) { @@ -51,6 +54,12 @@ void ioasid_install_capacity(ioasid_t total) } EXPORT_SYMBOL_GPL(ioasid_install_capacity); +int ioasid_alloc_system_set(int quota) +{ + return ioasid_alloc_set(&system_ioasid, quota, &system_ioasid_sid); +} +EXPORT_SYMBOL_GPL(ioasid_alloc_system_set); + /* * struct ioasid_allocator_data - Internal data structure to hold information * about an allocator. There are two types of allocators: diff --git a/include/linux/ioasid.h b/include/linux/ioasid.h index 8c82d2625671..097b1cc043a3 100644 --- a/include/linux/ioasid.h +++ b/include/linux/ioasid.h @@ -29,6 +29,9 @@ struct ioasid_allocator_ops { void *pdata; }; +/* Shared IOASID set for reserved for host system use */ +extern int system_ioasid_sid; + #define DECLARE_IOASID_SET(name) struct ioasid_set name = { 0 } #if IS_ENABLED(CONFIG_IOASID) @@ -41,6 +44,7 @@ int ioasid_register_allocator(struct ioasid_allocator_ops *allocator); void ioasid_unregister_allocator(struct ioasid_allocator_ops *allocator); int ioasid_attach_data(ioasid_t ioasid, void *data); void ioasid_install_capacity(ioasid_t total); +int ioasid_alloc_system_set(int quota); int ioasid_alloc_set(struct ioasid_set *token, ioasid_t quota, int *sid); void ioasid_free_set(int sid, bool destroy_set); int ioasid_find_sid(ioasid_t ioasid); @@ -88,5 +92,10 @@ static inline void ioasid_install_capacity(ioasid_t total) { } +static inline int ioasid_alloc_system_set(int quota) +{ + return -ENOTSUPP; +} + #endif /* CONFIG_IOASID */ #endif /* __LINUX_IOASID_H */ -- 2.7.4