Received: by 2002:a05:6a10:f347:0:0:0:0 with SMTP id d7csp434807pxu; Tue, 5 Jan 2021 15:40:36 -0800 (PST) X-Google-Smtp-Source: ABdhPJzYRi/ePEg+g77dM5czARyqmN7uXcfpkYTk4x2C19zTKItLRommAbRTzBEYharPUGEWMw5z X-Received: by 2002:a50:b5c5:: with SMTP id a63mr2073970ede.227.1609890036300; Tue, 05 Jan 2021 15:40:36 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1609890036; cv=none; d=google.com; s=arc-20160816; b=T3H5rNFXq8vHo8KJ97V2VG745v1yrIhEmVShpl5bbzijn22bDfAqEjaEv1ca7J7TjH rBljE9TcJT7lTjCLGBv8LpHCYWrqgpzc07TsTrz2YPhEPXV7Z4f3UqgijVAV12FJpJeI mvxqBwY3+cRHiwYbulKXd/X5UmmHen9c6opSE7GDp2LFAuJyQBATbXUDMJDhNLurCH6O e0jFVVRBEbVL9CTDYTc9G/zSg18MxllzF3PMTgPM9XyLJRUbcN5Kp/fC2nL/by8lX3X+ ftJ1Q8MKNyOE6+ePr84kac/szyZu5OXeKWe4QGyinYuvgeVdSkqOdRBSZSkO5uBiU8oY 9+dw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:cc:to:subject:message-id:date:from:in-reply-to :references:mime-version:dkim-signature; bh=SsxI/LAwtO/bx2buEvRVyl52jPyp0BQhf9Sqjo4vgY4=; b=rKyitX9wPmVbhB068vGYZtUd8NSGAm3Oz4gpxz4+ORRk+itQ2Go1y+FWOFSsR5vY1f 0dJt43uqqN548Nmc7Wv0yFI3icFiSFWeGR3L+bRVDA+rExycgG0m1Z12Nj1YQDnajfDn hM/tJQHFXpYGTVB4UJujkJva0zbP15T72senqODnB5kJRIQOoIoy16bM42XQpZ1kHwFG I2qJHh44YjN9B7Jf/rdb/hFY9bn0mPIPFg9/J3gKcbIWWsIyhG1/3g1tyJzPiPjoqL4o KSIukvA8CdPTuSBpc0n2iuKq9BxkWaqYzwrps+vXx3yUPmEDlqkXUVIhpq6y2PrZGFcI MljQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@google.com header.s=20161025 header.b=LbkNuAxl; 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 b26si266502ejz.630.2021.01.05.15.40.12; Tue, 05 Jan 2021 15:40:36 -0800 (PST) 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=20161025 header.b=LbkNuAxl; 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 S1726306AbhAEXjF (ORCPT + 99 others); Tue, 5 Jan 2021 18:39:05 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:58548 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1725939AbhAEXjE (ORCPT ); Tue, 5 Jan 2021 18:39:04 -0500 Received: from mail-il1-x131.google.com (mail-il1-x131.google.com [IPv6:2607:f8b0:4864:20::131]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 77335C061796 for ; Tue, 5 Jan 2021 15:38:24 -0800 (PST) Received: by mail-il1-x131.google.com with SMTP id w12so1373836ilm.12 for ; Tue, 05 Jan 2021 15:38:24 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20161025; h=mime-version:references:in-reply-to:from:date:message-id:subject:to :cc; bh=SsxI/LAwtO/bx2buEvRVyl52jPyp0BQhf9Sqjo4vgY4=; b=LbkNuAxlye2AIUfs3jL8sQPAiMTLjh9g89vq4QTv9XPoEZo8fpl71CdgQ0MWV9Sau1 YC1lgMUWCuhr5g5b1lONvM5iqEfC+iFtgKzNdte0suDix5oMraeaCA+u/bPK2USTxygB Brf/ptbyjfbja1gJ24LSP0kT4hXze5w4fV2h7yEmrK+GKYVWG/adXDSB2krrvqSzFBGM lf0goeMMxJuFqNOPNDnpo5AqhiBwtjv8MCtTZIUZbdr2VJzOva18LpB4ALdOXzfZ3WQC 32LMT/zJQSTKfR4TJbBMgSctb1Ps4Kulf4JDVPF/NKMvTodgN0RKMZN5pTAY6Ms9C65W XtYg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:mime-version:references:in-reply-to:from:date :message-id:subject:to:cc; bh=SsxI/LAwtO/bx2buEvRVyl52jPyp0BQhf9Sqjo4vgY4=; b=Z2mYxBLhUhER4oFzVmcvVzbWknQmR37ZqLbTbo2D4d4/H9jGKR2756WcDBokbGVlXl Gp08bLFg6tssE+rDsgG7SSVQHWKTf4gY7g+qIBmDepHufMIDrBi2/+fpaGtMkmufBzqM WHfHUxMbIvMDY52bbKR8xX4r2laYpLALysfdWr3x4BDDCgVzOK4SNn7Nqc++Mvp1hOkp 9pJSrQceL8m2Dy/VcAjW3Pm5W+5yAxwSgts6GE5yYw0UuyL6+eI/cngrK6HXd0CemeE0 s72kUoPsBD/EoCFuiDGZIUF3Yx/+v1+hWh6E5B1Mc/b906BHpl4+D0R106fmf8XZtSgK 2Lyg== X-Gm-Message-State: AOAM531MBG5R1btFTfzXfzAj1wyQvEjGAnhlwa9wmXPVaq5w7xQh2D6l LHYEoAp3v/W5HrktJkiuMXVtcreuW6GMlvWk4DPDgDgTNXEinw== X-Received: by 2002:a05:6e02:f93:: with SMTP id v19mr1908740ilo.154.1609889903542; Tue, 05 Jan 2021 15:38:23 -0800 (PST) MIME-Version: 1.0 References: <20210105233136.2140335-1-bgardon@google.com> <20210105233136.2140335-2-bgardon@google.com> In-Reply-To: <20210105233136.2140335-2-bgardon@google.com> From: Ben Gardon Date: Tue, 5 Jan 2021 15:38:12 -0800 Message-ID: Subject: Re: [PATCH 2/3] kvm: x86/mmu: Ensure TDP MMU roots are freed after yield To: LKML , kvm Cc: Paolo Bonzini , Peter Shier , "Maciej S . Szmigiero" , Leo Hou Content-Type: text/plain; charset="UTF-8" Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Tue, Jan 5, 2021 at 3:31 PM Ben Gardon wrote: > > Many TDP MMU functions which need to perform some action on all TDP MMU > roots hold a reference on that root so that they can safely drop the MMU > lock in order to yield to other threads. However, when releasing the > reference on the root, there is a bug: the root will not be freed even > if its reference count (root_count) is reduced to 0. Ensure that these > roots are properly freed. > > Reported-by: Maciej S. Szmigiero > Fixes: faaf05b00aec ("kvm: x86/mmu: Support zapping SPTEs in the TDP MMU") > Fixes: 063afacd8730 ("kvm: x86/mmu: Support invalidate range MMU notifier for TDP MMU") > Fixes: a6a0b05da9f3 ("kvm: x86/mmu: Support dirty logging for the TDP MMU") > Fixes: 14881998566d ("kvm: x86/mmu: Support disabling dirty logging for the tdp MMU") > Signed-off-by: Ben Gardon > --- > arch/x86/kvm/mmu/tdp_mmu.c | 18 ++++++++++++------ > 1 file changed, 12 insertions(+), 6 deletions(-) > > diff --git a/arch/x86/kvm/mmu/tdp_mmu.c b/arch/x86/kvm/mmu/tdp_mmu.c > index 75db27fda8f3..5ec6fae36e33 100644 > --- a/arch/x86/kvm/mmu/tdp_mmu.c > +++ b/arch/x86/kvm/mmu/tdp_mmu.c > @@ -83,6 +83,12 @@ void kvm_tdp_mmu_free_root(struct kvm *kvm, struct kvm_mmu_page *root) > kmem_cache_free(mmu_page_header_cache, root); > } > > +static void tdp_mmu_put_root(struct kvm *kvm, struct kvm_mmu_page *root) > +{ > + if (kvm_mmu_put_root(kvm, root)) > + kvm_tdp_mmu_free_root(kvm, root); > +} > + > static union kvm_mmu_page_role page_role_for_level(struct kvm_vcpu *vcpu, > int level) > { > @@ -456,7 +462,7 @@ bool kvm_tdp_mmu_zap_gfn_range(struct kvm *kvm, gfn_t start, gfn_t end) > > flush |= zap_gfn_range(kvm, root, start, end, true); > > - kvm_mmu_put_root(kvm, root); > + tdp_mmu_put_root(kvm, root); > } > > return flush; > @@ -648,7 +654,7 @@ static int kvm_tdp_mmu_handle_hva_range(struct kvm *kvm, unsigned long start, > gfn_end, data); > } > > - kvm_mmu_put_root(kvm, root); > + tdp_mmu_put_root(kvm, root); > } > > return ret; > @@ -852,7 +858,7 @@ bool kvm_tdp_mmu_wrprot_slot(struct kvm *kvm, struct kvm_memory_slot *slot, > spte_set |= wrprot_gfn_range(kvm, root, slot->base_gfn, > slot->base_gfn + slot->npages, min_level); > > - kvm_mmu_put_root(kvm, root); > + tdp_mmu_put_root(kvm, root); > } > > return spte_set; > @@ -920,7 +926,7 @@ bool kvm_tdp_mmu_clear_dirty_slot(struct kvm *kvm, struct kvm_memory_slot *slot) > spte_set |= clear_dirty_gfn_range(kvm, root, slot->base_gfn, > slot->base_gfn + slot->npages); > > - kvm_mmu_put_root(kvm, root); > + tdp_mmu_put_root(kvm, root); > } > > return spte_set; > @@ -1043,7 +1049,7 @@ bool kvm_tdp_mmu_slot_set_dirty(struct kvm *kvm, struct kvm_memory_slot *slot) > spte_set |= set_dirty_gfn_range(kvm, root, slot->base_gfn, > slot->base_gfn + slot->npages); > > - kvm_mmu_put_root(kvm, root); > + tdp_mmu_put_root(kvm, root); > } > return spte_set; > } > @@ -1103,7 +1109,7 @@ void kvm_tdp_mmu_zap_collapsible_sptes(struct kvm *kvm, > zap_collapsible_spte_range(kvm, root, slot->base_gfn, > slot->base_gfn + slot->npages); > > - kvm_mmu_put_root(kvm, root); > + tdp_mmu_put_root(kvm, root); > } > } > > -- > 2.29.2.729.g45daf8777d-goog > +Sean Christopherson, for whom I used a stale email address. . I tested this series by running kvm-unit-tests on an Intel Skylake machine. It did not introduce any new failures. I also ran the set_memory_region_test, but was unable to reproduce Maciej's problem. Maciej, if you'd be willing to confirm this series solves the problem you observed, or provide more details on the setup in which you observed it, I'd appreciate it.