WARNING - OLD ARCHIVES

This is an archived copy of the Xen.org mailing list, which we have preserved to ensure that existing links to archives are not broken. The live archive, which contains the latest emails, can be found at http://lists.xen.org/
   
 
 
Xen 
 
Home Products Support Community News
 
   
 

xen-changelog

[Xen-changelog] [IA64] dom_rid_bits

# HG changeset patch
# User awilliam@xxxxxxxxxxx
# Node ID 2de95fd92e740eb709e2b54aa5d4ef54e1cf97a1
# Parent  a1add4e39878b610b28c40dbb858dc0daac521a9
[IA64] dom_rid_bits

dom_rid_bits command line parameter added (set default domain rid bits).
Comments added and cleanups in regionreg.c
panic_domain declared in domain.h

Signed-off-by: Tristan Gingold <tristan.gingold@xxxxxxxx>

diff -r a1add4e39878 -r 2de95fd92e74 xen/arch/ia64/xen/regionreg.c
--- a/xen/arch/ia64/xen/regionreg.c     Wed Apr 19 10:24:33 2006 -0600
+++ b/xen/arch/ia64/xen/regionreg.c     Wed Apr 19 10:26:50 2006 -0600
@@ -15,24 +15,39 @@
 #include <asm/regionreg.h>
 #include <asm/vhpt.h>
 #include <asm/vcpu.h>
+
+/* Defined in xemasm.S  */
 extern void ia64_new_rr7(unsigned long rid,void *shared_info, void 
*shared_arch_info, unsigned long p_vhpt, unsigned long v_pal);
+
 extern void *pal_vaddr;
 
-/* FIXME: where these declarations should be there ? */
-extern void panic_domain(struct pt_regs *, const char *, ...);
-
-#define DOMAIN_RID_BITS_DEFAULT 18
-
+/* RID virtualization mechanism is really simple:  domains have less rid bits
+   than the host and the host rid space is shared among the domains.  (Values
+   in parenthesis are usual default values).
+
+   The host rid space is partitionned into MAX_RID_BLOCKS (= 64)
+   blocks of 2**IA64_MIN_IMPL_RID_BITS (= 18) rids.  The first block is also
+   partitionned into MAX_RID_BLOCKS small blocks.  Small blocks are used for
+   metaphysical rids.  Small block 0 can't be allocated and is reserved for
+   Xen own rids during boot.
+
+   Blocks and small blocks are allocated together and a domain may
+   have one or more consecutive blocks (and small blocks).
+*/
+
+/* Minimum number of RID bits for a domain.  The current value is 18, which is
+   the minimum defined by the itanium architecture, but it can be lowered
+   to increase the number of domain.  */
 #define        IA64_MIN_IMPL_RID_BITS  (IA64_MIN_IMPL_RID_MSB+1)
+/* Maximum number of RID bits.  This is definitly 24.  */
 #define        IA64_MAX_IMPL_RID_BITS  24
 
-#define MIN_RIDS       (1 << IA64_MIN_IMPL_RID_BITS)
-#define        MIN_RID_MAX     (MIN_RIDS - 1)
-#define        MIN_RID_MASK    (MIN_RIDS - 1)
-#define        MAX_RIDS        (1 << (IA64_MAX_IMPL_RID_BITS))
-#define        MAX_RID         (MAX_RIDS - 1)
+/* Maximum number of blocks.  */
 #define        MAX_RID_BLOCKS  (1 << 
(IA64_MAX_IMPL_RID_BITS-IA64_MIN_IMPL_RID_BITS))
-#define RIDS_PER_RIDBLOCK MIN_RIDS
+
+/* Default number of rid bits for domains.  */
+static unsigned int domain_rid_bits_default = IA64_MIN_IMPL_RID_BITS;
+integer_param("dom_rid_bits", domain_rid_bits_default); 
 
 #if 0
 // following already defined in include/asm-ia64/gcc_intrin.h
@@ -90,11 +105,31 @@ void init_rid_allocator (void)
        if (implemented_rid_bits > IA64_MAX_IMPL_RID_BITS)
                implemented_rid_bits = IA64_MAX_IMPL_RID_BITS;
 
+       /* Due to RID mangling, we expect 24 RID bits!
+          This test should be removed if RID mangling is removed/modified.  */
+       if (implemented_rid_bits != 24) {
+               printf ("RID mangling expected 24 RID bits, got only %d!\n",
+                       implemented_rid_bits);
+               BUG();
+       }
+
+       /* Allow the creation of at least domain 0.  */
+       if (domain_rid_bits_default > implemented_rid_bits - 1)
+               domain_rid_bits_default = implemented_rid_bits - 1;
+
+       /* Check for too small values.  */
+       if (domain_rid_bits_default < IA64_MIN_IMPL_RID_BITS) {
+               printf ("Default domain rid bits %d is too small, use %d\n",
+                       domain_rid_bits_default, IA64_MIN_IMPL_RID_BITS);
+               domain_rid_bits_default = IA64_MIN_IMPL_RID_BITS;
+       }
+
        log_blocks = (implemented_rid_bits - IA64_MIN_IMPL_RID_BITS);
 
-       printf ("Maximum of simultaneous domains: %d\n",
-               (1 << log_blocks) - 1);
-
+       printf ("Maximum number of domains: %d; %d RID bits per domain\n",
+               (1 << (implemented_rid_bits - domain_rid_bits_default)) - 1,
+               domain_rid_bits_default);
+       
        mp_rid_shift = IA64_MIN_IMPL_RID_BITS - log_blocks;
        BUG_ON (mp_rid_shift < 3);
 }
@@ -109,7 +144,7 @@ int allocate_rid_range(struct domain *d,
        int i, j, n_rid_blocks;
 
        if (ridbits == 0)
-               ridbits = DOMAIN_RID_BITS_DEFAULT;
+               ridbits = domain_rid_bits_default;
 
        if (ridbits >= IA64_MAX_IMPL_RID_BITS)
                ridbits = IA64_MAX_IMPL_RID_BITS - 1;
@@ -152,7 +187,7 @@ int allocate_rid_range(struct domain *d,
        d->arch.metaphysical_rr0 = allocate_metaphysical_rr(d, 0);
        d->arch.metaphysical_rr4 = allocate_metaphysical_rr(d, 1);
 
-       printf("###allocating rid_range, domain %p: rid=%x-%x mp_rid=%x\n",
+       printf("### domain %p: rid=%x-%x mp_rid=%x\n",
               d, d->arch.starting_rid, d->arch.ending_rid,
               d->arch.starting_mp_rid);
        
@@ -166,20 +201,16 @@ int deallocate_rid_range(struct domain *
        int rid_block_end = d->arch.ending_rid >> IA64_MIN_IMPL_RID_BITS;
        int rid_block_start = d->arch.starting_rid >> IA64_MIN_IMPL_RID_BITS;
 
-       //
-       // not all domains will have allocated RIDs (physical mode loaders for 
instance)
-       //
-       if (d->arch.rid_bits == 0) return 1;
-
-#ifdef DEBUG
+       /* Sanity check.  */
+       if (d->arch.rid_bits == 0)
+               return 1;
+
+       
        for (i = rid_block_start; i < rid_block_end; ++i) {
                ASSERT(ridblock_owner[i] == d);
-           }
-#endif
-       
-       for (i = rid_block_start; i < rid_block_end; ++i)
                ridblock_owner[i] = NULL;
-       
+       }
+
        d->arch.rid_bits = 0;
        d->arch.starting_rid = 0;
        d->arch.ending_rid = 0;
diff -r a1add4e39878 -r 2de95fd92e74 xen/include/asm-ia64/domain.h
--- a/xen/include/asm-ia64/domain.h     Wed Apr 19 10:24:33 2006 -0600
+++ b/xen/include/asm-ia64/domain.h     Wed Apr 19 10:26:50 2006 -0600
@@ -17,6 +17,10 @@ extern void domain_relinquish_resources(
    If sync_only is true, only synchronize I&D caches,
    if false, flush and invalidate caches.  */
 extern void domain_cache_flush (struct domain *d, int sync_only);
+
+/* Cleanly crash the current domain with a message.  */
+extern void panic_domain(struct pt_regs *, const char *, ...)
+     __attribute__ ((noreturn, format (printf, 2, 3)));
 
 struct arch_domain {
     struct mm_struct *mm;

_______________________________________________
Xen-changelog mailing list
Xen-changelog@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-changelog

<Prev in Thread] Current Thread [Next in Thread>
  • [Xen-changelog] [IA64] dom_rid_bits, Xen patchbot -unstable <=