From mboxrd@z Thu Jan 1 00:00:00 1970 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 kanga.kvack.org (kanga.kvack.org [205.233.56.17]) by smtp.lore.kernel.org (Postfix) with ESMTP id 02E9CC433FE for ; Wed, 16 Nov 2022 22:24:17 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 7EAE86B0078; Wed, 16 Nov 2022 17:24:17 -0500 (EST) Received: by kanga.kvack.org (Postfix, from userid 40) id 79B036B007B; Wed, 16 Nov 2022 17:24:17 -0500 (EST) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 63B936B007D; Wed, 16 Nov 2022 17:24:17 -0500 (EST) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0012.hostedemail.com [216.40.44.12]) by kanga.kvack.org (Postfix) with ESMTP id 52DE66B0078 for ; Wed, 16 Nov 2022 17:24:17 -0500 (EST) Received: from smtpin20.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay06.hostedemail.com (Postfix) with ESMTP id 25E41AB241 for ; Wed, 16 Nov 2022 22:24:17 +0000 (UTC) X-FDA: 80140734954.20.667F0E2 Received: from mail-pg1-f178.google.com (mail-pg1-f178.google.com [209.85.215.178]) by imf13.hostedemail.com (Postfix) with ESMTP id C588C20003 for ; Wed, 16 Nov 2022 22:24:16 +0000 (UTC) Received: by mail-pg1-f178.google.com with SMTP id n17so226004pgh.9 for ; Wed, 16 Nov 2022 14:24:16 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20210112; h=in-reply-to:content-disposition:mime-version:references:message-id :subject:cc:to:from:date:from:to:cc:subject:date:message-id:reply-to; bh=QGkcU8bsAXTracYvItbCwnniUSLgMtAC897scf+9ddo=; b=Yb4wKwuTq8SDmbVGc+P7ahM8KCEiEG3EeQYJnIBy43Yu4s+iC+yGjvQgmVRoCCNQD4 bFiXa2DlOoj+M6COODORifyN82jIJfcy0aF0ZJtT8PTph1kJcj2QMeh/X+0txTmE1L9e vjCm/+n4/Ca01rOL6VyR5fbnbwtckm/wl6rnzgA+2U9G86s1X+WQKo3mRqwdqt/NZj4i P3BxQwhuIeyDfA8UssWFkeXvKFbx/BZ4epGrEEpau+te7+rSV+HSw5cBzmIPmEEBr4ge 1bl1xkBDMVGhMoLkvC/hKl/ZnG4RNCOpP9NsjFm/3oC6Zxx7zYxZx28Lz46N2hnBOT/Z 8NoA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=in-reply-to:content-disposition:mime-version:references:message-id :subject:cc:to:from:date:x-gm-message-state:from:to:cc:subject:date :message-id:reply-to; bh=QGkcU8bsAXTracYvItbCwnniUSLgMtAC897scf+9ddo=; b=wYe6WIBv93Z21hxYaO4rmAPWvB4qZn5bobp6gcEHaLLhM6GwunA/9a1MSdC1ehkeCd gtifZboxL0VG8QNHA9EM+fMZZfXY7Y0efrpJ20LYJLrSuXlaKwJC9qO/nAt38Ywkjq8p tCPbx3Y1OHqMW/kmt+bkf0KddKkyDi8u/CjPVpAkKrCl8C1Gw9CpzeL21ULBHifBXmHe SU3kfMBTj98nhHeEkM2OOsdjPjhgiYl5O41vtpzr4CIG0qT3Yqnr61KNTHa0dG+Qm+8N LZW6+MYRiCTOductguk73PGhUGqRKR3CAd/WTDfYYgrwQJ8Rp+Tm7URYR2WEbVJr4o+/ htvw== X-Gm-Message-State: ANoB5pmpROfRAbIJYOZpt0Q2IaxFfff/5hB8AVoRUiFxCb6Y01iFTiAx 1YTzIKIOlRt2XGiz3EIsAKBiTVdBG8JeqQ== X-Google-Smtp-Source: AA0mqf57GusGHy4fGdIdCCD+ypBDi3fwzFhsJUW/Qb2DW/M9r1lO66W8ccdVhRkSLbzOP4I6svKevg== X-Received: by 2002:a63:560c:0:b0:476:9983:b4b5 with SMTP id k12-20020a63560c000000b004769983b4b5mr12164723pgb.516.1668637455542; Wed, 16 Nov 2022 14:24:15 -0800 (PST) Received: from google.com (7.104.168.34.bc.googleusercontent.com. [34.168.104.7]) by smtp.gmail.com with ESMTPSA id k15-20020aa7972f000000b0056bbba4302dsm11324389pfg.119.2022.11.16.14.24.14 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 16 Nov 2022 14:24:15 -0800 (PST) Date: Wed, 16 Nov 2022 22:24:11 +0000 From: Sean Christopherson To: Chao Peng Cc: kvm@vger.kernel.org, linux-kernel@vger.kernel.org, linux-mm@kvack.org, linux-fsdevel@vger.kernel.org, linux-arch@vger.kernel.org, linux-api@vger.kernel.org, linux-doc@vger.kernel.org, qemu-devel@nongnu.org, Paolo Bonzini , Jonathan Corbet , Vitaly Kuznetsov , Wanpeng Li , Jim Mattson , Joerg Roedel , Thomas Gleixner , Ingo Molnar , Borislav Petkov , x86@kernel.org, "H . Peter Anvin" , Hugh Dickins , Jeff Layton , "J . Bruce Fields" , Andrew Morton , Shuah Khan , Mike Rapoport , Steven Price , "Maciej S . Szmigiero" , Vlastimil Babka , Vishal Annapurve , Yu Zhang , "Kirill A . Shutemov" , luto@kernel.org, jun.nakajima@intel.com, dave.hansen@intel.com, ak@linux.intel.com, david@redhat.com, aarcange@redhat.com, ddutile@redhat.com, dhildenb@redhat.com, Quentin Perret , tabba@google.com, Michael Roth , mhocko@suse.com, Muchun Song , wei.w.wang@intel.com Subject: Re: [PATCH v9 5/8] KVM: Register/unregister the guest private memory regions Message-ID: References: <20221025151344.3784230-1-chao.p.peng@linux.intel.com> <20221025151344.3784230-6-chao.p.peng@linux.intel.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20221025151344.3784230-6-chao.p.peng@linux.intel.com> ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1668637456; a=rsa-sha256; cv=none; b=fHtrIakhQF8ydplYCN2SwkwV+u+Lt6W4WX1NQ85we0Q1V2RsyjSM7YmDMKya8zgryE9iSS SOnt9871GPwMT3QnTQ3oZB+Jn86Ht1oIwe33xesaKRJIbP4b2je44rpGq/04PtWTKXmCc9 q0XeAjCkxKch+g0pJ+O+VCsNb8a64bw= ARC-Authentication-Results: i=1; imf13.hostedemail.com; dkim=pass header.d=google.com header.s=20210112 header.b=Yb4wKwuT; dmarc=pass (policy=reject) header.from=google.com; spf=pass (imf13.hostedemail.com: domain of seanjc@google.com designates 209.85.215.178 as permitted sender) smtp.mailfrom=seanjc@google.com ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1668637456; h=from:from:sender:reply-to:subject:subject:date:date: message-id:message-id:to:to:cc:cc:mime-version:mime-version: content-type:content-type:content-transfer-encoding: in-reply-to:in-reply-to:references:references:dkim-signature; bh=QGkcU8bsAXTracYvItbCwnniUSLgMtAC897scf+9ddo=; b=G08EEUW/MF4sc/8SBAJilzYYD+U/biVzTOZsemDd0hDCE/LZ3zthU2yNXT0PY1ei95V0P4 OxlO9MOrmVc4ljNMVoJpnczhn9Do1by0HlIjQyXJ0Irq3kfsNAQ3FwlJmXyno+bCXoDHqD RJl3TXiCAJExE1sZXdVObiNFgH0tVkc= X-Stat-Signature: tq6p9o9rabxeqqpdxi9idzm5ctndw7r9 X-Rspamd-Queue-Id: C588C20003 Authentication-Results: imf13.hostedemail.com; dkim=pass header.d=google.com header.s=20210112 header.b=Yb4wKwuT; dmarc=pass (policy=reject) header.from=google.com; spf=pass (imf13.hostedemail.com: domain of seanjc@google.com designates 209.85.215.178 as permitted sender) smtp.mailfrom=seanjc@google.com X-Rspam-User: X-Rspamd-Server: rspam12 X-HE-Tag: 1668637456-572489 X-Bogosity: Ham, tests=bogofilter, spamicity=0.000000, version=1.2.4 Sender: owner-linux-mm@kvack.org Precedence: bulk X-Loop: owner-majordomo@kvack.org List-ID: On Tue, Oct 25, 2022, Chao Peng wrote: > +static int kvm_vm_ioctl_set_mem_attr(struct kvm *kvm, gpa_t gpa, gpa_t size, > + bool is_private) > +{ > + gfn_t start, end; > + unsigned long i; > + void *entry; > + int idx; > + int r = 0; > + > + if (size == 0 || gpa + size < gpa) > + return -EINVAL; > + if (gpa & (PAGE_SIZE - 1) || size & (PAGE_SIZE - 1)) > + return -EINVAL; > + > + start = gpa >> PAGE_SHIFT; > + end = (gpa + size - 1 + PAGE_SIZE) >> PAGE_SHIFT; > + > + /* > + * Guest memory defaults to private, kvm->mem_attr_array only stores > + * shared memory. > + */ > + entry = is_private ? NULL : xa_mk_value(KVM_MEM_ATTR_SHARED); > + > + idx = srcu_read_lock(&kvm->srcu); > + KVM_MMU_LOCK(kvm); > + kvm_mmu_invalidate_begin(kvm, start, end); > + > + for (i = start; i < end; i++) { > + r = xa_err(xa_store(&kvm->mem_attr_array, i, entry, > + GFP_KERNEL_ACCOUNT)); > + if (r) > + goto err; > + } > + > + kvm_unmap_mem_range(kvm, start, end); > + > + goto ret; > +err: > + for (; i > start; i--) > + xa_erase(&kvm->mem_attr_array, i); I don't think deleting previous entries is correct. To unwind, the correct thing to do is restore the original values. E.g. if userspace space is mapping a large range as shared, and some of the previous entries were shared, deleting them would incorrectly "convert" those entries to private. Tracking the previous state likely isn't the best approach, e.g. it would require speculatively allocating extra memory for a rare condition that is likely going to lead to OOM anyways. Instead of trying to unwind, what about updating the ioctl() params such that retrying with the updated addr+size would Just Work? E.g. diff --git a/virt/kvm/kvm_main.c b/virt/kvm/kvm_main.c index 55b07aae67cc..f1de592a1a06 100644 --- a/virt/kvm/kvm_main.c +++ b/virt/kvm/kvm_main.c @@ -1015,15 +1015,12 @@ static int kvm_vm_ioctl_set_mem_attr(struct kvm *kvm, gpa_t gpa, gpa_t size, kvm_unmap_mem_range(kvm, start, end, attr); - goto ret; -err: - for (; i > start; i--) - xa_erase(&kvm->mem_attr_array, i); -ret: kvm_mmu_invalidate_end(kvm, start, end); KVM_MMU_UNLOCK(kvm); srcu_read_unlock(&kvm->srcu, idx); + + return r; } #endif /* CONFIG_KVM_GENERIC_PRIVATE_MEM */ @@ -4989,6 +4986,8 @@ static long kvm_vm_ioctl(struct file *filp, r = kvm_vm_ioctl_set_mem_attr(kvm, region.addr, region.size, set); + if (copy_to_user(argp, ®ion, sizeof(region)) && !r) + r = -EFAULT break; } #endif