]> Pileus Git - ~andy/linux/blobdiff - drivers/xen/events.c
xen/events: replace raw bit ops with functions
[~andy/linux] / drivers / xen / events.c
index 4035e833ea2643cb78ca5da68ed5db5037aee11d..fec5da4ff3a0fc2f87e87f59ae616c36851dcf2a 100644 (file)
@@ -334,24 +334,6 @@ static void bind_evtchn_to_cpu(unsigned int chn, unsigned int cpu)
        info_for_irq(irq)->cpu = cpu;
 }
 
-static void init_evtchn_cpu_bindings(void)
-{
-       int i;
-#ifdef CONFIG_SMP
-       struct irq_info *info;
-
-       /* By default all event channels notify CPU#0. */
-       list_for_each_entry(info, &xen_irq_list_head, list) {
-               struct irq_desc *desc = irq_to_desc(info->irq);
-               cpumask_copy(desc->irq_data.affinity, cpumask_of(0));
-       }
-#endif
-
-       for_each_possible_cpu(i)
-               memset(per_cpu(cpu_evtchn_mask, i),
-                      (i == 0) ? ~0 : 0, NR_EVENT_CHANNELS/8);
-}
-
 static inline void clear_evtchn(int port)
 {
        struct shared_info *s = HYPERVISOR_shared_info;
@@ -370,6 +352,12 @@ static inline int test_evtchn(int port)
        return sync_test_bit(port, BM(&s->evtchn_pending[0]));
 }
 
+static inline int test_and_set_mask(int port)
+{
+       struct shared_info *s = HYPERVISOR_shared_info;
+       return sync_test_and_set_bit(port, BM(&s->evtchn_mask[0]));
+}
+
 
 /**
  * notify_remote_via_irq - send event to remote end of event channel via irq
@@ -1511,7 +1499,6 @@ void rebind_evtchn_irq(int evtchn, int irq)
 /* Rebind an evtchn so that it gets delivered to a specific cpu */
 static int rebind_irq_to_cpu(unsigned irq, unsigned tcpu)
 {
-       struct shared_info *s = HYPERVISOR_shared_info;
        struct evtchn_bind_vcpu bind_vcpu;
        int evtchn = evtchn_from_irq(irq);
        int masked;
@@ -1534,7 +1521,7 @@ static int rebind_irq_to_cpu(unsigned irq, unsigned tcpu)
         * Mask the event while changing the VCPU binding to prevent
         * it being delivered on an unexpected VCPU.
         */
-       masked = sync_test_and_set_bit(evtchn, BM(s->evtchn_mask));
+       masked = test_and_set_mask(evtchn);
 
        /*
         * If this fails, it usually just indicates that we're dealing with a
@@ -1558,22 +1545,26 @@ static int set_affinity_irq(struct irq_data *data, const struct cpumask *dest,
        return rebind_irq_to_cpu(data->irq, tcpu);
 }
 
-int resend_irq_on_evtchn(unsigned int irq)
+static int retrigger_evtchn(int evtchn)
 {
-       int masked, evtchn = evtchn_from_irq(irq);
-       struct shared_info *s = HYPERVISOR_shared_info;
+       int masked;
 
        if (!VALID_EVTCHN(evtchn))
-               return 1;
+               return 0;
 
-       masked = sync_test_and_set_bit(evtchn, BM(s->evtchn_mask));
-       sync_set_bit(evtchn, BM(s->evtchn_pending));
+       masked = test_and_set_mask(evtchn);
+       set_evtchn(evtchn);
        if (!masked)
                unmask_evtchn(evtchn);
 
        return 1;
 }
 
+int resend_irq_on_evtchn(unsigned int irq)
+{
+       return retrigger_evtchn(evtchn_from_irq(irq));
+}
+
 static void enable_dynirq(struct irq_data *data)
 {
        int evtchn = evtchn_from_irq(data->irq);
@@ -1608,21 +1599,7 @@ static void mask_ack_dynirq(struct irq_data *data)
 
 static int retrigger_dynirq(struct irq_data *data)
 {
-       int evtchn = evtchn_from_irq(data->irq);
-       struct shared_info *sh = HYPERVISOR_shared_info;
-       int ret = 0;
-
-       if (VALID_EVTCHN(evtchn)) {
-               int masked;
-
-               masked = sync_test_and_set_bit(evtchn, BM(sh->evtchn_mask));
-               sync_set_bit(evtchn, BM(sh->evtchn_pending));
-               if (!masked)
-                       unmask_evtchn(evtchn);
-               ret = 1;
-       }
-
-       return ret;
+       return retrigger_evtchn(evtchn_from_irq(data->irq));
 }
 
 static void restore_pirqs(void)
@@ -1787,8 +1764,6 @@ void xen_irq_resume(void)
        unsigned int cpu, evtchn;
        struct irq_info *info;
 
-       init_evtchn_cpu_bindings();
-
        /* New event-channel space is not 'live' yet. */
        for (evtchn = 0; evtchn < NR_EVENT_CHANNELS; evtchn++)
                mask_evtchn(evtchn);
@@ -1899,8 +1874,6 @@ void __init xen_init_IRQ(void)
        for (i = 0; i < NR_EVENT_CHANNELS; i++)
                evtchn_to_irq[i] = -1;
 
-       init_evtchn_cpu_bindings();
-
        /* No event channels are 'live' right now. */
        for (i = 0; i < NR_EVENT_CHANNELS; i++)
                mask_evtchn(i);