From nobody Tue Feb 10 07:43:11 2026 Delivered-To: importer@patchew.org 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; Authentication-Results: mx.zohomail.com; dkim=fail; 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=partner.samsung.com Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 15808954636131019.2100612332744; Wed, 5 Feb 2020 01:37:43 -0800 (PST) Received: from localhost ([::1]:43626 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1izH7u-0005yQ-Ex for importer@patchew.org; Wed, 05 Feb 2020 04:37:42 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]:49846) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1izH3f-0000hF-Sv for qemu-devel@nongnu.org; Wed, 05 Feb 2020 04:33:21 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1izH3e-0004xI-4J for qemu-devel@nongnu.org; Wed, 05 Feb 2020 04:33:19 -0500 Received: from mailout2.w1.samsung.com ([210.118.77.12]:41525) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1izH3d-0004T7-Pm for qemu-devel@nongnu.org; Wed, 05 Feb 2020 04:33:18 -0500 Received: from eucas1p2.samsung.com (unknown [182.198.249.207]) by mailout2.w1.samsung.com (KnoxPortal) with ESMTP id 20200205093315euoutp02481d807c3c8de208aa0fce5275384064~wd83QouJs1428814288euoutp02b for ; Wed, 5 Feb 2020 09:33:15 +0000 (GMT) Received: from eusmges3new.samsung.com (unknown [203.254.199.245]) by eucas1p1.samsung.com (KnoxPortal) with ESMTP id 20200205093314eucas1p1e652240bb7dc2f6f398ec5965bbffc3c~wd83CLIxv3063130631eucas1p1S; Wed, 5 Feb 2020 09:33:14 +0000 (GMT) Received: from eucas1p1.samsung.com ( [182.198.249.206]) by eusmges3new.samsung.com (EUCPMTA) with SMTP id CC.8A.60698.ADB8A3E5; Wed, 5 Feb 2020 09:33:14 +0000 (GMT) Received: from eusmtrp1.samsung.com (unknown [182.198.249.138]) by eucas1p1.samsung.com (KnoxPortal) with ESMTPA id 20200205093314eucas1p15a5cc16c92fd8004343acb1fd551f42a~wd82piy9L3273232732eucas1p1R; Wed, 5 Feb 2020 09:33:14 +0000 (GMT) Received: from eusmgms1.samsung.com (unknown [182.198.249.179]) by eusmtrp1.samsung.com (KnoxPortal) with ESMTP id 20200205093314eusmtrp1cb67ae381efaf7f721ba2b96b24f08c9~wd82pDnt11029010290eusmtrp1S; Wed, 5 Feb 2020 09:33:14 +0000 (GMT) Received: from eusmtip2.samsung.com ( [203.254.199.222]) by eusmgms1.samsung.com (EUCPMTA) with SMTP id 6D.8D.08375.ADB8A3E5; Wed, 5 Feb 2020 09:33:14 +0000 (GMT) Received: from AMDC3304.digital.local (unknown [106.120.51.21]) by eusmtip2.samsung.com (KnoxPortal) with ESMTPA id 20200205093314eusmtip267a15f48e03480c51a79618a064617a4~wd82YhnTK3043930439eusmtip2B; Wed, 5 Feb 2020 09:33:14 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 mailout2.w1.samsung.com 20200205093315euoutp02481d807c3c8de208aa0fce5275384064~wd83QouJs1428814288euoutp02b DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=samsung.com; s=mail20170921; t=1580895195; bh=VI8ZZsYihdmS6uzzMRU8CCMFMKBACwzdMDlOnQ0OCcE=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=IlFZSBp8C1ioTsnT+EIDWeNrj6VY9CSdAM8I06Gr57O/Ue9D6+hF7LjBBBDHS6RuE Nq2NdIEE17FmXgDViEB0ni4jQ893CfSWNd1yQJpWTJHgOrR82bygY82TitHpw8k2SW FGAWHAqNHh9uFI3WIXSoZVus+JaJhFbSSbPRurgs= X-AuditID: cbfec7f5-a0fff7000001ed1a-bd-5e3a8bdada91 From: i.kotrasinsk@partner.samsung.com To: qemu-devel@nongnu.org Subject: [RFC PATCH v2 1/9] memory: Add function for finding flat memory ranges Date: Wed, 5 Feb 2020 10:32:57 +0100 Message-Id: <1580895185-24341-2-git-send-email-i.kotrasinsk@partner.samsung.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1580895185-24341-1-git-send-email-i.kotrasinsk@partner.samsung.com> X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFnrJIsWRmVeSWpSXmKPExsWy7djPc7q3uq3iDHZe0LbYc+Exm8X+bf9Y LeacecBicbx3B4sDi8eda3vYPJ5c28zkcfDdHiaP9/uusgWwRHHZpKTmZJalFunbJXBlLGhc x1bwQrPic/8SxgbGiXJdjJwcEgImEn++XWPpYuTiEBJYwSixtfk/M4TzhVHiy9sVrBDOZ0aJ 2U+/MMO0HOm6xwiRWM4osWvZc3a4llWtb9lBqtgE1CR2HvnMCGKLCEhK/O46DdbNLJAh8XxW N5gtLBAosXNTHxOIzSKgKtH2axZYPa9AgMSpL41sENvkJG6e6wSr5wSq3/TpIxvIMgmBy2wS VyefZIIocpHYdGITlC0s8er4FnYIW0bi9OQeFgi7XqLlzg4miOYORom+ldOhNlhLfNmwFKiI A+g6TYn1u/Qhwo4Sq+6cZwYJSwjwSdx4KwhxP5/EpG3TocK8Eh1tQhDVehLdT24ywWxd1vgI aquHxLmD79gg4bOEUWLR5qOMExjlZyEsW8DIuIpRPLW0ODc9tdg4L7Vcrzgxt7g0L10vOT93 EyMwAZz+d/zrDsZ9f5IOMQpwMCrx8AZMsIwTYk0sK67MPcQowcGsJMJ7Xh8oxJuSWFmVWpQf X1Sak1p8iFGag0VJnNd40ctYIYH0xJLU7NTUgtQimCwTB6dUA6P24wjDef1Wcj9Nj21os1vm u6Y4uTLx795yR84klaoP0cFPNvLvPrRj0RzrwIC04+y2p/U3nvm4MbPubojIKd8HEec09uoe EC7r/bR6+SWrJXse3vapnmM++1efZbNaEfOLTUy8pyeFM5yvCLfuW2WucP/66vxImwnXm9ft nhYS8/Litsrqx5pKLMUZiYZazEXFiQD3F0Gb/AIAAA== X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFjrFLMWRmVeSWpSXmKPExsVy+t/xe7q3uq3iDK7MErPYc+Exm8X+bf9Y LeacecBicbx3B4sDi8eda3vYPJ5c28zkcfDdHiaP9/uusgWwROnZFOWXlqQqZOQXl9gqRRta GOkZWlroGZlY6hkam8daGZkq6dvZpKTmZJalFunbJehlLGhcx1bwQrPic/8SxgbGiXJdjJwc EgImEke67jF2MXJxCAksZZToefabFSIhI/Hj9Bo2CFtY4s+1LjaIok+MEutndzGBJNgE1CR2 HvnMCGKLCEhK/O46zQxiMwtkSeycfR+sRljAX+LCgh3sIDaLgKpE269ZYPW8AgESp740Qi2Q k7h5rhOsl1MgUGLTp49gcSGgmmtfv7JOYORbwMiwilEktbQ4Nz232FCvODG3uDQvXS85P3cT IzActx37uXkH46WNwYcYBTgYlXh4V0yyjBNiTSwrrsw9xCjBwawkwnteHyjEm5JYWZValB9f VJqTWnyI0RToqInMUqLJ+cBYySuJNzQ1NLewNDQ3Njc2s1AS5+0QOBgjJJCeWJKanZpakFoE 08fEwSnVwGiUqMmQ/KxypwyP+qdUzv+piVb120x3rlVsZTyQsv4Li8bmXMajr3+7m5923uPG 86FK/Oi6jesyJZ0uljm4tMVPsDoider4Z86VjnN27/H4LPxRa/mlow8Mrn/i+pDE+LVo8+E3 vXm7NOtnH+14ombbx9v7Ju8XxwtlkUdHIjtOus+6aHC7xFSJpTgj0VCLuag4EQCePDhwXQIA AA== X-CMS-MailID: 20200205093314eucas1p15a5cc16c92fd8004343acb1fd551f42a X-Msg-Generator: CA Content-Type: text/plain; charset="utf-8" X-RootMTR: 20200205093314eucas1p15a5cc16c92fd8004343acb1fd551f42a X-EPHeader: CA CMS-TYPE: 201P X-CMS-RootMailID: 20200205093314eucas1p15a5cc16c92fd8004343acb1fd551f42a References: <1580895185-24341-1-git-send-email-i.kotrasinsk@partner.samsung.com> X-detected-operating-system: by eggs.gnu.org: GNU/Linux 3.x X-Received-From: 210.118.77.12 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: peter.maydell@linaro.org, Igor Kotrasinski , pbonzini@redhat.com Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 From: Igor Kotrasinski Given an address this lets us find the largest contiguous memory range at that address. Signed-off-by: Igor Kotrasinski --- include/exec/memory.h | 19 +++++++++++++ memory.c | 79 +++++++++++++++++++++++++++++++++++++++++++++++= +++- 2 files changed, 97 insertions(+), 1 deletion(-) diff --git a/include/exec/memory.h b/include/exec/memory.h index e85b7de..ac09221 100644 --- a/include/exec/memory.h +++ b/include/exec/memory.h @@ -1915,6 +1915,25 @@ MemoryRegionSection memory_region_find(MemoryRegion = *mr, hwaddr addr, uint64_t size); =20 /** + * memory_region_find_flat_range: translate an address/size relative to + * a MemoryRegion into a FlatRange containing it. + * + * Returns a #MemoryRegionSection that describes this FlatRange. + * It will have the following characteristics: + * - @size =3D 0 iff no containing FlatRange was found + * - @mr is non-%NULL iff a containing FlatRange was found + * + * Remember that in the return value the @offset_within_region is + * relative to the returned region (in the .@mr field), not to the + * @mr argument. + * + * @mr: a MemoryRegion within which @addr is a relative address + * @addr: start of the area within @as to be searched + * @size: size of the area to be searched + */ +MemoryRegionSection memory_region_find_flat_range(MemoryRegion *mr, + hwaddr addr, uint64_t si= ze); +/** * memory_global_dirty_log_sync: synchronize the dirty log for all memory * * Synchronizes the dirty page log for all address spaces. diff --git a/memory.c b/memory.c index aeaa8dc..e9f37e7 100644 --- a/memory.c +++ b/memory.c @@ -2523,6 +2523,25 @@ static FlatRange *flatview_lookup(FlatView *view, Ad= drRange addr) sizeof(FlatRange), cmp_flatrange_addr); } =20 +static int cmp_flatrange_addr_containing(const void *addr_, const void *fr= _) +{ + const AddrRange *addr =3D addr_; + const FlatRange *fr =3D fr_; + + if (int128_le(addr->start, fr->addr.start)) { + return -1; + } else if (int128_ge(addrrange_end(*addr), addrrange_end(fr->addr))) { + return 1; + } + return 0; +} + +static FlatRange *flatview_lookup_containing(FlatView *view, AddrRange add= r) +{ + return bsearch(&addr, view->ranges, view->nr, + sizeof(FlatRange), cmp_flatrange_addr_containing); +} + bool memory_region_is_mapped(MemoryRegion *mr) { return mr->container ? true : false; @@ -2532,7 +2551,8 @@ bool memory_region_is_mapped(MemoryRegion *mr) * returned region. It must be called from an RCU critical section. */ static MemoryRegionSection memory_region_find_rcu(MemoryRegion *mr, - hwaddr addr, uint64_t si= ze) + hwaddr addr, + uint64_t size) { MemoryRegionSection ret =3D { .mr =3D NULL }; MemoryRegion *root; @@ -2576,6 +2596,50 @@ static MemoryRegionSection memory_region_find_rcu(Me= moryRegion *mr, return ret; } =20 +/* + * Same as memory_region_find_flat_range, but it does not add a reference = to + * the returned region. It must be called from an RCU critical section. + */ +static MemoryRegionSection memory_region_find_flat_range_rcu(MemoryRegion = *mr, + hwaddr addr, + uint64_t size) +{ + MemoryRegionSection ret =3D { .mr =3D NULL, .size =3D 0 }; + MemoryRegion *root; + AddressSpace *as; + AddrRange range; + FlatView *view; + FlatRange *fr; + + addr +=3D mr->addr; + for (root =3D mr; root->container; ) { + root =3D root->container; + addr +=3D root->addr; + } + + as =3D memory_region_to_address_space(root); + if (!as) { + return ret; + } + range =3D addrrange_make(int128_make64(addr), int128_make64(size)); + + view =3D address_space_to_flatview(as); + fr =3D flatview_lookup_containing(view, range); + if (!fr) { + return ret; + } + + ret.mr =3D fr->mr; + ret.fv =3D view; + range =3D fr->addr; + ret.offset_within_region =3D fr->offset_in_region; + ret.size =3D range.size; + ret.offset_within_address_space =3D int128_get64(range.start); + ret.readonly =3D fr->readonly; + ret.nonvolatile =3D fr->nonvolatile; + return ret; +} + MemoryRegionSection memory_region_find(MemoryRegion *mr, hwaddr addr, uint64_t size) { @@ -2588,6 +2652,19 @@ MemoryRegionSection memory_region_find(MemoryRegion = *mr, return ret; } =20 +MemoryRegionSection memory_region_find_flat_range(MemoryRegion *mr, + hwaddr addr, uint64_t si= ze) +{ + MemoryRegionSection ret; + rcu_read_lock(); + ret =3D memory_region_find_flat_range_rcu(mr, addr, size); + if (ret.mr) { + memory_region_ref(ret.mr); + } + rcu_read_unlock(); + return ret; +} + bool memory_region_present(MemoryRegion *container, hwaddr addr) { MemoryRegion *mr; --=20 2.7.4