]> xenbits.xensource.com Git - xen.git/commitdiff
[IA64] vti save-restore: fix opt_feature hypercall
authorAlex Williamson <alex.williamson@hp.com>
Tue, 20 Nov 2007 16:11:15 +0000 (09:11 -0700)
committerAlex Williamson <alex.williamson@hp.com>
Tue, 20 Nov 2007 16:11:15 +0000 (09:11 -0700)
- Fix XEN_IA64_OPTF_IDENT_MAP_REG[457] definitions.
- SMP fix. writing to domain->arch.opt_feature is racy.

Signed-off-by: Isaku Yamahata <yamahata@valinux.co.jp>
xen/arch/ia64/xen/domain.c
xen/include/asm-ia64/domain.h
xen/include/public/arch-ia64.h

index 47924a54e03f2e02eb48cae63b2a23273b85892c..d951cca218498b9fa11fc26cc179592438b74358 100644 (file)
@@ -2285,13 +2285,23 @@ optf_set_identity_mapping(unsigned long* mask, struct identity_mapping* im,
        }
 }
 
-/* Switch a optimization feature on/off. */
+/*
+ * Switch an optimization feature on/off.
+ * The vcpu must be paused to avoid racy access to opt_feature.
+ */
 int
 domain_opt_feature(struct xen_ia64_opt_feature* f)
 {
-       struct opt_feature* optf = &(current->domain->arch.opt_feature);
+       struct domain *d = current->domain;
+       struct opt_feature* optf = &d->arch.opt_feature;
+       struct vcpu *v;
        long rc = 0;
 
+       for_each_vcpu(d, v) {
+               if (v != current)
+                       vcpu_pause(v);
+       }
+
        switch (f->cmd) {
        case XEN_IA64_OPTF_IDENT_MAP_REG4:
                optf_set_identity_mapping(&optf->mask, &optf->im_reg4, f);
@@ -2307,6 +2317,12 @@ domain_opt_feature(struct xen_ia64_opt_feature* f)
                rc = -ENOSYS;
                break;
        }
+
+       for_each_vcpu(d, v) {
+               if (v != current)
+                       vcpu_unpause(v);
+       }
+
        return rc;
 }
 
index 91d4d9f709288797f22bd7fae4ac1d396835febb..486696d6790f3e8d2a4678c45e8b609a3adafbc1 100644 (file)
@@ -105,9 +105,15 @@ struct opt_feature {
  * The base XEN_IA64_OPTF_IDENT_MAP_REG7 is defined in public/arch-ia64.h.
  * Identity mapping of region 4 addresses in HVM.
  */
-#define XEN_IA64_OPTF_IDENT_MAP_REG4   (XEN_IA64_OPTF_IDENT_MAP_REG7 + 1)
+#define XEN_IA64_OPTF_IDENT_MAP_REG4_BIT        \
+    (XEN_IA64_OPTF_IDENT_MAP_REG7_BIT + 1)
+#define XEN_IA64_OPTF_IDENT_MAP_REG4            \
+    (1UL << XEN_IA64_OPTF_IDENT_MAP_REG4_BIT)
 /* Identity mapping of region 5 addresses in HVM. */
-#define XEN_IA64_OPTF_IDENT_MAP_REG5   (XEN_IA64_OPTF_IDENT_MAP_REG4 + 1)
+#define XEN_IA64_OPTF_IDENT_MAP_REG5_BIT        \
+    (XEN_IA64_OPTF_IDENT_MAP_REG7_BIT + 2)
+#define XEN_IA64_OPTF_IDENT_MAP_REG5            \
+    (1UL << XEN_IA64_OPTF_IDENT_MAP_REG5_BIT)
 
 /* Set an optimization feature in the struct arch_domain. */
 extern int domain_opt_feature(struct xen_ia64_opt_feature*);
index d197a79bfa8422548d49da4479e265899afd8c16..0895dd0eff39ba822e79b1878c5276a586d439a0 100644 (file)
@@ -674,7 +674,9 @@ DEFINE_XEN_GUEST_HANDLE(xen_ia64_debug_op_t);
  * This is useful in guests using region 7 for identity mapping
  * like the linux kernel does.
  */
-#define XEN_IA64_OPTF_IDENT_MAP_REG7   0x1UL
+#define XEN_IA64_OPTF_IDENT_MAP_REG7_BIT       0
+#define XEN_IA64_OPTF_IDENT_MAP_REG7           \
+       (1UL << XEN_IA64_OPTF_IDENT_MAP_REG7_BIT)
 
 struct xen_ia64_opt_feature {
        unsigned long cmd;              /* Which feature */