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

Re: [Xen-devel] [patch] make evtchn_upcall_pending arch-specific type



On Sat, 2006-04-01 at 10:30 +0100, Keir Fraser wrote:
> On 1 Apr 2006, at 04:55, Jimi Xenidis wrote:
> 
> >> Before going down this route, what about just casting the field to 
> >> long, since it is actually aligned on a suitable boundary, as it 
> >> happens?
> >
> > We tried that, but to get the right bit we would have to use 56 not 0.
> 
> Actually, evtchn_upcall_pending is touched in very few places in Xen 
> common code. Using bit 56 is not very pretty but should be easy to hide 
> behind a macro? You can hide the cast to long inside the same macro. 
> You already need to arch-dep the event_pending() macro, for your MSR.EE 
> check, and that's one of the main ways in which common code accesses 
> the pending flag.

For reference, here's the PPC implementation:

/* HACK: evtchn_upcall_pending is only a byte, but our atomic instructions only
 * store in 4/8 byte quantities. However, because evtchn_upcall_pending is part
 * of the guest ABI, we can't change its size without breaking backwards
 * compatibility. In this particular case, struct vcpu_info is big enough that
 * we can safely store a full long into it. However, note that bit 0 of that
 * byte is bit 56 when cast to a long.
 */
static inline int evtchn_test_and_set_pending(struct vcpu *v)
{
    unsigned long *l = (unsigned long *)&v->vcpu_info->evtchn_upcall_pending;
    return test_and_set_bit(56, l);
}

You'll notice I added an alignment attribute to that field because it
really really needs to be aligned for us. This has only been
build-tested on x86!

If it's acceptable, please apply.

Hide evtchn_upcall_pending test-and-set accesses behind a wrapper.
Signed-off-by: Hollis Blanchard <hollisb@xxxxxxxxxx>

diff -r aa088739693a xen/common/event_channel.c
--- a/xen/common/event_channel.c        Tue Jun 13 10:48:08 2006 -0500
+++ b/xen/common/event_channel.c        Tue Jun 13 14:52:05 2006 -0500
@@ -494,7 +494,7 @@ void evtchn_set_pending(struct vcpu *v, 
     if ( !test_bit        (port, s->evtchn_mask) &&
          !test_and_set_bit(port / BITS_PER_LONG,
                            &v->vcpu_info->evtchn_pending_sel) &&
-         !test_and_set_bit(0, &v->vcpu_info->evtchn_upcall_pending) )
+         !evtchn_test_and_set_pending(v) )
     {
         evtchn_notify(v);
     }
@@ -683,7 +683,7 @@ static long evtchn_unmask(evtchn_unmask_
          test_bit          (port, s->evtchn_pending) &&
          !test_and_set_bit (port / BITS_PER_LONG,
                             &v->vcpu_info->evtchn_pending_sel) &&
-         !test_and_set_bit (0, &v->vcpu_info->evtchn_upcall_pending) )
+         !evtchn_test_and_set_pending(v) )
     {
         evtchn_notify(v);
     }
diff -r aa088739693a xen/include/asm-ia64/event.h
--- a/xen/include/asm-ia64/event.h      Tue Jun 13 10:48:08 2006 -0500
+++ b/xen/include/asm-ia64/event.h      Tue Jun 13 14:52:05 2006 -0500
@@ -74,4 +74,9 @@ static inline int arch_virq_is_global(in
     return rc;
 }
 
+static inline int evtchn_test_and_set_pending(struct vcpu *v)
+{
+    return test_and_set_bit(0, &v->vcpu_info->evtchn_upcall_pending);
+}
+
 #endif
diff -r aa088739693a xen/include/asm-x86/event.h
--- a/xen/include/asm-x86/event.h       Tue Jun 13 10:48:08 2006 -0500
+++ b/xen/include/asm-x86/event.h       Tue Jun 13 14:52:05 2006 -0500
@@ -55,4 +55,9 @@ static inline int arch_virq_is_global(in
     return 1;
 }
 
+static inline int evtchn_test_and_set_pending(struct vcpu *v)
+{
+    return test_and_set_bit(0, &v->vcpu_info->evtchn_upcall_pending);
+}
+
 #endif
diff -r aa088739693a xen/include/public/xen.h
--- a/xen/include/public/xen.h  Tue Jun 13 10:48:08 2006 -0500
+++ b/xen/include/public/xen.h  Tue Jun 13 14:52:05 2006 -0500
@@ -363,7 +363,7 @@ struct vcpu_info {
      * an upcall activation. The mask is cleared when the VCPU requests
      * to block: this avoids wakeup-waiting races.
      */
-    uint8_t evtchn_upcall_pending;
+    uint8_t evtchn_upcall_pending __attribute__((aligned(sizeof(long))));
     uint8_t evtchn_upcall_mask;
     unsigned long evtchn_pending_sel;
     struct arch_vcpu_info arch;


-- 
Hollis Blanchard
IBM Linux Technology Center


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


 


Rackspace

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