Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S933754AbdCVHFt (ORCPT ); Wed, 22 Mar 2017 03:05:49 -0400 Received: from mail-cys01nam02on0087.outbound.protection.outlook.com ([104.47.37.87]:25814 "EHLO NAM02-CY1-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1758876AbdCVHEb (ORCPT ); Wed, 22 Mar 2017 03:04:31 -0400 Authentication-Results: vger.kernel.org; dkim=none (message not signed) header.d=none;vger.kernel.org; dmarc=none action=none header.from=amd.com; From: Suravee Suthikulpanit To: , CC: , , , , Suravee Suthikulpanit Subject: [PATCH v12 09/10] perf/amd/iommu: Introduce amd_iommu-specific struct in struct hw_perf_event Date: Wed, 22 Mar 2017 02:02:41 -0500 Message-ID: <1490166162-10002-10-git-send-email-Suravee.Suthikulpanit@amd.com> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1490166162-10002-1-git-send-email-Suravee.Suthikulpanit@amd.com> References: <1490166162-10002-1-git-send-email-Suravee.Suthikulpanit@amd.com> MIME-Version: 1.0 Content-Type: text/plain X-Originating-IP: [114.109.128.54] X-ClientProxiedBy: SG2PR01CA0012.apcprd01.prod.exchangelabs.com (10.165.9.150) To MWHPR12MB1454.namprd12.prod.outlook.com (10.172.55.135) X-MS-Office365-Filtering-Correlation-Id: 425c3b92-c691-4e68-3752-08d470f19d65 X-MS-Office365-Filtering-HT: Tenant X-Microsoft-Antispam: UriScan:;BCL:0;PCL:0;RULEID:(22001)(48565401081);SRVR:MWHPR12MB1454; X-Microsoft-Exchange-Diagnostics: 1;MWHPR12MB1454;3:/RnnDTOCh3uIEto0PzGYpleuhVXMz9KoJZ4jIG3ftBzeGsobB21SRCV7RGhZ0e4M+hvnujKz+kKrS1PCgklHjJJcHaPCWMsbRf56ebKTb/HvivpzXxhWZhWtNZzayhvO3oIvLLHXJqAPYfCn6kuTZxGtW3pNUFPKX1hkvFBScBgUrJB+8s/fk9k6aqPD4gcZ/kvoPN2yCJZeW/WOzDL1rjiFZuRp6lleCqGLRl/aTG79I3oBBpUwK42CGVyLfzTil6TENWfk4gQRtRv7qFj/Z+fYUImpURDHgV2wzcXrT+Y=;25:ZZsGHD2iKqPftayEVmVAWub7M4tzJ5qRj9Hw+9xrKYxH/PryeOA7IuWxgqhwW1gR0B9dfdHsDKhBcm7bk6OAqKQDdGtv6VuZsW5ZyhlQkNUVb/2fTC7VisHXjxSfQwRU8vxz9WDJOSh0XbB4guUpN4IS5s3qlqhjlIHPs9fca7VdEV8GpxaQuDVRMsO4hMDjW3YFtdrQdVnyij/P5mOBRnyvaJkANGszyzQcdSkzQRq7NVSncAeR49sSqOH3IIXTAWg3hQBnYy3BpIWXTV8ZTxXIK2cRIbT7cx1/lPJovcoySBs5AS/IVZOEjYSzHd0SZ67JKRwbRIg7iFUEPLQEQNbxRGhf+dn95hS6hdzctWGLe2eYRv59mNRF9cYqeCUixbIgWkw/7OQYoOkro6DJIFNsOhOW6c7iwcI91bty3qgLB4ssD/NE/GdZCA1RMwig1y2qx+wmFSjgbWaBosd29Q== X-Microsoft-Exchange-Diagnostics: 1;MWHPR12MB1454;31:FyazT8v2SGeCmlsfbxntnIMQ7G8SlSDH111DvS5n5lpQUjPgeJvVm7iNp1zyAyp6+fBlH2s9HYgD7HQYrIhXNaBM2/pbgdc2uoDGKiGoVUzESN30Q0g5POiFBYyzBYgE5pYl9vA9MtaqNDW988Nn1ylpdFO5gnUxCQczW6PpTFEp/A/vsMoydYaFseIFj4C2Cd1Jf9X7BES4VSaC1GfwT3Q2zWD5H3t3hAYXxajqk3A=;20:0fuljywHFacMKCK/UW0jkXbPwKg8tth17Q3uzYqHUepaqvNIjVavuWrR4wUsivKdMZFLVvZTU4bH3Qz9JPxLqmEY1nL3aSrlmrnVUXl7Yi32yvVtRqUFOIrvOt8Sr0rWVzl0Fw/3zQdqI/s3C9YMahuXoZT75Knz1NPGNNaitzW4v40MVz0aImSqq4CxTO8edItEuQgV2Nylwb0+YncZekiT7uHn+IR4uL9Kjlxac3ExPAIGtgZIMom+FHNGbFC1WdbyyDia4SHae+Y4C/uafMUH5o1vhNWal1Z8a1g9uUaxwipk2g9doTl4XY8nFz2MwxpvxYOJ6O5695zUJ0W+lScC+/86eYMQqY/FffX162cU4oaRn9BLA+JygW6gTKb2wuLPhuD2/WZ4/KscoP/HgU325THYngtvfMxW5jqp5GhclY3JI+9kMw1a1m/BQlDbbzB++43IPR/wEOL51OEJkAA2QVnVg7IqW6V5FHRCsZRIq0qujsmBdrylut4GTZPT X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:(767451399110)(17755550239193); X-Exchange-Antispam-Report-CFA-Test: BCL:0;PCL:0;RULEID:(6040375)(601004)(2401047)(8121501046)(5005006)(3002001)(10201501046)(6055026)(6041248)(20161123555025)(20161123560025)(20161123558025)(20161123562025)(20161123564025)(6072148);SRVR:MWHPR12MB1454;BCL:0;PCL:0;RULEID:;SRVR:MWHPR12MB1454; X-Microsoft-Exchange-Diagnostics: 1;MWHPR12MB1454;4:4tSBakBspb1XI3S70zmeTzymZCP881dt+zxdDNjT9jeXftTsR3RV9J5ZAy7ITi+B7JmxRWAuKwr3W2x2KDpBHUR8Ed6+LtnOKdioQ+Zsld3tEDykU4IovSYdtMr7tBp/JBYfMmMgXZm3ilwIe4G9DmFF0AWSzn5xPt2zn1uA9f7RFaw5qNIWmRfnO4XjJ2mfT+t1W42lByGp4uGMZeDJQVR7DuGtsjNbUhfenfMdZ3MSDyQwZEnkfA64jl0X/SSk9Xj7KAowoWLcmPsj+6QArRxAdVoYemuN7WyEz3jPpRzirVIVHwkq256g3EB9cjS8so4UoqL5t4CDuPdg5ycNM9UvRYhfJOBDsxdKU/bMhc7eM6lLbNmUGz2PJ6rT504A9D1TT/Mr6qzkQ1BGejIfb1ZNGGpfRKSOnHGsqvBw7AhZW3Tiikfo1J9zrpFR97oAFoIZUEjn+S0cyAmZidbngoOrAWusbdZaXmb0kRbYNG41fOQLWb1+PWcZ4OWXsNRh7SWTVmza+01Ldx5fjI5xt8SMVmxta5IDh2oTefNsec6pOL3RAGhUTPKJMFYN7EHBzYHAOH+8ikIs8YpbXVdl3VqAxljUN/XXz1lVlRa/3oudTlVkqBFEBaEeOptun3FXqZvk8PX1Ke4cSpG4o/EWi8Z4oOQleTFEgt4NNb0QdG+6RiD+4fFvoc2dkR1jQTLCYFZphCFjaJn7w5mszN2XuQ== X-Forefront-PRVS: 02543CD7CD X-Forefront-Antispam-Report: SFV:NSPM;SFS:(10009020)(4630300001)(6009001)(39410400002)(39840400002)(39860400002)(39450400003)(39850400002)(50466002)(189998001)(2950100002)(4326008)(6666003)(6486002)(5660300001)(50226002)(8676002)(5003940100001)(47776003)(66066001)(81166006)(53936002)(6506006)(50986999)(76176999)(4720700003)(54906002)(2906002)(42186005)(38730400002)(7736002)(36756003)(305945005)(6512007)(3846002)(6116002)(86362001)(25786009);DIR:OUT;SFP:1101;SCL:1;SRVR:MWHPR12MB1454;H:ssuthiku-rhel73.localdomain;FPR:;SPF:None;MLV:sfv;LANG:en; X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1;MWHPR12MB1454;23:gfSfE2HXs6CANwcQbuQTstt/j/vw1a/8IMdbsKZcy?= =?us-ascii?Q?wl4dYTY1X/rQHhGF13LK350ThVUEbY9/ITDqmjprV2z4PMKSFtPat9fIDHz8?= =?us-ascii?Q?Fip96vou+zjZwjT2e55aEqAGKKB7RA8GWl7sQ/yp4Y70NZm2+jI8Fyi1aKGn?= =?us-ascii?Q?qjb7mZolnsnIhnutcKRyFY+hDBlIMizc4VYpJItKBx1cWCZ2pBtMXu1QaEtR?= =?us-ascii?Q?eFwlIzP1ZHKIyKkgfs5yDxsl0oNLTfuoY/dv1fhnOYKeYUR+6cKTqB8lrsqN?= =?us-ascii?Q?kvbuHlCFfxLoGasMTAi3i1f4G1eY4DX5bYBqP2Mrwt+QGmPzCr54i2fKcOej?= =?us-ascii?Q?y68EwspfdlkYOPHILGPdXsba45PGM7Lf2QqhU91wWeLzZPoi9pTnqnzLJQQ7?= =?us-ascii?Q?zc6aqxYHuOrC4Vg7J7lR05la/zKJLjbgrDnHa7evJLseT0y4qHCJjPkBqQsp?= =?us-ascii?Q?g9gpNQAQ7eXOiLI0fk8ues3DwBRLrCVGkpwluPpqmR7168tgInfijtawhGs7?= =?us-ascii?Q?rlNdNpOY/CKpmJ0NBq22duV9VP+DGf0rVeUwNwotTL6jlmMa/ACyCHJy9uCG?= =?us-ascii?Q?muQJh+jcDzWjoMZukHk7En6u52Nri833KpBhvHalVc1V8vjLB4xbAqwrs3g1?= =?us-ascii?Q?1KNA3YHkaAJfkJsGZUQNzgL90+GZW0lMHd8xar53zzPYWepFm31vBDsMB+IG?= =?us-ascii?Q?HcK/BPhQ8TZv1hZAIVeO7HqhJqK5MTgtlJvF9uPsdBQWnvGONRGsNGha8ZWm?= =?us-ascii?Q?zoX5okgNvSlT8OD1Mo6bOpeLX8Yl7IHRt27MqDBP/QwYvMkukZ1h1JMu2HTE?= =?us-ascii?Q?+7MDx6QLQjYYUdZvvB+2UYkzGe+IGbDaAmgAS3FWv6TozOfmoIdp/OPFyzm8?= =?us-ascii?Q?pEliKQ++kGKNrufJ706T7laUd14RN76vAQfNBGWSt/ozWQwRHZrBvIWa/SsJ?= =?us-ascii?Q?TX3mP6dt5dZOn19N4i+cjlXTpNIvGAjEraiaXVGNQ=3D=3D?= X-Microsoft-Exchange-Diagnostics: 1;MWHPR12MB1454;6:/6BuO2A8Zcf9KHlYlHDzjB/ob6EY29vaKQe+FC7TnPavgUgpqq18lD4+rvuAReQPVoJA8Pe95f/qjqnlDkVJDjCiKY3UxccofpGN9WUZFmHd8f82aN4voQEJU0rkNLYKMaQJa7peM2aLGYvBBP7BBziA8+v/vlJy5F9FoqmmXMllodfslxxI0+TnCEdJA4jgc3zEotGKgcAArUdPZ0tajw/5Wq9kqP/4iXclq/QwPks1WKR74Ryd01M32dlFvz/GggpYghg+EZSnTb4yJxGfNn0E8vSO8/v28w56SQ4uCZhVk98HdiqGC750znh2zYtGDV2NkuWzGhMkA9o9UQknFNZV2W4amrPD3OS7FZdBIOKLau/pAAhBowGsL2x8VCLZd3zEr1c2CB3IXpMcqKUlmzm/tOAp2qr2hh02hCu9P5g=;5:I5aaqbMN8nzLdSlYwuQheSpj6zr8GFCWYgzg1x0sUgM9m1N2+vw5umppf/r4Z1WFqZ9UaGvASEXn6Tb8t1LjunfMJbmQMiIHGRXJlAle19XmPiaY+jxpPnXfuEWVW8yKAYpgbJe4jwaZImn68VxEbg==;24:L66RgrZJSG8v/ioxzLMIM+jxWZA3XyZTISoNoPE8L3+qarWSqmuPMAgueMJ27Qcu+npKauVGDtVd9lwNKPl5EnS3nCd24sLa/UV6x/O2FJI= SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-Microsoft-Exchange-Diagnostics: 1;MWHPR12MB1454;7:p9/G3DBaa7zaPrfZq5Zt25XdRINPerb6TjB4JjeA2x6QpX0t7omSv5gNiY6b6IvFiZ4CqzV1iNgmb8ile+i0e5ezh2HWuWb4FWQCb/WbccvyJvXpRIKmQPDn4ryQX5GfJQOW+b6z97haVcO/YFq0fO/+mEZ1Vfko/N1jimw5mrFXeWH4CLQMfhza5RvWMTQ/xBNqRkSnkvIED4iBSu+VTcFYpe38mhyFBj7IHsfcl1q6kVt+v3p80iMjsfmzdSPRfB9txUnpTbzXx7gPsjOkgl5LXJK6/8LP1WVdDinlkcbV8IDhoT7t+NiQjEE+SeZAmmuswvfmUKj1V2xPIvkxEQ==;20:gJJL4+zeamup+FMEYu9FET8YiOUkrcoPfAsN0OtKmrc9DojUkDeHu2z6awCKCU2/DLggbypaaJR/bTGQPaFird3/YWpp6b7eSM5lZEV4dn9ubX/1EntTKczREG7NCpMyUeTEvhz/+OfSWSljCsKS3RB02t3blnFKBHCaFKu0x/gEyY85xRHuMjxGxN6WGCGs9O576xQqR5iHJMaRguID2KPbortbmMx0tY630uUsf15dvzqQxSMMOGTFRxln5vO1 X-OriginatorOrg: amd.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 22 Mar 2017 07:03:57.5350 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-Transport-CrossTenantHeadersStamped: MWHPR12MB1454 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 9424 Lines: 279 From: Suravee Suthikulpanit Current AMD IOMMU Perf PMU inappropriately uses hardware struct inside the union inside the struct hw_perf_event, mainly the use of extra_reg. Instead, introduce amd_iommu-specific struct with required parameters to be programmed onto the IOMMU performance counter control register. Also update the pasid field from 16 to 20 bits. Cc: Peter Zijlstra Cc: Borislav Petkov Signed-off-by: Suravee Suthikulpanit --- arch/x86/events/amd/iommu.c | 102 +++++++++++++++++++------------------------- include/linux/perf_event.h | 7 +++ 2 files changed, 52 insertions(+), 57 deletions(-) diff --git a/arch/x86/events/amd/iommu.c b/arch/x86/events/amd/iommu.c index 7ac8138..915a20c 100644 --- a/arch/x86/events/amd/iommu.c +++ b/arch/x86/events/amd/iommu.c @@ -23,17 +23,16 @@ #define COUNTER_SHIFT 16 -#define _GET_BANK(ev) ((u8)(ev->hw.extra_reg.reg >> 8)) -#define _GET_CNTR(ev) ((u8)(ev->hw.extra_reg.reg)) - -/* iommu pmu config masks */ -#define _GET_CSOURCE(ev) ((ev->hw.config & 0xFFULL)) -#define _GET_DEVID(ev) ((ev->hw.config >> 8) & 0xFFFFULL) -#define _GET_PASID(ev) ((ev->hw.config >> 24) & 0xFFFFULL) -#define _GET_DOMID(ev) ((ev->hw.config >> 40) & 0xFFFFULL) -#define _GET_DEVID_MASK(ev) ((ev->hw.extra_reg.config) & 0xFFFFULL) -#define _GET_PASID_MASK(ev) ((ev->hw.extra_reg.config >> 16) & 0xFFFFULL) -#define _GET_DOMID_MASK(ev) ((ev->hw.extra_reg.config >> 32) & 0xFFFFULL) +/* iommu pmu conf masks */ +#define GET_CSOURCE(x) (x->conf & 0xFFULL) +#define GET_DEVID(x) ((x->conf >> 8) & 0xFFFFULL) +#define GET_DOMID(x) ((x->conf >> 24) & 0xFFFFULL) +#define GET_PASID(x) ((x->conf >> 40) & 0xFFFFFULL) + +/* iommu pmu conf1 masks */ +#define GET_DEVID_MASK(x) (x->conf1 & 0xFFFFULL) +#define GET_DOMID_MASK(x) ((x->conf1 >> 16) & 0xFFFFULL) +#define GET_PASID_MASK(x) ((x->conf1 >> 32) & 0xFFFFFULL) static struct perf_amd_iommu __perf_iommu; @@ -50,11 +49,11 @@ struct perf_amd_iommu { *---------------------------------------------*/ PMU_FORMAT_ATTR(csource, "config:0-7"); PMU_FORMAT_ATTR(devid, "config:8-23"); -PMU_FORMAT_ATTR(pasid, "config:24-39"); -PMU_FORMAT_ATTR(domid, "config:40-55"); +PMU_FORMAT_ATTR(domid, "config:24-39"); +PMU_FORMAT_ATTR(pasid, "config:40-59"); PMU_FORMAT_ATTR(devid_mask, "config1:0-15"); -PMU_FORMAT_ATTR(pasid_mask, "config1:16-31"); -PMU_FORMAT_ATTR(domid_mask, "config1:32-47"); +PMU_FORMAT_ATTR(domid_mask, "config1:16-31"); +PMU_FORMAT_ATTR(pasid_mask, "config1:32-51"); static struct attribute *iommu_format_attrs[] = { &format_attr_csource.attr, @@ -150,10 +149,13 @@ static ssize_t _iommu_cpumask_show(struct device *dev, /*---------------------------------------------*/ -static int get_next_avail_iommu_bnk_cntr(struct perf_amd_iommu *perf_iommu) +static int get_next_avail_iommu_bnk_cntr(struct perf_event *event) { unsigned long flags; - int shift, bank, cntr, retval; + u32 shift, bank, cntr; + int retval; + struct perf_amd_iommu *perf_iommu = + container_of(event->pmu, struct perf_amd_iommu, pmu); int max_banks = perf_iommu->max_banks; int max_cntrs = perf_iommu->max_counters; @@ -166,7 +168,9 @@ static int get_next_avail_iommu_bnk_cntr(struct perf_amd_iommu *perf_iommu) continue; } else { perf_iommu->cntr_assign_mask |= BIT_ULL(shift); - retval = ((bank & 0xFF) << 8) | (cntr & 0xFF); + event->hw.iommu_bank = bank; + event->hw.iommu_cntr = cntr; + retval = 0; goto out; } } @@ -202,8 +206,6 @@ static int clear_avail_iommu_bnk_cntr(struct perf_amd_iommu *perf_iommu, static int perf_iommu_event_init(struct perf_event *event) { struct hw_perf_event *hwc = &event->hw; - struct perf_amd_iommu *perf_iommu; - u64 config, config1; /* test the event attr type check for PMU enumeration */ if (event->attr.type != event->pmu->type) @@ -225,21 +227,9 @@ static int perf_iommu_event_init(struct perf_event *event) if (event->cpu < 0) return -EINVAL; - perf_iommu = &__perf_iommu; - - if (event->pmu != &perf_iommu->pmu) - return -ENOENT; - - if (perf_iommu) { - config = event->attr.config; - config1 = event->attr.config1; - } else { - return -EINVAL; - } - /* update the hw_perf_event struct with the iommu config data */ - hwc->config = config; - hwc->extra_reg.config = config1; + hwc->conf = event->attr.config; + hwc->conf1 = event->attr.config1; return 0; } @@ -247,26 +237,28 @@ static int perf_iommu_event_init(struct perf_event *event) static void perf_iommu_enable_event(struct perf_event *ev) { struct amd_iommu *iommu = get_amd_iommu(0); - u8 csource = _GET_CSOURCE(ev); - u16 devid = _GET_DEVID(ev); - u8 bank = _GET_BANK(ev); - u8 cntr = _GET_CNTR(ev); + struct hw_perf_event *hwc = &ev->hw; + u8 bank = hwc->iommu_bank; + u8 cntr = hwc->iommu_cntr; u64 reg = 0ULL; - reg = csource; + reg = GET_CSOURCE(hwc); amd_iommu_pc_set_reg(iommu, bank, cntr, IOMMU_PC_COUNTER_SRC_REG, ®); - reg = devid | (_GET_DEVID_MASK(ev) << 32); + reg = GET_DEVID_MASK(hwc); + reg = GET_DEVID(hwc) | (reg << 32); if (reg) reg |= BIT(31); amd_iommu_pc_set_reg(iommu, bank, cntr, IOMMU_PC_DEVID_MATCH_REG, ®); - reg = _GET_PASID(ev) | (_GET_PASID_MASK(ev) << 32); + reg = GET_PASID_MASK(hwc); + reg = GET_PASID(hwc) | (reg << 32); if (reg) reg |= BIT(31); amd_iommu_pc_set_reg(iommu, bank, cntr, IOMMU_PC_PASID_MATCH_REG, ®); - reg = _GET_DOMID(ev) | (_GET_DOMID_MASK(ev) << 32); + reg = GET_DOMID_MASK(hwc); + reg = GET_DOMID(hwc) | (reg << 32); if (reg) reg |= BIT(31); amd_iommu_pc_set_reg(iommu, bank, cntr, IOMMU_PC_DOMID_MATCH_REG, ®); @@ -275,16 +267,16 @@ static void perf_iommu_enable_event(struct perf_event *ev) static void perf_iommu_disable_event(struct perf_event *event) { struct amd_iommu *iommu = get_amd_iommu(0); + struct hw_perf_event *hwc = &event->hw; u64 reg = 0ULL; - amd_iommu_pc_set_reg(iommu, _GET_BANK(event), _GET_CNTR(event), + amd_iommu_pc_set_reg(iommu, hwc->iommu_bank, hwc->iommu_cntr, IOMMU_PC_COUNTER_SRC_REG, ®); } static void perf_iommu_start(struct perf_event *event, int flags) { struct hw_perf_event *hwc = &event->hw; - struct amd_iommu *iommu = get_amd_iommu(0); if (WARN_ON_ONCE(!(hwc->state & PERF_HES_STOPPED))) return; @@ -293,8 +285,10 @@ static void perf_iommu_start(struct perf_event *event, int flags) hwc->state = 0; if (flags & PERF_EF_RELOAD) { - u64 prev_raw_count = local64_read(&hwc->prev_count); - amd_iommu_pc_set_reg(iommu, _GET_BANK(event), _GET_CNTR(event), + u64 prev_raw_count = local64_read(&hwc->prev_count); + struct amd_iommu *iommu = get_amd_iommu(0); + + amd_iommu_pc_set_reg(iommu, hwc->iommu_bank, hwc->iommu_cntr, IOMMU_PC_COUNTER_REG, &prev_raw_count); } @@ -309,7 +303,7 @@ static void perf_iommu_read(struct perf_event *event) struct hw_perf_event *hwc = &event->hw; struct amd_iommu *iommu = get_amd_iommu(0); - if (amd_iommu_pc_get_reg(iommu, _GET_BANK(event), _GET_CNTR(event), + if (amd_iommu_pc_get_reg(iommu, hwc->iommu_bank, hwc->iommu_cntr, IOMMU_PC_COUNTER_REG, &count)) return; @@ -329,7 +323,6 @@ static void perf_iommu_read(struct perf_event *event) static void perf_iommu_stop(struct perf_event *event, int flags) { struct hw_perf_event *hwc = &event->hw; - u64 config; if (hwc->state & PERF_HES_UPTODATE) return; @@ -341,7 +334,6 @@ static void perf_iommu_stop(struct perf_event *event, int flags) if (hwc->state & PERF_HES_UPTODATE) return; - config = hwc->config; perf_iommu_read(event); hwc->state |= PERF_HES_UPTODATE; } @@ -349,16 +341,12 @@ static void perf_iommu_stop(struct perf_event *event, int flags) static int perf_iommu_add(struct perf_event *event, int flags) { int retval; - struct perf_amd_iommu *perf_iommu = - container_of(event->pmu, struct perf_amd_iommu, pmu); event->hw.state = PERF_HES_UPTODATE | PERF_HES_STOPPED; /* request an iommu bank/counter */ - retval = get_next_avail_iommu_bnk_cntr(perf_iommu); - if (retval != -ENOSPC) - event->hw.extra_reg.reg = (u16)retval; - else + retval = get_next_avail_iommu_bnk_cntr(event); + if (retval) return retval; if (flags & PERF_EF_START) @@ -369,6 +357,7 @@ static int perf_iommu_add(struct perf_event *event, int flags) static void perf_iommu_del(struct perf_event *event, int flags) { + struct hw_perf_event *hwc = &event->hw; struct perf_amd_iommu *perf_iommu = container_of(event->pmu, struct perf_amd_iommu, pmu); @@ -376,8 +365,7 @@ static void perf_iommu_del(struct perf_event *event, int flags) /* clear the assigned iommu bank/counter */ clear_avail_iommu_bnk_cntr(perf_iommu, - _GET_BANK(event), - _GET_CNTR(event)); + hwc->iommu_bank, hwc->iommu_cntr); perf_event_update_userpage(event); } diff --git a/include/linux/perf_event.h b/include/linux/perf_event.h index 000fdb2..14c0767 100644 --- a/include/linux/perf_event.h +++ b/include/linux/perf_event.h @@ -165,6 +165,13 @@ struct hw_perf_event { struct list_head bp_list; }; #endif + struct { /* amd_iommu */ + u8 iommu_bank; + u8 iommu_cntr; + u16 padding; + u64 conf; + u64 conf1; + }; }; /* * If the event is a per task event, this will point to the task in -- 1.8.3.1