From mboxrd@z Thu Jan 1 00:00:00 1970 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=intel.com header.i=@intel.com header.b="EhW882Pv" Received: from mgamail.intel.com (mgamail.intel.com [192.55.52.43]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 6831F1B3 for ; Wed, 15 Nov 2023 19:40:23 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1700106023; x=1731642023; h=message-id:date:mime-version:subject:to:cc:references: from:in-reply-to:content-transfer-encoding; bh=2g/nSpUeYAI0OsL4LSEsZIaBASDmEzDwebICySRFOHs=; b=EhW882PvX6iSKu0GpxiR4whVmwNQC0AJotn3tJ9oPA55absCUrErWsmf lFyHLHG7S8e/G9OZXmj0Q/3WoXFOqQawVUHTpQYUsFVfrPRER3vzGsFVS 0ZWcHjbW3s27UQFXowPUOj2VK0lkX4kiveZUaWnddSxSuFpSH25phEw7p nUrYUotbovRXjtghTEJ0Z7MwjsEjiYmz63nSmbbZphWoBJdnDoUgjc4mb X/E4rmUwfnMFc9Ei16Fa/a/3hnYVXK5XeGcXFDwdaaPKbmMj+du3dx+kW i30GovHgdj5P524iRop7mLO1gv5oy/EOqmEdHjPnLskx9pFaXBqovkZc+ g==; X-IronPort-AV: E=McAfee;i="6600,9927,10895"; a="477226157" X-IronPort-AV: E=Sophos;i="6.03,307,1694761200"; d="scan'208";a="477226157" Received: from orsmga005.jf.intel.com ([10.7.209.41]) by fmsmga105.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 15 Nov 2023 19:40:23 -0800 X-ExtLoop1: 1 X-IronPort-AV: E=McAfee;i="6600,9927,10895"; a="938701423" X-IronPort-AV: E=Sophos;i="6.03,307,1694761200"; d="scan'208";a="938701423" Received: from xiaoyaol-hp-g830.ccr.corp.intel.com (HELO [10.93.6.77]) ([10.93.6.77]) by orsmga005-auth.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 15 Nov 2023 19:40:17 -0800 Message-ID: Date: Thu, 16 Nov 2023 11:40:14 +0800 Precedence: bulk X-Mailing-List: kvm@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 User-Agent: Mozilla Thunderbird Subject: Re: [PATCH v3 06/70] kvm: Introduce support for memory_attributes Content-Language: en-US To: =?UTF-8?Q?Daniel_P=2E_Berrang=C3=A9?= Cc: Paolo Bonzini , David Hildenbrand , Igor Mammedov , "Michael S . Tsirkin" , Marcel Apfelbaum , Richard Henderson , Peter Xu , =?UTF-8?Q?Philippe_Mathieu-Daud=C3=A9?= , Cornelia Huck , Eric Blake , Markus Armbruster , Marcelo Tosatti , qemu-devel@nongnu.org, kvm@vger.kernel.org, Michael Roth , Sean Christopherson , Claudio Fontana , Gerd Hoffmann , Isaku Yamahata , Chenyi Qiang References: <20231115071519.2864957-1-xiaoyao.li@intel.com> <20231115071519.2864957-7-xiaoyao.li@intel.com> From: Xiaoyao Li In-Reply-To: Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 8bit On 11/15/2023 6:38 PM, Daniel P. Berrangé wrote: > On Wed, Nov 15, 2023 at 02:14:15AM -0500, Xiaoyao Li wrote: >> Introduce the helper functions to set the attributes of a range of >> memory to private or shared. >> >> This is necessary to notify KVM the private/shared attribute of each gpa >> range. KVM needs the information to decide the GPA needs to be mapped at >> hva-based shared memory or guest_memfd based private memory. >> >> Signed-off-by: Xiaoyao Li >> --- >> accel/kvm/kvm-all.c | 42 ++++++++++++++++++++++++++++++++++++++++++ >> include/sysemu/kvm.h | 3 +++ >> 2 files changed, 45 insertions(+) >> >> diff --git a/accel/kvm/kvm-all.c b/accel/kvm/kvm-all.c >> index 69afeb47c9c0..76e2404d54d2 100644 >> --- a/accel/kvm/kvm-all.c >> +++ b/accel/kvm/kvm-all.c >> @@ -102,6 +102,7 @@ bool kvm_has_guest_debug; >> static int kvm_sstep_flags; >> static bool kvm_immediate_exit; >> static bool kvm_guest_memfd_supported; >> +static uint64_t kvm_supported_memory_attributes; >> static hwaddr kvm_max_slot_size = ~0; >> >> static const KVMCapabilityInfo kvm_required_capabilites[] = { >> @@ -1305,6 +1306,44 @@ void kvm_set_max_memslot_size(hwaddr max_slot_size) >> kvm_max_slot_size = max_slot_size; >> } >> >> +static int kvm_set_memory_attributes(hwaddr start, hwaddr size, uint64_t attr) >> +{ >> + struct kvm_memory_attributes attrs; >> + int r; >> + >> + attrs.attributes = attr; >> + attrs.address = start; >> + attrs.size = size; >> + attrs.flags = 0; >> + >> + r = kvm_vm_ioctl(kvm_state, KVM_SET_MEMORY_ATTRIBUTES, &attrs); >> + if (r) { >> + warn_report("%s: failed to set memory (0x%lx+%#zx) with attr 0x%lx error '%s'", >> + __func__, start, size, attr, strerror(errno)); > > This is an error condition rather than an warning condition. > > Also again I think __func__ is generally not required in an error message, > if the error message text is suitably descriptive - applies to other > patches in this series too. Get it. >> + } >> + return r; >> +} >> + >> +int kvm_set_memory_attributes_private(hwaddr start, hwaddr size) >> +{ >> + if (!(kvm_supported_memory_attributes & KVM_MEMORY_ATTRIBUTE_PRIVATE)) { >> + error_report("KVM doesn't support PRIVATE memory attribute\n"); >> + return -EINVAL; >> + } >> + >> + return kvm_set_memory_attributes(start, size, KVM_MEMORY_ATTRIBUTE_PRIVATE); >> +} >> + >> +int kvm_set_memory_attributes_shared(hwaddr start, hwaddr size) >> +{ >> + if (!(kvm_supported_memory_attributes & KVM_MEMORY_ATTRIBUTE_PRIVATE)) { >> + error_report("KVM doesn't support PRIVATE memory attribute\n"); >> + return -EINVAL; >> + } >> + >> + return kvm_set_memory_attributes(start, size, 0); >> +} >> + >> /* Called with KVMMemoryListener.slots_lock held */ >> static void kvm_set_phys_mem(KVMMemoryListener *kml, >> MemoryRegionSection *section, bool add) >> @@ -2440,6 +2479,9 @@ static int kvm_init(MachineState *ms) >> >> kvm_guest_memfd_supported = kvm_check_extension(s, KVM_CAP_GUEST_MEMFD); >> >> + ret = kvm_check_extension(s, KVM_CAP_MEMORY_ATTRIBUTES); >> + kvm_supported_memory_attributes = ret > 0 ? ret : 0; >> + >> if (object_property_find(OBJECT(current_machine), "kvm-type")) { >> g_autofree char *kvm_type = object_property_get_str(OBJECT(current_machine), >> "kvm-type", >> diff --git a/include/sysemu/kvm.h b/include/sysemu/kvm.h >> index fedc28c7d17f..0e88958190a4 100644 >> --- a/include/sysemu/kvm.h >> +++ b/include/sysemu/kvm.h >> @@ -540,4 +540,7 @@ bool kvm_dirty_ring_enabled(void); >> uint32_t kvm_dirty_ring_size(void); >> >> int kvm_create_guest_memfd(uint64_t size, uint64_t flags, Error **errp); >> + >> +int kvm_set_memory_attributes_private(hwaddr start, hwaddr size); >> +int kvm_set_memory_attributes_shared(hwaddr start, hwaddr size); >> #endif >> -- >> 2.34.1 >> > > With regards, > Daniel