Received: by 2002:a05:6a10:5bc5:0:0:0:0 with SMTP id os5csp1054711pxb; Wed, 3 Nov 2021 17:31:10 -0700 (PDT) X-Google-Smtp-Source: ABdhPJxLIscampkz692PZo/l6bfvBpcHy53RhvexjEyCvpXaFTNRJHuR0HDgaQnImCuqEujTyYrj X-Received: by 2002:a6b:b5c2:: with SMTP id e185mr34365150iof.127.1635985869915; Wed, 03 Nov 2021 17:31:09 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1635985869; cv=none; d=google.com; s=arc-20160816; b=ztuVoU5bNq5GfmbgCnONtl2IlOI37NhK4fX/lBQnijL1Zqlu+FEtaoTYeNPWUhkQ0z 5PlgcwOITCeucDIBhd2nmh6wnjdz1L4uxzLkyKRDayexCmlj5yeoMBIARPtbNxYkSwPh jHDsf+rQ5dYcaXx4WVx+HnyMXa51K/vJc466FceLGXQLo+ZVvksLOMePy5LPiio2BJv4 GL2AGYHSJur35SFGE3Ap2Exh8tY2c+JVe5Q6EGHFb0ntjnpqFOcWQn1i6ERfUsDfbVp6 OGoQSdud/utdQenfr/9zxqLbgbCzHpJTwoKLlGu/Ihr/FYdCKHqKK9gb8TJpBgl7myfY UOyw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:cc:to:from:subject:references:mime-version :message-id:in-reply-to:date:reply-to:dkim-signature; bh=gefeXeMu+9xCn+OiiZbsmvywIWNyuYY1aczHxfS7F84=; b=iaFWoKBcZeQIH8cnUfF1SrWJP5XpcC5zhH397CtyOoFJSdwthcu2wd85uz9cvHCcJR XH3nIlEWIzHlAWwiWvP0XBPGTR0RvfAWDe0UgPRYRM8NogseGJgXV9gq6PuZ6zeYiXmx whkqKecW0hOY7Y9YBIlv+GqcMecLkng8KCLTeoKAKbudjokhO6kVcj9RbWX3R18mAxjg lKLumuc1nLzPUQXwyhltlEGaUHv0p5L7CWN+4HgwbBWotcNFxdgJzCUjJXS+86EyC9vu Q4Imw/gF0eOKpluGFaJNMwLwr1Mpja4dfrmOZxW5zWJEnUsS0r8DP9nWFql5x9PySaVc Ry4w== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@google.com header.s=20210112 header.b=q1wAaFzQ; 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=pass (p=REJECT sp=REJECT dis=NONE) header.from=google.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id i10si7398810iow.0.2021.11.03.17.30.57; Wed, 03 Nov 2021 17:31:09 -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; dkim=pass header.i=@google.com header.s=20210112 header.b=q1wAaFzQ; 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=pass (p=REJECT sp=REJECT dis=NONE) header.from=google.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S233259AbhKDAb1 (ORCPT + 99 others); Wed, 3 Nov 2021 20:31:27 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:52724 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S233358AbhKDA3G (ORCPT ); Wed, 3 Nov 2021 20:29:06 -0400 Received: from mail-pl1-x64a.google.com (mail-pl1-x64a.google.com [IPv6:2607:f8b0:4864:20::64a]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id D0C8EC061714 for ; Wed, 3 Nov 2021 17:26:29 -0700 (PDT) Received: by mail-pl1-x64a.google.com with SMTP id g20-20020a170902869400b0014002b0f5bcso1912879plo.18 for ; Wed, 03 Nov 2021 17:26:29 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20210112; h=reply-to:date:in-reply-to:message-id:mime-version:references :subject:from:to:cc; bh=gefeXeMu+9xCn+OiiZbsmvywIWNyuYY1aczHxfS7F84=; b=q1wAaFzQivbUaLWNpD28vIW6ok97J24IWOZtjc0+hsnIoFnhMyUWsnSfQKoqN3maJ3 KBdBMOyYnFaTKZvkOTgijuDb8a1y6dTYyIvATTjrk50gQdXgdq0sK8P9D8VXqeBwIchM S4752LKzCwKCElggFGcp/0gCfncZSwTidehk3QlNJHjH4YdWFX4NP2+qFH0XmXIojpE7 shl+78ytzLoTN1+DNy2u1aXGBjCw+SMXFRKxDeT2bHggWBTmy7o/SubcktQSj4/PZQou hwUcODvMGvNUFZIWK9EWYU9o0oSTlOaqrHSlqsc6GHFHSECGSUQyaSoW+8/pBlFiy+YJ LVDw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:reply-to:date:in-reply-to:message-id :mime-version:references:subject:from:to:cc; bh=gefeXeMu+9xCn+OiiZbsmvywIWNyuYY1aczHxfS7F84=; b=wAyN0enlMqmzPc7QX8yviVAtedIDClJCT3K3jyy6ZByd+LCySyimAgYL9qKwbJumBN NwfP2pyBlw7wZlMhc7k1VPL3/FZyLfWs1YE2dNbxypuenY5mJaf9fOxa5AA6Khe1Icp0 77jbJHp5t8F9l3qYcfVTpMn7ZIvPFEojE/GCzpH5wpKbEBUX74lhCeFRAK1DwTloCeoE YsuXTDnFp16X3jKxiChmo6lCAC9hktvFTDhpNhweKTRhFECG9z0e2GcAja2vcRQmLRtm weEgm00VfKHjBpOduDdfXJY78zvMWiVSY4tGQemXmjVRKROY7p+yiYbhN4UA+cZll17T kkkg== X-Gm-Message-State: AOAM532cHHDwAUjw4z29vGW5k3zFaplAR/uhlapYMDGJUynUHHK1aO7P sheYZAD1+gwyyYaujQcRCNbqiOxWyqM= X-Received: from seanjc.c.googlers.com ([fda3:e722:ac3:cc00:7f:e700:c0a8:3e5]) (user=seanjc job=sendgmr) by 2002:a63:740e:: with SMTP id p14mr35995604pgc.329.1635985589285; Wed, 03 Nov 2021 17:26:29 -0700 (PDT) Reply-To: Sean Christopherson Date: Thu, 4 Nov 2021 00:25:19 +0000 In-Reply-To: <20211104002531.1176691-1-seanjc@google.com> Message-Id: <20211104002531.1176691-19-seanjc@google.com> Mime-Version: 1.0 References: <20211104002531.1176691-1-seanjc@google.com> X-Mailer: git-send-email 2.33.1.1089.g2158813163f-goog Subject: [PATCH v5.5 18/30] KVM: Don't make a full copy of the old memslot in __kvm_set_memory_region() From: Sean Christopherson To: Marc Zyngier , Huacai Chen , Aleksandar Markovic , Paul Mackerras , Anup Patel , Paul Walmsley , Palmer Dabbelt , Albert Ou , Christian Borntraeger , Janosch Frank , Paolo Bonzini Cc: James Morse , Alexandru Elisei , Suzuki K Poulose , Atish Patra , David Hildenbrand , Cornelia Huck , Claudio Imbrenda , Sean Christopherson , Vitaly Kuznetsov , Wanpeng Li , Jim Mattson , Joerg Roedel , linux-arm-kernel@lists.infradead.org, kvmarm@lists.cs.columbia.edu, linux-mips@vger.kernel.org, kvm@vger.kernel.org, kvm-ppc@vger.kernel.org, kvm-riscv@lists.infradead.org, linux-riscv@lists.infradead.org, linux-kernel@vger.kernel.org, Ben Gardon , "Maciej S . Szmigiero" Content-Type: text/plain; charset="UTF-8" Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Stop making a full copy of the old memslot in __kvm_set_memory_region() now that metadata updates are handled by kvm_set_memslot(), i.e. now that the old memslot's dirty bitmap doesn't need to be referenced after the memslot and its pointer is modified/invalidated by kvm_set_memslot(). No functional change intended. Signed-off-by: Sean Christopherson --- virt/kvm/kvm_main.c | 35 +++++++++++++---------------------- 1 file changed, 13 insertions(+), 22 deletions(-) diff --git a/virt/kvm/kvm_main.c b/virt/kvm/kvm_main.c index 6c7bbc452dae..bbaa01afac43 100644 --- a/virt/kvm/kvm_main.c +++ b/virt/kvm/kvm_main.c @@ -1715,8 +1715,8 @@ static int kvm_set_memslot(struct kvm *kvm, int __kvm_set_memory_region(struct kvm *kvm, const struct kvm_userspace_memory_region *mem) { - struct kvm_memory_slot old, new; - struct kvm_memory_slot *tmp; + struct kvm_memory_slot *old, *tmp; + struct kvm_memory_slot new; enum kvm_mr_change change; int as_id, id; int r; @@ -1746,25 +1746,16 @@ int __kvm_set_memory_region(struct kvm *kvm, return -EINVAL; /* - * Make a full copy of the old memslot, the pointer will become stale - * when the memslots are re-sorted by update_memslots(), and the old - * memslot needs to be referenced after calling update_memslots(), e.g. - * to free its resources and for arch specific behavior. + * Note, the old memslot (and the pointer itself!) may be invalidated + * and/or destroyed by kvm_set_memslot(). */ - tmp = id_to_memslot(__kvm_memslots(kvm, as_id), id); - if (tmp) { - old = *tmp; - tmp = NULL; - } else { - memset(&old, 0, sizeof(old)); - old.id = id; - } + old = id_to_memslot(__kvm_memslots(kvm, as_id), id); if (!mem->memory_size) { - if (!old.npages) + if (!old || !old->npages) return -EINVAL; - if (WARN_ON_ONCE(kvm->nr_memslot_pages < old.npages)) + if (WARN_ON_ONCE(kvm->nr_memslot_pages < old->npages)) return -EIO; memset(&new, 0, sizeof(new)); @@ -1784,7 +1775,7 @@ int __kvm_set_memory_region(struct kvm *kvm, if (new.npages > KVM_MEM_MAX_NR_PAGES) return -EINVAL; - if (!old.npages) { + if (!old || !old->npages) { change = KVM_MR_CREATE; /* @@ -1794,14 +1785,14 @@ int __kvm_set_memory_region(struct kvm *kvm, if ((kvm->nr_memslot_pages + new.npages) < kvm->nr_memslot_pages) return -EINVAL; } else { /* Modify an existing slot. */ - if ((new.userspace_addr != old.userspace_addr) || - (new.npages != old.npages) || - ((new.flags ^ old.flags) & KVM_MEM_READONLY)) + if ((new.userspace_addr != old->userspace_addr) || + (new.npages != old->npages) || + ((new.flags ^ old->flags) & KVM_MEM_READONLY)) return -EINVAL; - if (new.base_gfn != old.base_gfn) + if (new.base_gfn != old->base_gfn) change = KVM_MR_MOVE; - else if (new.flags != old.flags) + else if (new.flags != old->flags) change = KVM_MR_FLAGS_ONLY; else /* Nothing to change. */ return 0; -- 2.33.1.1089.g2158813163f-goog