[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[PATCH v1 12/13] xen/arm: defer foreign memory map in shm_init_late


  • To: <xen-devel@xxxxxxxxxxxxxxxxxxxx>
  • From: Penny Zheng <Penny.Zheng@xxxxxxx>
  • Date: Fri, 11 Mar 2022 14:11:22 +0800
  • Arc-authentication-results: i=1; mx.microsoft.com 1; spf=pass (sender ip is 40.67.248.234) smtp.rcpttodomain=lists.xenproject.org smtp.mailfrom=arm.com; dmarc=pass (p=none sp=none pct=100) action=none header.from=arm.com; dkim=none (message not signed); arc=none
  • Arc-message-signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=JPsPOvzho2nUCB0RDRsUprWjaTqQDf6F4G+auSec2gA=; b=TpDq0G5H+cW6Zig2cadDJLIAc6WBP/xVoy+at+5Okb7G8wLhbHkYHBs8jDPY1+NSs1YoGXyFpcpdDCHfLKo/+J6+LLX3q3OR1vbmBevHc1ZLIMcYaHBlU/wKc6PAa3HP+Te/ZuPkH4SrnkmYLaYdjJCQvX7RqxOvkJKanyUXJrrPlBdc9OZzP6Lb+5rrTfk3w/zVKUofRnO0IQ4WWeU5ce3M2roM0qxBNU3CkjFPQ0LcRWmKAiDPxarBQF0fLMU5hitOunH106AgKmbRiy2TURjPXz6FZvbV2GJHyMJpFD2jfh01RaM0gdNPrM3Z/jPtbTG1Gd552KQAMgrfdvTaNQ==
  • Arc-seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=lp16z6s2RNHzOatsFZZSsANhotpnk41e3Gd5cV9oIOJx4xPonMx+e3y83lKDganBe4i0CFQ8xLL+uHANPQCr3Z+kHQV+8wSdStHS66Sztd5qtEvZU2NFBPdeEknIqnS7RnhKDuWiggrVAojux34RUZMmCYQE/kIYjZ/BuLPStxHIfpBLcVJwNEy8l45hglxkqxJlC5dh5audxcksB06gh35cCPbhjz4h630qFaYt14DxfD1uIBdGV0hl1NQhMq3knDpA8dgaICxkbWEKIFn2V/zmGgOoZAV995Hzo6H40YI/DxwQEsaJkz3z5e1RgD04XmrMo8ZshQF7sXOvomcHRQ==
  • Cc: <nd@xxxxxxx>, Penny Zheng <penny.zheng@xxxxxxx>, Stefano Stabellini <sstabellini@xxxxxxxxxx>, Julien Grall <julien@xxxxxxx>, Bertrand Marquis <bertrand.marquis@xxxxxxx>, Volodymyr Babchuk <Volodymyr_Babchuk@xxxxxxxx>
  • Delivery-date: Fri, 11 Mar 2022 06:16:45 +0000
  • List-id: Xen developer discussion <xen-devel.lists.xenproject.org>
  • Nodisclaimer: true

From: Penny Zheng <penny.zheng@xxxxxxx>

This commit introduces a new helper shm_init_late to implement
deferred foreign memory mapping of static shared memory.

Signed-off-by: Penny Zheng <penny.zheng@xxxxxxx>
---
 xen/arch/arm/domain_build.c       | 51 +++++++++++++++++++++++++++++++
 xen/arch/arm/include/asm/domain.h |  1 +
 xen/arch/arm/setup.c              |  6 ++++
 3 files changed, 58 insertions(+)

diff --git a/xen/arch/arm/domain_build.c b/xen/arch/arm/domain_build.c
index 4b19160674..f6ef5a702f 100644
--- a/xen/arch/arm/domain_build.c
+++ b/xen/arch/arm/domain_build.c
@@ -1006,6 +1006,57 @@ static int __init process_shm(struct domain *d,
 
     return 0;
 }
+
+int __init shm_init_late(void)
+{
+    unsigned long i = 0UL, shm_id;
+    int ret = 0;
+    struct domain *od, **bd = NULL;
+    unsigned long o_gfn, b_gfn, nr_gfns;
+
+    for ( shm_id = find_first_bit(shm_list_mask, NR_MEM_BANKS);
+          shm_id < NR_MEM_BANKS;
+          shm_id = find_next_bit(shm_list_mask, NR_MEM_BANKS, shm_id + 1) )
+
+    {
+        /* Acquire the only owner domain. */
+        od = get_domain_by_id(shm_list[shm_id].owner_dom);
+        if ( od == NULL )
+            return -ESRCH;
+        o_gfn = PFN_DOWN(shm_list[shm_id].owner_gbase);
+        nr_gfns = PFN_DOWN(shm_list[shm_id].size);
+
+        bd = xmalloc_array(struct domain *, shm_list[shm_id].nr_borrower);
+        if ( !bd )
+            return -ENOMEM;
+        /* Set up foreign memory map for all borrower domains. */
+        for ( i = 0; i < shm_list[shm_id].nr_borrower; i++ )
+        {
+            bd[i] = get_domain_by_id(shm_list[shm_id].borrower_dom[i]);
+            if ( bd[i] == NULL )
+            {
+                return -ESRCH;
+                goto fail;
+            }
+
+            b_gfn = PFN_DOWN(shm_list[shm_id].borrower_gbase[i]);
+            ret = guest_physmap_add_shm(od, bd[i], o_gfn, b_gfn, nr_gfns);
+            if ( ret )
+            {
+                ret = -EINVAL;
+                goto fail;
+            }
+        }
+
+        xfree(bd);
+    }
+    return ret;
+
+ fail:
+    xfree(bd);
+
+    return ret;
+}
 #endif /* CONFIG_STATIC_SHM */
 #else
 static void __init allocate_static_memory(struct domain *d,
diff --git a/xen/arch/arm/include/asm/domain.h 
b/xen/arch/arm/include/asm/domain.h
index 1c0f2e22ca..c3f2155f5c 100644
--- a/xen/arch/arm/include/asm/domain.h
+++ b/xen/arch/arm/include/asm/domain.h
@@ -58,6 +58,7 @@ typedef struct {
 } shm_info_t;
 extern shm_info_t shm_list[NR_MEM_BANKS];
 extern unsigned long shm_list_mask[BITS_TO_LONGS(NR_MEM_BANKS)];
+extern int shm_init_late(void);
 #else
 #define dom_shared NULL
 #endif
diff --git a/xen/arch/arm/setup.c b/xen/arch/arm/setup.c
index f6a3b04958..4987b71111 100644
--- a/xen/arch/arm/setup.c
+++ b/xen/arch/arm/setup.c
@@ -1051,7 +1051,13 @@ void __init start_xen(unsigned long boot_phys_offset,
         printk(XENLOG_INFO "Xen dom0less mode detected\n");
 
     if ( acpi_disabled )
+    {
         create_domUs();
+#ifdef CONFIG_STATIC_SHM
+        if ( shm_init_late() )
+            panic("Failed to set up deferred foreign memory mapping of static 
shared memory.\n");
+#endif
+    }
 
     /*
      * This needs to be called **before** heap_init_late() so modules
-- 
2.25.1




 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.