From nobody Mon Feb 9 23:39:16 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=intel.com ARC-Seal: i=1; a=rsa-sha256; t=1588150714; cv=none; d=zohomail.com; s=zohoarc; b=cOQNEBt8fFjYRn6Fplc9npGAMS5op7VxQbg2FDd85xZEF7fO1xJv2V5Nv0V+XVp8Z5QebB61OoBLc0dnCqT49+sckWEcCbdqgC7Bm8F2NUhs2g7/8Q4T+z1nPLyYW5ZHNFFJlJwDJdZCHf2EKbvt+NDrSgc5KcE+zIduvDIdV3c= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1588150714; h=Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:Message-ID:References:Sender:Subject:To; bh=HO2z0RVC3DxPHsJmEAHqYlCK2Z5kGAbpw7tvGYyRMxE=; b=e/EnC//jMWjI8Uf39CIRALqmNDKLZQzmbgIoRVujb7SojxwhOlSLdnZ2Wv2H2tAdtq5yH7sLFQhQqHqonO0bVco9bby09VlaoY8mMb3rLNEo2brJbJ2DvUOt0N4JGXOJA7CkwKpgnqAYxOTVvl1M/9rmcCYn6bQC6syflcVo62Q= ARC-Authentication-Results: i=1; mx.zohomail.com; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail header.from= (p=none dis=none) header.from= Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1588150714670328.05611535338164; Wed, 29 Apr 2020 01:58:34 -0700 (PDT) Received: from localhost ([::1]:52120 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1jTiY5-00054u-GK for importer@patchew.org; Wed, 29 Apr 2020 04:58:33 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:57804) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1jTiVc-0000rk-53 for qemu-devel@nongnu.org; Wed, 29 Apr 2020 04:56:04 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.90_1) (envelope-from ) id 1jTiV8-0001BE-HL for qemu-devel@nongnu.org; Wed, 29 Apr 2020 04:55:59 -0400 Received: from mga05.intel.com ([192.55.52.43]:25913) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1jTiV7-0000wb-II for qemu-devel@nongnu.org; Wed, 29 Apr 2020 04:55:30 -0400 Received: from fmsmga005.fm.intel.com ([10.253.24.32]) by fmsmga105.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 29 Apr 2020 01:55:26 -0700 Received: from dazhang1-mobile.sh.intel.com ([10.239.48.70]) by fmsmga005.fm.intel.com with ESMTP; 29 Apr 2020 01:55:24 -0700 IronPort-SDR: 0N+vlx/ELAfT5oIF/ePZwBRbQFV+MakLSGnSBew8Ia7rpK5HlUfbfGfnClNejhKgeD92p1uR7z W6/BRXBXyaqQ== X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False IronPort-SDR: f+c7rNMlyGB4ZDKLhVjyNARVSQZ5ut6OSNUKkx1QxvDtcF0XOuLKuYpkfDpFvobpv/g3A/0yRS 8QKcGSxvorZA== X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.73,331,1583222400"; d="scan'208";a="459114622" From: Jingqi Liu To: Paolo Bonzini , Richard Henderson , Joao Martins , Xiao Guangrong , Dan Williams Subject: [PATCH v3 1/3] exec: fetch the alignment of Linux devdax pmem character device nodes Date: Wed, 29 Apr 2020 16:50:09 +0800 Message-Id: <20200429085011.63752-2-jingqi.liu@intel.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20200429085011.63752-1-jingqi.liu@intel.com> References: <20200429085011.63752-1-jingqi.liu@intel.com> Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=192.55.52.43; envelope-from=jingqi.liu@intel.com; helo=mga05.intel.com X-detected-operating-system: by eggs.gnu.org: First seen = 2020/04/29 04:55:24 X-ACL-Warn: Detected OS = FreeBSD 9.x or newer [fuzzy] X-Received-From: 192.55.52.43 X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Jingqi Liu , qemu-devel@nongnu.org Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" If the backend file is devdax pmem character device, the alignment specified by the option 'align=3DNUM' in the '-object memory-backend-file' needs to match the alignment requirement of the devdax pmem character devic= e. This patch uses the interfaces of libdaxctl to fetch the devdax pmem file 'align', so that we can compare it with the NUM of 'align=3DNUM'. The NUM needs to be larger than or equal to the devdax pmem file 'align'. It also fixes the problem that mmap() returns failure in qemu_ram_mmap() when the NUM of 'align=3DNUM' is less than the devdax pmem file 'align'. Suggested-by: Dan Williams Reviewed-by: Joao Martins Signed-off-by: Jingqi Liu --- exec.c | 54 +++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 53 insertions(+), 1 deletion(-) diff --git a/exec.c b/exec.c index de9d949902..2c3444e47e 100644 --- a/exec.c +++ b/exec.c @@ -77,6 +77,10 @@ =20 #include "monitor/monitor.h" =20 +#ifdef CONFIG_LIBDAXCTL +#include +#endif + //#define DEBUG_SUBPAGE =20 #if !defined(CONFIG_USER_ONLY) @@ -1736,6 +1740,46 @@ static int64_t get_file_size(int fd) return size; } =20 +static int64_t get_file_align(int fd) +{ + int64_t align =3D -1; +#if defined(__linux__) && defined(CONFIG_LIBDAXCTL) + struct stat st; + + if (fstat(fd, &st) < 0) { + return -errno; + } + + /* Special handling for devdax character devices */ + if (S_ISCHR(st.st_mode)) { + g_autofree char *path =3D NULL; + g_autofree char *rpath =3D NULL; + struct daxctl_ctx *ctx; + struct daxctl_region *region; + int rc =3D 0; + + path =3D g_strdup_printf("/sys/dev/char/%d:%d", + major(st.st_rdev), minor(st.st_rdev)); + rpath =3D realpath(path, NULL); + + rc =3D daxctl_new(&ctx); + if (rc) { + return -1; + } + + daxctl_region_foreach(ctx, region) { + if (strstr(rpath, daxctl_region_get_path(region))) { + align =3D daxctl_region_get_align(region); + break; + } + } + daxctl_unref(ctx); + } +#endif /* defined(__linux__) && defined(CONFIG_LIBDAXCTL) */ + + return align; +} + static int file_ram_open(const char *path, const char *region_name, bool *created, @@ -2275,7 +2319,7 @@ RAMBlock *qemu_ram_alloc_from_fd(ram_addr_t size, Mem= oryRegion *mr, { RAMBlock *new_block; Error *local_err =3D NULL; - int64_t file_size; + int64_t file_size, file_align; =20 /* Just support these ram flags by now. */ assert((ram_flags & ~(RAM_SHARED | RAM_PMEM)) =3D=3D 0); @@ -2311,6 +2355,14 @@ RAMBlock *qemu_ram_alloc_from_fd(ram_addr_t size, Me= moryRegion *mr, return NULL; } =20 + file_align =3D get_file_align(fd); + if (file_align > 0 && mr && file_align > mr->align) { + error_setg(errp, "backing store align 0x%" PRIx64 + " is larger than 'align' option 0x" RAM_ADDR_FMT, + file_align, mr->align); + return NULL; + } + new_block =3D g_malloc0(sizeof(*new_block)); new_block->mr =3D mr; new_block->used_length =3D size; --=20 2.17.1