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

Re: [Xen-devel] [PATCH] xen/arm: Add support for 16 bit VMIDs



Hi,


 static DECLARE_BITMAP(vmid_mask, MAX_VMID);

 void p2m_vmid_allocator_init(void)
 {
+    unsigned int cpu;
+
     set_bit(INVALID_VMID, vmid_mask);
+
+    max_vmid = MAX_VMID;

max_vmid is only declared for ARM64 and will break compilation for ARM32. Please try to build each patch for both architecture before sending to the ML.

I will compile for ARM32.
 
However, in this case. It would make more sense to keep the maximum vmid static for ARM32 as it will never change.
 
I quite like what has been done for P2M_ROOT_{LEVEL,ORDER} where the define is a constant on ARM32 and point to a variable on ARM64.

I will keep the bitmap statically defined for ARM32. For ARM64 bitmap will be allocated dynamically.
 
+
+#ifdef CONFIG_ARM_64
+    /*
+     * if any cpu does not support 16-bit VMID then restrict the
+     * max VMIDs which can be allocated to 256
+     */
+    for_each_online_cpu ( cpu )
+    {
+        const struct cpuinfo_arm *info = &cpu_data[cpu];
+
+        if ( info->mm64.vmid_bits != VMID_16_BITS_SUPPORT )
+        {
+            max_vmid = (1UL << 8);
+            break;
+        }
+    }
+#endif

I would rework this code to have max_vmid set to 8 bits by default and the turn on 16 bits if available on every CPU.

I will modify the code accordingly.
 
 }

 static int p2m_alloc_vmid(struct domain *d)
@@ -1254,11 +1282,11 @@ static int p2m_alloc_vmid(struct domain *d)

     spin_lock(&vmid_alloc_lock);

-    nr = find_first_zero_bit(vmid_mask, MAX_VMID);
+    nr = find_first_zero_bit(vmid_mask, max_vmid);

     ASSERT(nr != INVALID_VMID);

-    if ( nr == MAX_VMID )
+    if ( nr == max_vmid )
     {
         rc = -EBUSY;
         printk(XENLOG_ERR "p2m.c: dom%d: VMID pool exhausted\n", d->domain_id);
@@ -1646,6 +1674,10 @@ void __init setup_virt_paging(void)

     val |= VTCR_PS(pa_range);
     val |= VTCR_TG0_4K;
+
+    /* set the VS bit only if 16 bit VMID is supported */
+    if ( max_vmid == MAX_VMID )

This check is confusing, I would be clearer to use MAX_VMID_16 or else.

I will explicitly use 16 bit macro
 
+        val |= VTCR_VS;
     val |= VTCR_SL0(pa_range_info[pa_range].sl0);
     val |= VTCR_T0SZ(pa_range_info[pa_range].t0sz);

diff --git a/xen/include/asm-arm/p2m.h b/xen/include/asm-arm/p2m.h
index fdb6b47..bfcdbf1 100644
--- a/xen/include/asm-arm/p2m.h
+++ b/xen/include/asm-arm/p2m.h
@@ -30,7 +30,7 @@ struct p2m_domain {
     struct page_info *root;

     /* Current VMID in use */
-    uint8_t vmid;
+    uint16_t vmid;

     /* Current Translation Table Base Register for the p2m */
     uint64_t vttbr;
diff --git a/xen/include/asm-arm/processor.h b/xen/include/asm-arm/processor.h
index 15bf890..4b6be3d 100644
--- a/xen/include/asm-arm/processor.h
+++ b/xen/include/asm-arm/processor.h
@@ -215,6 +215,7 @@

 #define VTCR_PS(x)      ((x)<<16)

+#define VTCR_VS        (_AC(0x1,UL)<<19)

Newline here please.

Ok.
 #endif

 #define VTCR_RES1       (_AC(1,UL)<<31)
@@ -269,6 +270,11 @@
 /* FSR long format */
 #define FSRL_STATUS_DEBUG       (_AC(0x22,UL)<<0)

+#ifdef CONFIG_ARM_64
+#define VMID_8_BITS_SUPPORT         0x0
+#define VMID_16_BITS_SUPPORT        0x2
+#endif

I would prefix the 2 define with MM64_ so we know how the values will be matched.

You mean I define them like this ?
#define MM64_VMID_8_BITS_SUPPORT   0x0
#define MM64_VMID_16_BITS_SUPPORT 0x2

+
 #ifndef __ASSEMBLY__

 struct cpuinfo_arm {
@@ -337,7 +343,16 @@ struct cpuinfo_arm {
             unsigned long tgranule_64K:4;
             unsigned long tgranule_4K:4;
             unsigned long __res0:32;
-       };
+
+            unsigned long hafdbs:4;
+            unsigned long vmid_bits:4;
+            unsigned long vh:4;
+            unsigned long hpds:4;
+            unsigned long lo:4;
+            unsigned long pan:4;
+            unsigned long __res1:8;
+            unsigned long __res2:32;
+        };
     } mm64;

     struct {


Regards,

--
Julien Grall

_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
https://lists.xen.org/xen-devel

 


Rackspace

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