# HG changeset patch
# User Keir Fraser <keir.fraser@xxxxxxxxxx>
# Date 1256814894 0
# Node ID f74f0c1ae8ab2ae4b0683856730ac7f1b4283115
# Parent e1fd971ec20ed1299fd7324e3a71305b7f129099
Point per-vcpu vcpu_info at a dummy structure by default, avoiding
need for scattered NULL-pointer checks.
Signed-off-by: Keir Fraser <keir.fraser@xxxxxxxxxx>
---
xen/arch/x86/domain.c | 11 ++---------
xen/common/domain.c | 10 +++++-----
xen/common/event_channel.c | 12 ------------
xen/common/keyhandler.c | 6 ++----
xen/include/asm-x86/shared.h | 4 +---
xen/include/xen/shared.h | 2 ++
6 files changed, 12 insertions(+), 33 deletions(-)
diff -r e1fd971ec20e -r f74f0c1ae8ab xen/arch/x86/domain.c
--- a/xen/arch/x86/domain.c Thu Oct 29 08:34:51 2009 +0000
+++ b/xen/arch/x86/domain.c Thu Oct 29 11:14:54 2009 +0000
@@ -832,7 +832,6 @@ static void
static void
unmap_vcpu_info(struct vcpu *v)
{
- struct domain *d = v->domain;
unsigned long mfn;
if ( v->arch.vcpu_info_mfn == INVALID_MFN )
@@ -841,7 +840,7 @@ unmap_vcpu_info(struct vcpu *v)
mfn = v->arch.vcpu_info_mfn;
unmap_domain_page_global(v->vcpu_info);
- v->vcpu_info = (void *)&shared_info(d, vcpu_info[v->vcpu_id]);
+ v->vcpu_info = &dummy_vcpu_info;
v->arch.vcpu_info_mfn = INVALID_MFN;
put_page_and_type(mfn_to_page(mfn));
@@ -885,13 +884,7 @@ map_vcpu_info(struct vcpu *v, unsigned l
new_info = (vcpu_info_t *)(mapping + offset);
- if ( v->vcpu_info )
- memcpy(new_info, v->vcpu_info, sizeof(*new_info));
- else
- {
- memset(new_info, 0, sizeof(*new_info));
- __vcpu_info(v, new_info, evtchn_upcall_mask) = 1;
- }
+ memcpy(new_info, v->vcpu_info, sizeof(*new_info));
v->vcpu_info = new_info;
v->arch.vcpu_info_mfn = mfn;
diff -r e1fd971ec20e -r f74f0c1ae8ab xen/common/domain.c
--- a/xen/common/domain.c Thu Oct 29 08:34:51 2009 +0000
+++ b/xen/common/domain.c Thu Oct 29 11:14:54 2009 +0000
@@ -87,6 +87,8 @@ struct domain *dom0;
struct vcpu *idle_vcpu[NR_CPUS] __read_mostly;
+vcpu_info_t dummy_vcpu_info;
+
int current_domain_id(void)
{
return current->domain->domain_id;
@@ -154,8 +156,9 @@ struct vcpu *alloc_vcpu(
v->runstate.state = RUNSTATE_offline;
v->runstate.state_entry_time = NOW();
set_bit(_VPF_down, &v->pause_flags);
- if ( vcpu_id < XEN_LEGACY_MAX_VCPUS )
- v->vcpu_info = (void *)&shared_info(d, vcpu_info[vcpu_id]);
+ v->vcpu_info = ((vcpu_id < XEN_LEGACY_MAX_VCPUS)
+ ? (vcpu_info_t *)&shared_info(d, vcpu_info[vcpu_id])
+ : &dummy_vcpu_info);
}
if ( sched_init_vcpu(v, cpu_id) != 0 )
@@ -754,9 +757,6 @@ long do_vcpu_op(int cmd, int vcpuid, XEN
switch ( cmd )
{
case VCPUOP_initialise:
- if ( !v->vcpu_info )
- return -EINVAL;
-
if ( (ctxt = xmalloc(struct vcpu_guest_context)) == NULL )
return -ENOMEM;
diff -r e1fd971ec20e -r f74f0c1ae8ab xen/common/event_channel.c
--- a/xen/common/event_channel.c Thu Oct 29 08:34:51 2009 +0000
+++ b/xen/common/event_channel.c Thu Oct 29 11:14:54 2009 +0000
@@ -244,9 +244,6 @@ static long evtchn_bind_virq(evtchn_bind
((v = d->vcpu[vcpu]) == NULL) )
return -ENOENT;
- if ( unlikely(!v->vcpu_info) )
- return -EAGAIN;
-
spin_lock(&d->event_lock);
if ( v->virq_to_evtchn[virq] != 0 )
@@ -279,9 +276,6 @@ static long evtchn_bind_ipi(evtchn_bind_
if ( (vcpu < 0) || (vcpu >= d->max_vcpus) ||
(d->vcpu[vcpu] == NULL) )
return -ENOENT;
-
- if ( unlikely(!d->vcpu[vcpu]->vcpu_info) )
- return -EAGAIN;
spin_lock(&d->event_lock);
@@ -726,9 +720,6 @@ long evtchn_bind_vcpu(unsigned int port,
if ( (vcpu_id >= d->max_vcpus) || (d->vcpu[vcpu_id] == NULL) )
return -ENOENT;
- if ( unlikely(!d->vcpu[vcpu_id]->vcpu_info) )
- return -EAGAIN;
-
spin_lock(&d->event_lock);
if ( !port_is_valid(d, port) )
@@ -951,9 +942,6 @@ int alloc_unbound_xen_event_channel(
struct evtchn *chn;
struct domain *d = local_vcpu->domain;
int port;
-
- if ( unlikely(!local_vcpu->vcpu_info) )
- return -EAGAIN;
spin_lock(&d->event_lock);
diff -r e1fd971ec20e -r f74f0c1ae8ab xen/common/keyhandler.c
--- a/xen/common/keyhandler.c Thu Oct 29 08:34:51 2009 +0000
+++ b/xen/common/keyhandler.c Thu Oct 29 11:14:54 2009 +0000
@@ -209,8 +209,8 @@ static void dump_domains(unsigned char k
v->vcpu_id, v->processor,
v->is_running ? 'T':'F',
v->pause_flags, v->poll_evtchn,
- v->vcpu_info ? vcpu_info(v, evtchn_upcall_pending) : 0,
- v->vcpu_info ? vcpu_info(v, evtchn_upcall_mask) : 1);
+ vcpu_info(v, evtchn_upcall_pending),
+ vcpu_info(v, evtchn_upcall_mask));
cpuset_print(tmpstr, sizeof(tmpstr), v->vcpu_dirty_cpumask);
printk("dirty_cpus=%s ", tmpstr);
cpuset_print(tmpstr, sizeof(tmpstr), v->cpu_affinity);
@@ -218,8 +218,6 @@ static void dump_domains(unsigned char k
arch_dump_vcpu_info(v);
periodic_timer_print(tmpstr, sizeof(tmpstr), v->periodic_period);
printk(" %s\n", tmpstr);
- if ( !v->vcpu_info )
- continue;
printk(" Notifying guest (virq %d, port %d, stat %d/%d/%d)\n",
VIRQ_DEBUG, v->virq_to_evtchn[VIRQ_DEBUG],
test_bit(v->virq_to_evtchn[VIRQ_DEBUG],
diff -r e1fd971ec20e -r f74f0c1ae8ab xen/include/asm-x86/shared.h
--- a/xen/include/asm-x86/shared.h Thu Oct 29 08:34:51 2009 +0000
+++ b/xen/include/asm-x86/shared.h Thu Oct 29 11:14:54 2009 +0000
@@ -26,8 +26,6 @@ static inline void arch_set_##field(stru
#define GET_SET_VCPU(type, field) \
static inline type arch_get_##field(const struct vcpu *v) \
{ \
- if ( unlikely(!v->vcpu_info) ) \
- return 0; \
return !has_32bit_shinfo(v->domain) ? \
v->vcpu_info->native.arch.field : \
v->vcpu_info->compat.arch.field; \
@@ -59,7 +57,7 @@ static inline void arch_set_##field(stru
#define GET_SET_VCPU(type, field) \
static inline type arch_get_##field(const struct vcpu *v) \
{ \
- return v->vcpu_info ? v->vcpu_info->arch.field : 0; \
+ return v->vcpu_info->arch.field; \
} \
static inline void arch_set_##field(struct vcpu *v, \
type val) \
diff -r e1fd971ec20e -r f74f0c1ae8ab xen/include/xen/shared.h
--- a/xen/include/xen/shared.h Thu Oct 29 08:34:51 2009 +0000
+++ b/xen/include/xen/shared.h Thu Oct 29 11:14:54 2009 +0000
@@ -43,6 +43,8 @@ typedef struct vcpu_info vcpu_info_t;
#endif
+extern vcpu_info_t dummy_vcpu_info;
+
#define shared_info(d, field) __shared_info(d, (d)->shared_info, field)
#define vcpu_info(v, field) __vcpu_info(v, (v)->vcpu_info, field)
_______________________________________________
Xen-changelog mailing list
Xen-changelog@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-changelog
|