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] [xen-unstable] hvm: More changes to reduce size of domai

To: xen-changelog@xxxxxxxxxxxxxxxxxxx
Subject: [Xen-changelog] [xen-unstable] hvm: More changes to reduce size of domain structure.
From: Xen patchbot-unstable <patchbot-unstable@xxxxxxxxxxxxxxxxxxx>
Date: Thu, 04 Oct 2007 17:41:39 -0700
Delivery-date: Thu, 04 Oct 2007 18:47:34 -0700
Envelope-to: www-data@xxxxxxxxxxxxxxxxxx
List-help: <mailto:xen-changelog-request@lists.xensource.com?subject=help>
List-id: BK change log <xen-changelog.lists.xensource.com>
List-post: <mailto:xen-changelog@lists.xensource.com>
List-subscribe: <http://lists.xensource.com/cgi-bin/mailman/listinfo/xen-changelog>, <mailto:xen-changelog-request@lists.xensource.com?subject=subscribe>
List-unsubscribe: <http://lists.xensource.com/cgi-bin/mailman/listinfo/xen-changelog>, <mailto:xen-changelog-request@lists.xensource.com?subject=unsubscribe>
Reply-to: xen-devel@xxxxxxxxxxxxxxxxxxx
Sender: xen-changelog-bounces@xxxxxxxxxxxxxxxxxxx
# HG changeset patch
# User Keir Fraser <keir@xxxxxxxxxxxxx>
# Date 1191425603 -3600
# Node ID ca1085e8ab82d33bffb01a1a0fa9d507bbcff5f1
# Parent  74a3ee6e1795b46527437107185df78440cbaf67
hvm: More changes to reduce size of domain structure.
It is now smaller than a page (4kB) on x86/32 and x86/64.
Signed-off-by: Keir Fraser <keir@xxxxxxxxxxxxx>
---
 xen/arch/x86/hvm/hvm.c            |    6 ++++-
 xen/arch/x86/hvm/i8254.c          |   42 ++++++++++++++++----------------------
 xen/arch/x86/hvm/vioapic.c        |   31 +++++++++++++++++++---------
 xen/include/asm-x86/hvm/domain.h  |    3 +-
 xen/include/asm-x86/hvm/vioapic.h |   14 +++++++++---
 xen/include/asm-x86/hvm/vpt.h     |    4 +--
 6 files changed, 59 insertions(+), 41 deletions(-)

diff -r 74a3ee6e1795 -r ca1085e8ab82 xen/arch/x86/hvm/hvm.c
--- a/xen/arch/x86/hvm/hvm.c    Wed Oct 03 15:47:47 2007 +0100
+++ b/xen/arch/x86/hvm/hvm.c    Wed Oct 03 16:33:23 2007 +0100
@@ -232,7 +232,10 @@ int hvm_domain_initialise(struct domain 
         return rc;
 
     vpic_init(d);
-    vioapic_init(d);
+
+    rc = vioapic_init(d);
+    if ( rc != 0 )
+        return rc;
 
     hvm_init_ioreq_page(d, &d->arch.hvm_domain.ioreq);
     hvm_init_ioreq_page(d, &d->arch.hvm_domain.buf_ioreq);
@@ -254,6 +257,7 @@ void hvm_domain_destroy(struct domain *d
 void hvm_domain_destroy(struct domain *d)
 {
     hvm_funcs.domain_destroy(d);
+    vioapic_deinit(d);
 }
 
 static int hvm_save_cpu_ctxt(struct domain *d, hvm_domain_context_t *h)
diff -r 74a3ee6e1795 -r ca1085e8ab82 xen/arch/x86/hvm/i8254.c
--- a/xen/arch/x86/hvm/i8254.c  Wed Oct 03 15:47:47 2007 +0100
+++ b/xen/arch/x86/hvm/i8254.c  Wed Oct 03 16:33:23 2007 +0100
@@ -185,7 +185,6 @@ static void pit_load_count(PITState *pit
 {
     u32 period;
     struct hvm_hw_pit_channel *s = &pit->hw.channels[channel];
-    struct periodic_time *pt = &pit->pt[channel];
     struct vcpu *v = vpit_vcpu(pit);
 
     ASSERT(spin_is_locked(&pit->lock));
@@ -207,16 +206,16 @@ static void pit_load_count(PITState *pit
     {
         case 2:
             /* Periodic timer. */
-            create_periodic_time(v, pt, period, 0, 0, pit_time_fired, 
+            create_periodic_time(v, &pit->pt0, period, 0, 0, pit_time_fired, 
                                  &pit->count_load_time[channel]);
             break;
         case 1:
             /* One-shot timer. */
-            create_periodic_time(v, pt, period, 0, 1, pit_time_fired,
+            create_periodic_time(v, &pit->pt0, period, 0, 1, pit_time_fired,
                                  &pit->count_load_time[channel]);
             break;
         default:
-            destroy_periodic_time(pt);
+            destroy_periodic_time(&pit->pt0);
             break;
     }
 }
@@ -396,7 +395,7 @@ void pit_stop_channel0_irq(PITState *pit
 void pit_stop_channel0_irq(PITState *pit)
 {
     spin_lock(&pit->lock);
-    destroy_periodic_time(&pit->pt[0]);
+    destroy_periodic_time(&pit->pt0);
     spin_unlock(&pit->lock);
 }
 
@@ -425,21 +424,18 @@ static void pit_info(PITState *pit)
         printk("pit 0x%x.\n", s->gate);
         printk("pit %"PRId64"\n", pit->count_load_time[i]);
 
-        pt = &pit->pt[i];
-        if ( pt )
-        {
-            printk("pit channel %d has a periodic timer:\n", i);
-            printk("pt %d.\n", pt->enabled);
-            printk("pt %d.\n", pt->one_shot);
-            printk("pt %d.\n", pt->irq);
-            printk("pt %d.\n", pt->first_injected);
-
-            printk("pt %d.\n", pt->pending_intr_nr);
-            printk("pt %d.\n", pt->period);
-            printk("pt %"PRId64"\n", pt->period_cycles);
-            printk("pt %"PRId64"\n", pt->last_plt_gtime);
-        }
-    }
+    }
+
+    pt = &pit->pt0;
+    printk("pit channel 0 periodic timer:\n", i);
+    printk("pt %d.\n", pt->enabled);
+    printk("pt %d.\n", pt->one_shot);
+    printk("pt %d.\n", pt->irq);
+    printk("pt %d.\n", pt->first_injected);
+    printk("pt %d.\n", pt->pending_intr_nr);
+    printk("pt %d.\n", pt->period);
+    printk("pt %"PRId64"\n", pt->period_cycles);
+    printk("pt %"PRId64"\n", pt->last_plt_gtime);
 }
 #else
 static void pit_info(PITState *pit)
@@ -481,11 +477,9 @@ static int pit_load(struct domain *d, hv
     /* Recreate platform timers from hardware state.  There will be some 
      * time jitter here, but the wall-clock will have jumped massively, so 
      * we hope the guest can handle it. */
+    pit->pt0.last_plt_gtime = hvm_get_guest_time(d->vcpu[0]);
     for ( i = 0; i < 3; i++ )
-    {
         pit_load_count(pit, i, pit->hw.channels[i].count);
-        pit->pt[i].last_plt_gtime = hvm_get_guest_time(d->vcpu[0]);
-    }
 
     pit_info(pit);
 
@@ -525,7 +519,7 @@ void pit_deinit(struct domain *d)
 void pit_deinit(struct domain *d)
 {
     PITState *pit = domain_vpit(d);
-    destroy_periodic_time(&pit->pt[0]);
+    destroy_periodic_time(&pit->pt0);
 }
 
 /* the intercept action for PIT DM retval:0--not handled; 1--handled */  
diff -r 74a3ee6e1795 -r ca1085e8ab82 xen/arch/x86/hvm/vioapic.c
--- a/xen/arch/x86/hvm/vioapic.c        Wed Oct 03 15:47:47 2007 +0100
+++ b/xen/arch/x86/hvm/vioapic.c        Wed Oct 03 16:33:23 2007 +0100
@@ -300,8 +300,7 @@ static inline int pit_channel0_enabled(v
 static inline int pit_channel0_enabled(void)
 {
     PITState *pit = &current->domain->arch.hvm_domain.pl_time.vpit;
-    struct periodic_time *pt = &pit->pt[0];
-    return pt->enabled;
+    return pit->pt0.enabled;
 }
 
 static void vioapic_deliver(struct hvm_hw_vioapic *vioapic, int irq)
@@ -517,13 +516,27 @@ static int ioapic_load(struct domain *d,
 
 HVM_REGISTER_SAVE_RESTORE(IOAPIC, ioapic_save, ioapic_load, 1, HVMSR_PER_DOM);
 
-void vioapic_init(struct domain *d)
-{
-    struct hvm_hw_vioapic *vioapic = domain_vioapic(d);
+int vioapic_init(struct domain *d)
+{
+    struct hvm_vioapic *vioapic;
     int i;
 
-    memset(vioapic, 0, sizeof(*vioapic));
+    vioapic = d->arch.hvm_domain.vioapic = xmalloc(struct hvm_vioapic);
+    if ( vioapic == NULL )
+        return -ENOMEM;
+
+    vioapic->domain = d;
+
+    memset(&vioapic->hvm_hw_vioapic, 0, sizeof(vioapic->hvm_hw_vioapic));
     for ( i = 0; i < VIOAPIC_NUM_PINS; i++ )
-        vioapic->redirtbl[i].fields.mask = 1;
-    vioapic->base_address = VIOAPIC_DEFAULT_BASE_ADDRESS;
-}
+        vioapic->hvm_hw_vioapic.redirtbl[i].fields.mask = 1;
+    vioapic->hvm_hw_vioapic.base_address = VIOAPIC_DEFAULT_BASE_ADDRESS;
+
+    return 0;
+}
+
+void vioapic_deinit(struct domain *d)
+{
+    xfree(d->arch.hvm_domain.vioapic);
+    d->arch.hvm_domain.vioapic = NULL;
+}
diff -r 74a3ee6e1795 -r ca1085e8ab82 xen/include/asm-x86/hvm/domain.h
--- a/xen/include/asm-x86/hvm/domain.h  Wed Oct 03 15:47:47 2007 +0100
+++ b/xen/include/asm-x86/hvm/domain.h  Wed Oct 03 16:33:23 2007 +0100
@@ -25,6 +25,7 @@
 #include <asm/hvm/irq.h>
 #include <asm/hvm/vpt.h>
 #include <asm/hvm/vlapic.h>
+#include <asm/hvm/vioapic.h>
 #include <asm/hvm/io.h>
 #include <asm/hvm/iommu.h>
 #include <public/hvm/params.h>
@@ -49,7 +50,7 @@ struct hvm_domain {
     spinlock_t             irq_lock;
     struct hvm_irq         irq;
     struct hvm_hw_vpic     vpic[2]; /* 0=master; 1=slave */
-    struct hvm_hw_vioapic  vioapic;
+    struct hvm_vioapic    *vioapic;
 
     /* hvm_print_line() logging. */
     char                   pbuf[80];
diff -r 74a3ee6e1795 -r ca1085e8ab82 xen/include/asm-x86/hvm/vioapic.h
--- a/xen/include/asm-x86/hvm/vioapic.h Wed Oct 03 15:47:47 2007 +0100
+++ b/xen/include/asm-x86/hvm/vioapic.h Wed Oct 03 16:33:23 2007 +0100
@@ -52,11 +52,17 @@
 #define VIOAPIC_REG_VERSION 0x01
 #define VIOAPIC_REG_ARB_ID  0x02 /* x86 IOAPIC only */
 
-#define domain_vioapic(d) (&(d)->arch.hvm_domain.vioapic)
-#define vioapic_domain(v) (container_of((v), struct domain, \
-                                        arch.hvm_domain.vioapic))
+struct hvm_vioapic {
+    struct hvm_hw_vioapic hvm_hw_vioapic;
+    struct domain *domain;
+};
 
-void vioapic_init(struct domain *d);
+#define domain_vioapic(d) (&(d)->arch.hvm_domain.vioapic->hvm_hw_vioapic)
+#define vioapic_domain(v) (container_of((v), struct hvm_vioapic, \
+                                        hvm_hw_vioapic)->domain)
+
+int vioapic_init(struct domain *d);
+void vioapic_deinit(struct domain *d);
 void vioapic_irq_positive_edge(struct domain *d, unsigned int irq);
 void vioapic_update_EOI(struct domain *d, int vector);
 
diff -r 74a3ee6e1795 -r ca1085e8ab82 xen/include/asm-x86/hvm/vpt.h
--- a/xen/include/asm-x86/hvm/vpt.h     Wed Oct 03 15:47:47 2007 +0100
+++ b/xen/include/asm-x86/hvm/vpt.h     Wed Oct 03 16:33:23 2007 +0100
@@ -95,8 +95,8 @@ typedef struct PITState {
     struct hvm_hw_pit hw;
     /* Last time the counters read zero, for calcuating counter reads */
     int64_t count_load_time[3];
-    /* irq handling */
-    struct periodic_time pt[3];
+    /* Channel 0 IRQ handling. */
+    struct periodic_time pt0;
     spinlock_t lock;
 } PITState;
 

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

<Prev in Thread] Current Thread [Next in Thread>
  • [Xen-changelog] [xen-unstable] hvm: More changes to reduce size of domain structure., Xen patchbot-unstable <=