xen: return machine address without knowing memseg id
authorOlivier Matz <olivier.matz@6wind.com>
Wed, 18 May 2016 11:04:47 +0000 (13:04 +0200)
committerThomas Monjalon <thomas.monjalon@6wind.com>
Thu, 19 May 2016 12:40:14 +0000 (14:40 +0200)
The conversion from guest physical address to machine physical address
is fast when the caller knows the memseg corresponding to the gpa.

But in case the user does not know this information, just find it
by browsing the segments. This feature will be used by next commit.

Signed-off-by: Olivier Matz <olivier.matz@6wind.com>
lib/librte_eal/common/include/rte_memory.h
lib/librte_eal/linuxapp/eal/eal_xen_memory.c

index f8dbece..0661109 100644 (file)
@@ -200,21 +200,22 @@ unsigned rte_memory_get_nrank(void);
 int rte_xen_dom0_supported(void);
 
 /**< Internal use only - phys to virt mapping for xen */
-phys_addr_t rte_xen_mem_phy2mch(uint32_t, const phys_addr_t);
+phys_addr_t rte_xen_mem_phy2mch(int32_t, const phys_addr_t);
 
 /**
  * Return the physical address of elt, which is an element of the pool mp.
  *
  * @param memseg_id
- *   The mempool is from which memory segment.
+ *   Identifier of the memory segment owning the physical address. If
+ *   set to -1, find it automatically.
  * @param phy_addr
  *   physical address of elt.
  *
  * @return
- *   The physical address or error.
+ *   The physical address or RTE_BAD_PHYS_ADDR on error.
  */
 static inline phys_addr_t
-rte_mem_phy2mch(uint32_t memseg_id, const phys_addr_t phy_addr)
+rte_mem_phy2mch(int32_t memseg_id, const phys_addr_t phy_addr)
 {
        if (rte_xen_dom0_supported())
                return rte_xen_mem_phy2mch(memseg_id, phy_addr);
@@ -250,7 +251,7 @@ static inline int rte_xen_dom0_supported(void)
 }
 
 static inline phys_addr_t
-rte_mem_phy2mch(uint32_t memseg_id __rte_unused, const phys_addr_t phy_addr)
+rte_mem_phy2mch(int32_t memseg_id __rte_unused, const phys_addr_t phy_addr)
 {
        return phy_addr;
 }
index 495eef9..0b612bb 100644 (file)
@@ -156,13 +156,27 @@ get_xen_memory_size(void)
  * Based on physical address to caculate MFN in Xen Dom0.
  */
 phys_addr_t
-rte_xen_mem_phy2mch(uint32_t memseg_id, const phys_addr_t phy_addr)
+rte_xen_mem_phy2mch(int32_t memseg_id, const phys_addr_t phy_addr)
 {
-       int mfn_id;
+       int mfn_id, i;
        uint64_t mfn, mfn_offset;
        struct rte_mem_config *mcfg = rte_eal_get_configuration()->mem_config;
        struct rte_memseg *memseg = mcfg->memseg;
 
+       /* find the memory segment owning the physical address */
+       if (memseg_id == -1) {
+               for (i = 0; i < RTE_MAX_MEMSEG; i++) {
+                       if ((phy_addr >= memseg[i].phys_addr) &&
+                                       (phys_addr < memseg[i].phys_addr +
+                                               memseg[i].size)) {
+                               memseg_id = i;
+                               break;
+                       }
+               }
+               if (memseg_id == -1)
+                       return RTE_BAD_PHYS_ADDR;
+       }
+
        mfn_id = (phy_addr - memseg[memseg_id].phys_addr) / RTE_PGSIZE_2M;
 
        /*the MFN is contiguous in 2M */