From patchwork Wed May 3 09:47:18 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jan Beulich X-Patchwork-Id: 13229996 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from lists.xenproject.org (lists.xenproject.org [192.237.175.120]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id CDDEAC77B75 for ; Wed, 3 May 2023 09:48:01 +0000 (UTC) Received: from list by lists.xenproject.org with outflank-mailman.529069.823047 (Exim 4.92) (envelope-from ) id 1pu95T-00026b-6t; Wed, 03 May 2023 09:47:51 +0000 X-Outflank-Mailman: Message body and most headers restored to incoming version Received: by outflank-mailman (output) from mailman id 529069.823047; Wed, 03 May 2023 09:47:51 +0000 Received: from localhost ([127.0.0.1] helo=lists.xenproject.org) by lists.xenproject.org with esmtp (Exim 4.92) (envelope-from ) id 1pu95T-00026U-46; Wed, 03 May 2023 09:47:51 +0000 Received: by outflank-mailman (input) for mailman id 529069; Wed, 03 May 2023 09:47:50 +0000 Received: from se1-gles-flk1-in.inumbo.com ([94.247.172.50] helo=se1-gles-flk1.inumbo.com) by lists.xenproject.org with esmtp (Exim 4.92) (envelope-from ) id 1pu95S-00026M-D7 for xen-devel@lists.xenproject.org; Wed, 03 May 2023 09:47:50 +0000 Received: from EUR04-HE1-obe.outbound.protection.outlook.com (mail-he1eur04on2053.outbound.protection.outlook.com [40.107.7.53]) by se1-gles-flk1.inumbo.com (Halon) with ESMTPS id 8fb96d3f-e997-11ed-8611-37d641c3527e; Wed, 03 May 2023 11:47:48 +0200 (CEST) Received: from AM6PR04MB6551.eurprd04.prod.outlook.com (2603:10a6:20b:fa::20) by DBBPR04MB7980.eurprd04.prod.outlook.com (2603:10a6:10:1f0::12) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.6363.22; Wed, 3 May 2023 09:47:19 +0000 Received: from AM6PR04MB6551.eurprd04.prod.outlook.com ([fe80::768c:6df7:9afb:acd7]) by AM6PR04MB6551.eurprd04.prod.outlook.com ([fe80::768c:6df7:9afb:acd7%6]) with mapi id 15.20.6340.031; Wed, 3 May 2023 09:47:19 +0000 X-BeenThere: xen-devel@lists.xenproject.org List-Id: Xen developer discussion List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Errors-To: xen-devel-bounces@lists.xenproject.org Precedence: list Sender: "Xen-devel" X-Inumbo-ID: 8fb96d3f-e997-11ed-8611-37d641c3527e ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=nk+Zig6DRm5g/T5AVqh2RtQ8dg9/LyGuF5laszhFvbe1uMMb5mlaJqSHr/WU8pGJ77yS035Hb28sjnc0Q2/prmEKrTMc+E3jDls9fReKBToVOyjN2oQc39Ce4xUNIddkAIj//pvqlsVbw7+o0BLYazQ9W5FG4Uped0cK2setlLk4lKUIXO6ESrbjqLf4qTEvJK4c56u4jM6IirY+Rf1ij7AIa1NxPFGmNGU1CNUhYdXZHT+FJ8SCyaMBQftiNLZ62BqYly2jY0xyImSK594kXeuFzglZo1ht1jxs/xwZZy8F7NwveNFpIQGeUhyU3C9uyjzwCu/K0RcEcr05RsGTPg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=KxFwwb3BZGcHC7xshgmJ4kLtF4OIl105qptm5zCcXSA=; b=EvRaJti7qqk2J+WJxPzZjlQXlhvK+HeaG+lI9+Y1K2xn44lZ+ndYG+jU9OA1o7O4nYp8BnqyGRI0b/77JT9ULtMpDhBSc5Gl4oue4WOlqcUq4b7XFhPYrax4/MqNbTqJlXUyK0YXNUNTonIfOU3S7fBz+AAOigxySRmQUQ8Q0K+7MG8NzpGYF/GybQSBo/0HW+GMzI9ZG7vFbp0DCIIYMcz1FSdIKDyH2yM5sB3R+qb5b085IxctWm0F7pHMliTgh4hVVVo3yiS0vQZqyMzvDKUupRUF3lecc4tmPZVgmG1MYcGhvuYHt33dZvAVApbZogfwoQvbVeQDgQgpZ0DOuA== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=suse.com; dmarc=pass action=none header.from=suse.com; dkim=pass header.d=suse.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=suse.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=KxFwwb3BZGcHC7xshgmJ4kLtF4OIl105qptm5zCcXSA=; b=4Tpn1AY+3Nx41MSek8MHxr+5itCcZ7tF23iHge2xklIIplLYV1eQ3k9heNhYzehSRfLs65OHGiVAlOid4d2m5YEjNh4B1lIyU266kJAlqfQFLM3hUPC+Acw60PDJ7fMpPBKeTbMtbmWfj/U3AyGWv2rocydVdNdFxktx5IhsscRSgGEpYOSI3NlDs2OT/RqAyMZAOwT4RIyi0WEux0WateV//cylzMA7PLRCilCaudcJq3SQt4R5tpbAIW49RoRyBBPV0yYIy2FP7KcMk3zw4JR2hgXAyKSuUM2kHEI42cMCXlKi7t6qt+4e7SyYcJB/iLCbB/R/mX9lKOqUMkDY/A== Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=suse.com; Message-ID: <9274fbb1-c1be-9570-ecfc-8f0ac9a1f42b@suse.com> Date: Wed, 3 May 2023 11:47:18 +0200 User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:102.0) Gecko/20100101 Thunderbird/102.10.1 Subject: [PATCH v2 6/6] x86/HVM: limit cache writeback overhead Content-Language: en-US From: Jan Beulich To: "xen-devel@lists.xenproject.org" Cc: Andrew Cooper , Wei Liu , =?utf-8?q?Roger_Pau_Monn=C3=A9?= , Kevin Tian , Jun Nakajima References: In-Reply-To: X-ClientProxiedBy: FR2P281CA0157.DEUP281.PROD.OUTLOOK.COM (2603:10a6:d10:99::18) To AM6PR04MB6551.eurprd04.prod.outlook.com (2603:10a6:20b:fa::20) MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: AM6PR04MB6551:EE_|DBBPR04MB7980:EE_ X-MS-Office365-Filtering-Correlation-Id: fc04887b-0423-4823-8252-08db4bbb632d X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: /yNMJBKt644QL+6Shjl0FzLE8bJGk7zcFnsk+9lyD1eO8QyJKn9AsTHj6yhQpGMXOxwDhJsft+Vh0WttnFSst+ZeZozBie4UMoJifjPQlhYiJFINjVYF3VjY//lam9Z/JrB6cgIKM/iJPG5ivecenOkgyqp5L5/ZcJgz1PQX/CzEOAPBy33JS9WhXK9F7SJc8EmG8CBAwkyddrczQta6AzNDp7oGo9TpfLLNb4lzmFy1t0qIp6eXckyE7CVGid4CfRUxG3Fhbtrhc+juoiiLOsb65JKxa1vzSOjyMW1/oa8xTY6t+qky4J/JOAmysgDBaRVJuwWkreYBnoM3D0hUM7JifTLkyo79OS4BuJcjpTvEFDFnlQhF4rTPj37Ba1yrzUsRJr5F7Q2HGsrgEBi4rYKgxsGd0rBiNLTXcGop8zNwjBjMWE+6jrYeHSh9D3WFTM68aq79lURWF8+/Ee39ZY1SQC637A9n+ilPNyYJUq4y3AHgh7D/rsTGE78/xOdP7zW9oH7OoOf158x5q4jv5bgOopvh2R+my6mB/CwHgicBNlTQNN45h6003oUbujkb7stmvreJVrAr1vze6VuSjou9SPLBisAT1Hs5wCctX4g97N/VRXTa/apvOqTmgFJxupQ/ybBGq/92QhS4LKWqLg== X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:AM6PR04MB6551.eurprd04.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230028)(39860400002)(136003)(346002)(376002)(366004)(396003)(451199021)(6506007)(26005)(6512007)(186003)(31686004)(2616005)(2906002)(5660300002)(83380400001)(8936002)(8676002)(6486002)(41300700001)(36756003)(478600001)(54906003)(38100700002)(66476007)(66556008)(316002)(31696002)(66946007)(6916009)(4326008)(86362001)(45980500001)(43740500002);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?utf-8?q?XqYLoi0sJBFeOmSMeF2Eg1Y+5JAy?= =?utf-8?q?xSY6Vv0JsYPeh9BkBSgduSbjdMoawE7Tx8vcbswrrD/Jbrv+g/RRJMYN/iEE7d2PY?= =?utf-8?q?3EpuSAP5gttUOkPdkYdep3ztTSubCq8zI58B1KOuDEowcBXdI47S+c2jhZhQO8yrR?= =?utf-8?q?oHOokKEmvd/4Ykabrku70kJsE6E7ebd3xUHMZXV/3HJ/uW5jyImjbw+qnO0cMijlM?= =?utf-8?q?uHCKkde3gUZJtAaMQr3tpE3imLiDVVx1jET1pRI1kWNIeCZ2BneR2Iyua5mdA/irW?= =?utf-8?q?TYtExeBCvSNp29axha/OgJ41lSjj0w5V662Q+ZuWBeHaDUzwADl3vxH3Y9z7Yl+ZF?= =?utf-8?q?0Nrn8jLNUasRY9WrM55eBRv/VKRSCZoB1W23pxghYDFrkHqWueI3qw/RVnKWuCPEC?= =?utf-8?q?soYyxbq9gHlU7VMMqxAw7fThRO7XUkmJWJfTkfNIKTwU34GLRKzsNAZ4JZ0I85Zzr?= =?utf-8?q?rlRyg/AbC8UpQxfqnALeu/ce+9vYZs4zzd+64BWb58KSK7W9FccJ4v9GAfrVOKWgg?= =?utf-8?q?0nc6ui9ncYRXLMYAlocjVEiBSjHUhPoEhaw8GkmRIaT5j7iJSIIJt5XNmYdOOI7IQ?= =?utf-8?q?nMZagaLYQYcGcmlqv1jI7KaBKo/tupAd22FZas25vnWMUt/0UdgIg1wARwjAhFTQn?= =?utf-8?q?YxwDS/W3jMpM9wuovU9oVfWt6m+I6gS2DlJwlCVqHlTfM/1TWas93JQvfBXHUa1xU?= =?utf-8?q?2Kac8WLlXk0BNnHZ4Xbgpy4mp4HfMYGkH0RJW5Stvu8nVNSc8LJNIDvKsMi5QUW+X?= =?utf-8?q?0NKUFFvQVaIoTVE1CADosVqb7QZQWG8Z1Kl44yMUllzYmCtexidJqp4Kbz907dvEh?= =?utf-8?q?XSBIHckQJCwrXE6EDSXuSnm0atmPfWmNTY5a7BCSguPc8EW8HKcDBfjGafXm+dV3g?= =?utf-8?q?k2Sv+e3GdvCsXus+Y2662hUHZVJhOJYTSfg3+QkqsQ9GUkA0GP/mxdxoO/eZVnPBH?= =?utf-8?q?TIDRsFlOa+QCOUk9vYPuNkrVbs+jDBJzFfaaSB2JAtJflN8gU/w4KcAxEVQBa0Phn?= =?utf-8?q?fJF6Smy9VrKrIrGiKmf46XnuQOZKw2AxKXppm9VLlp1Uuwso24ls1D4GaxrUxFvci?= =?utf-8?q?BIxFMUC7g+Otkzs2h3R7s/KLSxxqkl0lLb/J/78pOhF8Ac0A+zebyzC3ysEKHhIfs?= =?utf-8?q?KQ2UKqVtJL2ShD5OpADw0LrfHSUMpjn9pQ3Gvp0pGJX6INqocLGb1rvoV9B4YIGmx?= =?utf-8?q?YlEcJNc7nNdL901zDe5ut+PhPuexmPOWsGk9Pr5SRPEeo8ax6KDLLDholweMaOOTY?= =?utf-8?q?8ULM+xbT7k7/EPnatmUqOGj8ZFg3towePLrXuBsL9tDjc5fAr+R82djXrDJD6Z0Rg?= =?utf-8?q?1UhE4Kj01jDrZivnC+hSK6osKZpAGbxWf+oV2YEJI81lbrCIK+mr/ZzSaD6XprnvQ?= =?utf-8?q?Cax+ZFvO/UVBTJjeTs3I132JslxISPIuEJB/VsVNIZDKsmi6p0nYAUZDc7Dh4+rAi?= =?utf-8?q?dofZ62jTH06+HI1dJUGMEw+au4MKqTnd5KtYtBw/Vcd+EjdDOcT+OZaxGm2A3BCEU?= =?utf-8?q?CFQjdMckCsvD?= X-OriginatorOrg: suse.com X-MS-Exchange-CrossTenant-Network-Message-Id: fc04887b-0423-4823-8252-08db4bbb632d X-MS-Exchange-CrossTenant-AuthSource: AM6PR04MB6551.eurprd04.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 03 May 2023 09:47:19.9090 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: f7a17af6-1c5c-4a36-aa8b-f5be247aa4ba X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: pS4CniR+agOgejHU9tQB0i7PoAuRN3b2C3kIYP+c35gMjDm0T6Q3bB9l3l8HGnmYyRWVNqpKt3klmdqIyG3Fmg== X-MS-Exchange-Transport-CrossTenantHeadersStamped: DBBPR04MB7980 There's no need to write back caches on all CPUs upon seeing a WBINVD exit; ones that a vCPU hasn't run on since the last writeback (or since it was started) can't hold data which may need writing back. Signed-off-by: Jan Beulich --- With us not running AMD IOMMUs in non-coherent ways, I wonder whether svm_wbinvd_intercept() really needs to do anything (or whether it couldn't check iommu_snoop just like VMX does, knowing that as of c609108b2190 ["x86/shadow: make iommu_snoop usage consistent with HAP's"] that's always set; this would largely serve as grep fodder then, to make sure this code is updated once / when we do away with this global variable, and it would be the penultimate step to being able to fold SVM's and VT-x'es functions). --- v2: Re-base over changes earlier in the series. --- a/xen/arch/x86/hvm/hvm.c +++ b/xen/arch/x86/hvm/hvm.c @@ -537,6 +537,8 @@ void hvm_do_resume(struct vcpu *v) v->arch.hvm.inject_event.vector = HVM_EVENT_VECTOR_UNSET; } + __cpumask_set_cpu(v->processor, v->arch.hvm.cache_dirty_mask); + if ( unlikely(v->arch.vm_event) && v->arch.monitor.next_interrupt_enabled ) { struct x86_event info; @@ -1592,6 +1594,10 @@ int hvm_vcpu_initialise(struct vcpu *v) if ( rc ) goto fail6; + rc = -ENOMEM; + if ( !zalloc_cpumask_var(&v->arch.hvm.cache_dirty_mask) ) + goto fail6; + rc = ioreq_server_add_vcpu_all(d, v); if ( rc != 0 ) goto fail6; @@ -1621,6 +1627,7 @@ int hvm_vcpu_initialise(struct vcpu *v) hvm_vcpu_cacheattr_destroy(v); fail1: viridian_vcpu_deinit(v); + FREE_CPUMASK_VAR(v->arch.hvm.cache_dirty_mask); return rc; } @@ -1628,6 +1635,8 @@ void hvm_vcpu_destroy(struct vcpu *v) { viridian_vcpu_deinit(v); + FREE_CPUMASK_VAR(v->arch.hvm.cache_dirty_mask); + ioreq_server_remove_vcpu_all(v->domain, v); if ( hvm_altp2m_supported() ) --- a/xen/arch/x86/hvm/svm/svm.c +++ b/xen/arch/x86/hvm/svm/svm.c @@ -2363,8 +2363,14 @@ static void svm_vmexit_mce_intercept( static void cf_check svm_wbinvd_intercept(void) { - if ( cache_flush_permitted(current->domain) ) - flush_all(FLUSH_CACHE_WRITEBACK); + struct vcpu *curr = current; + + if ( !cache_flush_permitted(curr->domain) ) + return; + + flush_mask(curr->arch.hvm.cache_dirty_mask, FLUSH_CACHE_WRITEBACK); + cpumask_copy(curr->arch.hvm.cache_dirty_mask, + cpumask_of(curr->processor)); } static void svm_vmexit_do_invalidate_cache(struct cpu_user_regs *regs, --- a/xen/arch/x86/hvm/vmx/vmx.c +++ b/xen/arch/x86/hvm/vmx/vmx.c @@ -3710,11 +3710,17 @@ static void vmx_do_extint(struct cpu_use static void cf_check vmx_wbinvd_intercept(void) { - if ( !cache_flush_permitted(current->domain) || iommu_snoop ) + struct vcpu *curr = current; + + if ( !cache_flush_permitted(curr->domain) || iommu_snoop ) return; if ( cpu_has_wbinvd_exiting ) - flush_all(FLUSH_CACHE_WRITEBACK); + { + flush_mask(curr->arch.hvm.cache_dirty_mask, FLUSH_CACHE_WRITEBACK); + cpumask_copy(curr->arch.hvm.cache_dirty_mask, + cpumask_of(curr->processor)); + } else wbnoinvd(); } --- a/xen/arch/x86/include/asm/hvm/vcpu.h +++ b/xen/arch/x86/include/asm/hvm/vcpu.h @@ -161,6 +161,8 @@ struct hvm_vcpu { struct svm_vcpu svm; }; + cpumask_var_t cache_dirty_mask; + struct tasklet assert_evtchn_irq_tasklet; struct nestedvcpu nvcpu;