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

[Xen-changelog] [xen-unstable] [LINUX] Extend the event-channel interfaces to provide helper methods



# HG changeset patch
# User kaf24@xxxxxxxxxxxxxxxxxxxxx
# Date 1167503007 0
# Node ID d275951acf103aed23293ddc9313d5af5c3406b8
# Parent  63fb88610e1eea29feec1fe32fc96ff63811a6f6
[LINUX] Extend the event-channel interfaces to provide helper methods
for creating interdomain event channels bound to IRQ handlers.
Signed-off-by: Keir Fraser <keir@xxxxxxxxxxxxx>
---
 linux-2.6-xen-sparse/drivers/char/tpm/tpm_xen.c         |   28 +--
 linux-2.6-xen-sparse/drivers/xen/blkback/common.h       |    1 
 linux-2.6-xen-sparse/drivers/xen/blkback/interface.c    |   21 --
 linux-2.6-xen-sparse/drivers/xen/blkfront/blkfront.c    |   17 -
 linux-2.6-xen-sparse/drivers/xen/blkfront/block.h       |    2 
 linux-2.6-xen-sparse/drivers/xen/blktap/common.h        |    1 
 linux-2.6-xen-sparse/drivers/xen/blktap/interface.c     |   21 --
 linux-2.6-xen-sparse/drivers/xen/console/xencons_ring.c |    2 
 linux-2.6-xen-sparse/drivers/xen/core/evtchn.c          |  145 ++++++++++++++--
 linux-2.6-xen-sparse/drivers/xen/fbfront/xenfb.c        |   18 -
 linux-2.6-xen-sparse/drivers/xen/fbfront/xenkbd.c       |   16 -
 linux-2.6-xen-sparse/drivers/xen/netback/common.h       |    1 
 linux-2.6-xen-sparse/drivers/xen/netback/interface.c    |   17 -
 linux-2.6-xen-sparse/drivers/xen/netfront/netfront.c    |   19 --
 linux-2.6-xen-sparse/drivers/xen/pciback/xenbus.c       |   10 -
 linux-2.6-xen-sparse/drivers/xen/tpmback/common.h       |    1 
 linux-2.6-xen-sparse/drivers/xen/tpmback/interface.c    |   21 --
 linux-2.6-xen-sparse/drivers/xen/xenbus/xenbus_client.c |   22 --
 linux-2.6-xen-sparse/drivers/xen/xenbus/xenbus_comms.c  |    2 
 linux-2.6-xen-sparse/include/xen/evtchn.h               |   43 +++-
 linux-2.6-xen-sparse/include/xen/xenbus.h               |    8 
 21 files changed, 225 insertions(+), 191 deletions(-)

diff -r 63fb88610e1e -r d275951acf10 
linux-2.6-xen-sparse/drivers/char/tpm/tpm_xen.c
--- a/linux-2.6-xen-sparse/drivers/char/tpm/tpm_xen.c   Sat Dec 30 15:45:13 
2006 +0000
+++ b/linux-2.6-xen-sparse/drivers/char/tpm/tpm_xen.c   Sat Dec 30 18:23:27 
2006 +0000
@@ -54,7 +54,6 @@ struct tpm_private {
 
        tpmif_tx_interface_t *tx;
        atomic_t refcnt;
-       unsigned int evtchn;
        unsigned int irq;
        u8 is_connected;
        u8 is_suspended;
@@ -271,7 +270,7 @@ static void destroy_tpmring(struct tpm_p
        if (tp->irq)
                unbind_from_irqhandler(tp->irq, tp);
 
-       tp->evtchn = tp->irq = 0;
+       tp->irq = 0;
 }
 
 
@@ -302,8 +301,8 @@ again:
                goto abort_transaction;
        }
 
-       err = xenbus_printf(xbt, dev->nodename,
-                           "event-channel", "%u", tp->evtchn);
+       err = xenbus_printf(xbt, dev->nodename, "event-channel", "%u",
+                           irq_to_evtchn_port(tp->irq));
        if (err) {
                message = "writing event-channel";
                goto abort_transaction;
@@ -459,19 +458,15 @@ static int tpmif_connect(struct xenbus_d
 
        tp->backend_id = domid;
 
-       err = xenbus_alloc_evtchn(dev, &tp->evtchn);
-       if (err)
+       err = bind_listening_port_to_irqhandler(
+               domid, tpmif_int, SA_SAMPLE_RANDOM, "tpmif", tp);
+       if (err <= 0) {
+               WPRINTK("bind_listening_port_to_irqhandler failed "
+                       "(err=%d)\n", err);
                return err;
-
-       err = bind_evtchn_to_irqhandler(tp->evtchn,
-                                       tpmif_int, SA_SAMPLE_RANDOM, "tpmif",
-                                       tp);
-       if (err <= 0) {
-               WPRINTK("bind_evtchn_to_irqhandler failed (err=%d)\n", err);
-               return err;
-       }
-
+       }
        tp->irq = err;
+
        return 0;
 }
 
@@ -656,9 +651,6 @@ static int tpm_xmit(struct tpm_private *
 
        mb();
 
-       DPRINTK("Notifying backend via event channel %d\n",
-               tp->evtchn);
-
        notify_remote_via_irq(tp->irq);
 
        spin_unlock_irq(&tp->tx_lock);
diff -r 63fb88610e1e -r d275951acf10 
linux-2.6-xen-sparse/drivers/xen/blkback/common.h
--- a/linux-2.6-xen-sparse/drivers/xen/blkback/common.h Sat Dec 30 15:45:13 
2006 +0000
+++ b/linux-2.6-xen-sparse/drivers/xen/blkback/common.h Sat Dec 30 18:23:27 
2006 +0000
@@ -65,7 +65,6 @@ typedef struct blkif_st {
        domid_t           domid;
        unsigned int      handle;
        /* Physical parameters of the comms window. */
-       unsigned int      evtchn;
        unsigned int      irq;
        /* Comms information. */
        blkif_back_ring_t blk_ring;
diff -r 63fb88610e1e -r d275951acf10 
linux-2.6-xen-sparse/drivers/xen/blkback/interface.c
--- a/linux-2.6-xen-sparse/drivers/xen/blkback/interface.c      Sat Dec 30 
15:45:13 2006 +0000
+++ b/linux-2.6-xen-sparse/drivers/xen/blkback/interface.c      Sat Dec 30 
18:23:27 2006 +0000
@@ -97,7 +97,6 @@ int blkif_map(blkif_t *blkif, unsigned l
 {
        blkif_sring_t *sring;
        int err;
-       struct evtchn_bind_interdomain bind_interdomain;
 
        /* Already connected through? */
        if (blkif->irq)
@@ -112,24 +111,18 @@ int blkif_map(blkif_t *blkif, unsigned l
                return err;
        }
 
-       bind_interdomain.remote_dom  = blkif->domid;
-       bind_interdomain.remote_port = evtchn;
+       sring = (blkif_sring_t *)blkif->blk_ring_area->addr;
+       BACK_RING_INIT(&blkif->blk_ring, sring, PAGE_SIZE);
 
-       err = HYPERVISOR_event_channel_op(EVTCHNOP_bind_interdomain,
-                                         &bind_interdomain);
-       if (err) {
+       err = bind_interdomain_evtchn_to_irqhandler(
+               blkif->domid, evtchn, blkif_be_int, 0, "blkif-backend", blkif);
+       if (err < 0)
+       {
                unmap_frontend_page(blkif);
                free_vm_area(blkif->blk_ring_area);
                return err;
        }
-
-       blkif->evtchn = bind_interdomain.local_port;
-
-       sring = (blkif_sring_t *)blkif->blk_ring_area->addr;
-       BACK_RING_INIT(&blkif->blk_ring, sring, PAGE_SIZE);
-
-       blkif->irq = bind_evtchn_to_irqhandler(
-               blkif->evtchn, blkif_be_int, 0, "blkif-backend", blkif);
+       blkif->irq = err;
 
        return 0;
 }
diff -r 63fb88610e1e -r d275951acf10 
linux-2.6-xen-sparse/drivers/xen/blkfront/blkfront.c
--- a/linux-2.6-xen-sparse/drivers/xen/blkfront/blkfront.c      Sat Dec 30 
15:45:13 2006 +0000
+++ b/linux-2.6-xen-sparse/drivers/xen/blkfront/blkfront.c      Sat Dec 30 
18:23:27 2006 +0000
@@ -174,8 +174,8 @@ again:
                message = "writing ring-ref";
                goto abort_transaction;
        }
-       err = xenbus_printf(xbt, dev->nodename,
-                           "event-channel", "%u", info->evtchn);
+       err = xenbus_printf(xbt, dev->nodename, "event-channel", "%u",
+                           irq_to_evtchn_port(info->irq));
        if (err) {
                message = "writing event-channel";
                goto abort_transaction;
@@ -228,15 +228,11 @@ static int setup_blkring(struct xenbus_d
        }
        info->ring_ref = err;
 
-       err = xenbus_alloc_evtchn(dev, &info->evtchn);
-       if (err)
-               goto fail;
-
-       err = bind_evtchn_to_irqhandler(
-               info->evtchn, blkif_int, SA_SAMPLE_RANDOM, "blkif", info);
+       err = bind_listening_port_to_irqhandler(
+               dev->otherend_id, blkif_int, SA_SAMPLE_RANDOM, "blkif", info);
        if (err <= 0) {
                xenbus_dev_fatal(dev, err,
-                                "bind_evtchn_to_irqhandler failed");
+                                "bind_listening_port_to_irqhandler");
                goto fail;
        }
        info->irq = err;
@@ -775,8 +771,7 @@ static void blkif_free(struct blkfront_i
        }
        if (info->irq)
                unbind_from_irqhandler(info->irq, info);
-       info->evtchn = info->irq = 0;
-
+       info->irq = 0;
 }
 
 static void blkif_completion(struct blk_shadow *s)
diff -r 63fb88610e1e -r d275951acf10 
linux-2.6-xen-sparse/drivers/xen/blkfront/block.h
--- a/linux-2.6-xen-sparse/drivers/xen/blkfront/block.h Sat Dec 30 15:45:13 
2006 +0000
+++ b/linux-2.6-xen-sparse/drivers/xen/blkfront/block.h Sat Dec 30 18:23:27 
2006 +0000
@@ -119,7 +119,7 @@ struct blkfront_info
        int connected;
        int ring_ref;
        blkif_front_ring_t ring;
-       unsigned int evtchn, irq;
+       unsigned int irq;
        struct xlbd_major_info *mi;
        request_queue_t *rq;
        struct work_struct work;
diff -r 63fb88610e1e -r d275951acf10 
linux-2.6-xen-sparse/drivers/xen/blktap/common.h
--- a/linux-2.6-xen-sparse/drivers/xen/blktap/common.h  Sat Dec 30 15:45:13 
2006 +0000
+++ b/linux-2.6-xen-sparse/drivers/xen/blktap/common.h  Sat Dec 30 18:23:27 
2006 +0000
@@ -56,7 +56,6 @@ typedef struct blkif_st {
        domid_t           domid;
        unsigned int      handle;
        /* Physical parameters of the comms window. */
-       unsigned int      evtchn;
        unsigned int      irq;
        /* Comms information. */
        blkif_back_ring_t blk_ring;
diff -r 63fb88610e1e -r d275951acf10 
linux-2.6-xen-sparse/drivers/xen/blktap/interface.c
--- a/linux-2.6-xen-sparse/drivers/xen/blktap/interface.c       Sat Dec 30 
15:45:13 2006 +0000
+++ b/linux-2.6-xen-sparse/drivers/xen/blktap/interface.c       Sat Dec 30 
18:23:27 2006 +0000
@@ -98,7 +98,6 @@ int tap_blkif_map(blkif_t *blkif, unsign
 {
        blkif_sring_t *sring;
        int err;
-       struct evtchn_bind_interdomain bind_interdomain;
 
        /* Already connected through? */
        if (blkif->irq)
@@ -113,24 +112,18 @@ int tap_blkif_map(blkif_t *blkif, unsign
                return err;
        }
 
-       bind_interdomain.remote_dom  = blkif->domid;
-       bind_interdomain.remote_port = evtchn;
+       sring = (blkif_sring_t *)blkif->blk_ring_area->addr;
+       BACK_RING_INIT(&blkif->blk_ring, sring, PAGE_SIZE);
 
-       err = HYPERVISOR_event_channel_op(EVTCHNOP_bind_interdomain,
-                                         &bind_interdomain);
-       if (err) {
+       err = bind_interdomain_evtchn_to_irqhandler(
+               blkif->domid, evtchn, tap_blkif_be_int,
+               0, "blkif-backend", blkif);
+       if (err < 0) {
                unmap_frontend_page(blkif);
                free_vm_area(blkif->blk_ring_area);
                return err;
        }
-
-       blkif->evtchn = bind_interdomain.local_port;
-
-       sring = (blkif_sring_t *)blkif->blk_ring_area->addr;
-       BACK_RING_INIT(&blkif->blk_ring, sring, PAGE_SIZE);
-
-       blkif->irq = bind_evtchn_to_irqhandler(
-               blkif->evtchn, tap_blkif_be_int, 0, "blkif-backend", blkif);
+       blkif->irq = err;
 
        return 0;
 }
diff -r 63fb88610e1e -r d275951acf10 
linux-2.6-xen-sparse/drivers/xen/console/xencons_ring.c
--- a/linux-2.6-xen-sparse/drivers/xen/console/xencons_ring.c   Sat Dec 30 
15:45:13 2006 +0000
+++ b/linux-2.6-xen-sparse/drivers/xen/console/xencons_ring.c   Sat Dec 30 
18:23:27 2006 +0000
@@ -121,7 +121,7 @@ int xencons_ring_init(void)
            !xen_start_info->console.domU.evtchn)
                return -ENODEV;
 
-       irq = bind_evtchn_to_irqhandler(
+       irq = bind_caller_port_to_irqhandler(
                xen_start_info->console.domU.evtchn,
                handle_input, 0, "xencons", NULL);
        if (irq < 0) {
diff -r 63fb88610e1e -r d275951acf10 
linux-2.6-xen-sparse/drivers/xen/core/evtchn.c
--- a/linux-2.6-xen-sparse/drivers/xen/core/evtchn.c    Sat Dec 30 15:45:13 
2006 +0000
+++ b/linux-2.6-xen-sparse/drivers/xen/core/evtchn.c    Sat Dec 30 18:23:27 
2006 +0000
@@ -61,7 +61,14 @@ static u32 irq_info[NR_IRQS];
 static u32 irq_info[NR_IRQS];
 
 /* Binding types. */
-enum { IRQT_UNBOUND, IRQT_PIRQ, IRQT_VIRQ, IRQT_IPI, IRQT_EVTCHN };
+enum {
+       IRQT_UNBOUND,
+       IRQT_PIRQ,
+       IRQT_VIRQ,
+       IRQT_IPI,
+       IRQT_LOCAL_PORT,
+       IRQT_CALLER_PORT
+};
 
 /* Constructor for packed IRQ information. */
 static inline u32 mk_irq_info(u32 type, u32 index, u32 evtchn)
@@ -275,18 +282,18 @@ static int find_unbound_irq(void)
        return -ENOSPC;
 }
 
-static int bind_evtchn_to_irq(unsigned int evtchn)
+static int bind_caller_port_to_irq(unsigned int caller_port)
 {
        int irq;
 
        spin_lock(&irq_mapping_update_lock);
 
-       if ((irq = evtchn_to_irq[evtchn]) == -1) {
+       if ((irq = evtchn_to_irq[caller_port]) == -1) {
                if ((irq = find_unbound_irq()) < 0)
                        goto out;
 
-               evtchn_to_irq[evtchn] = irq;
-               irq_info[irq] = mk_irq_info(IRQT_EVTCHN, 0, evtchn);
+               evtchn_to_irq[caller_port] = irq;
+               irq_info[irq] = mk_irq_info(IRQT_CALLER_PORT, 0, caller_port);
        }
 
        irq_bindcount[irq]++;
@@ -294,6 +301,59 @@ static int bind_evtchn_to_irq(unsigned i
  out:
        spin_unlock(&irq_mapping_update_lock);
        return irq;
+}
+
+static int bind_local_port_to_irq(unsigned int local_port)
+{
+       int irq;
+
+       spin_lock(&irq_mapping_update_lock);
+
+       BUG_ON(evtchn_to_irq[local_port] != -1);
+
+       if ((irq = find_unbound_irq()) < 0) {
+               struct evtchn_close close = { .port = local_port };
+               if (HYPERVISOR_event_channel_op(EVTCHNOP_close, &close))
+                       BUG();
+               goto out;
+       }
+
+       evtchn_to_irq[local_port] = irq;
+       irq_info[irq] = mk_irq_info(IRQT_LOCAL_PORT, 0, local_port);
+       irq_bindcount[irq]++;
+
+ out:
+       spin_unlock(&irq_mapping_update_lock);
+       return irq;
+}
+
+static int bind_listening_port_to_irq(unsigned int remote_domain)
+{
+       struct evtchn_alloc_unbound alloc_unbound;
+       int err;
+
+       alloc_unbound.dom        = DOMID_SELF;
+       alloc_unbound.remote_dom = remote_domain;
+
+       err = HYPERVISOR_event_channel_op(EVTCHNOP_alloc_unbound,
+                                         &alloc_unbound);
+
+       return err ? : bind_local_port_to_irq(alloc_unbound.port);
+}
+
+static int bind_interdomain_evtchn_to_irq(unsigned int remote_domain,
+                                         unsigned int remote_port)
+{
+       struct evtchn_bind_interdomain bind_interdomain;
+       int err;
+
+       bind_interdomain.remote_dom  = remote_domain;
+       bind_interdomain.remote_port = remote_port;
+
+       err = HYPERVISOR_event_channel_op(EVTCHNOP_bind_interdomain,
+                                         &bind_interdomain);
+
+       return err ? : bind_local_port_to_irq(bind_interdomain.local_port);
 }
 
 static int bind_virq_to_irq(unsigned int virq, unsigned int cpu)
@@ -370,7 +430,8 @@ static void unbind_from_irq(unsigned int
 
        if ((--irq_bindcount[irq] == 0) && VALID_EVTCHN(evtchn)) {
                close.port = evtchn;
-               if (HYPERVISOR_event_channel_op(EVTCHNOP_close, &close) != 0)
+               if ((type_from_irq(irq) != IRQT_CALLER_PORT) &&
+                   HYPERVISOR_event_channel_op(EVTCHNOP_close, &close))
                        BUG();
 
                switch (type_from_irq(irq)) {
@@ -396,17 +457,16 @@ static void unbind_from_irq(unsigned int
        spin_unlock(&irq_mapping_update_lock);
 }
 
-int bind_evtchn_to_irqhandler(
-       unsigned int evtchn,
+int bind_caller_port_to_irqhandler(
+       unsigned int caller_port,
        irqreturn_t (*handler)(int, void *, struct pt_regs *),
        unsigned long irqflags,
        const char *devname,
        void *dev_id)
 {
-       unsigned int irq;
-       int retval;
-
-       irq = bind_evtchn_to_irq(evtchn);
+       int irq, retval;
+
+       irq = bind_caller_port_to_irq(caller_port);
        if (irq < 0)
                return irq;
 
@@ -418,7 +478,54 @@ int bind_evtchn_to_irqhandler(
 
        return irq;
 }
-EXPORT_SYMBOL_GPL(bind_evtchn_to_irqhandler);
+EXPORT_SYMBOL_GPL(bind_caller_port_to_irqhandler);
+
+int bind_listening_port_to_irqhandler(
+       unsigned int remote_domain,
+       irqreturn_t (*handler)(int, void *, struct pt_regs *),
+       unsigned long irqflags,
+       const char *devname,
+       void *dev_id)
+{
+       int irq, retval;
+
+       irq = bind_listening_port_to_irq(remote_domain);
+       if (irq < 0)
+               return irq;
+
+       retval = request_irq(irq, handler, irqflags, devname, dev_id);
+       if (retval != 0) {
+               unbind_from_irq(irq);
+               return retval;
+       }
+
+       return irq;
+}
+EXPORT_SYMBOL_GPL(bind_listening_port_to_irqhandler);
+
+int bind_interdomain_evtchn_to_irqhandler(
+       unsigned int remote_domain,
+       unsigned int remote_port,
+       irqreturn_t (*handler)(int, void *, struct pt_regs *),
+       unsigned long irqflags,
+       const char *devname,
+       void *dev_id)
+{
+       int irq, retval;
+
+       irq = bind_interdomain_evtchn_to_irq(remote_domain, remote_port);
+       if (irq < 0)
+               return irq;
+
+       retval = request_irq(irq, handler, irqflags, devname, dev_id);
+       if (retval != 0) {
+               unbind_from_irq(irq);
+               return retval;
+       }
+
+       return irq;
+}
+EXPORT_SYMBOL_GPL(bind_interdomain_evtchn_to_irqhandler);
 
 int bind_virq_to_irqhandler(
        unsigned int virq,
@@ -428,8 +535,7 @@ int bind_virq_to_irqhandler(
        const char *devname,
        void *dev_id)
 {
-       unsigned int irq;
-       int retval;
+       int irq, retval;
 
        irq = bind_virq_to_irq(virq, cpu);
        if (irq < 0)
@@ -453,8 +559,7 @@ int bind_ipi_to_irqhandler(
        const char *devname,
        void *dev_id)
 {
-       unsigned int irq;
-       int retval;
+       int irq, retval;
 
        irq = bind_ipi_to_irq(ipi, cpu);
        if (irq < 0)
@@ -729,6 +834,12 @@ void notify_remote_via_irq(int irq)
 }
 EXPORT_SYMBOL_GPL(notify_remote_via_irq);
 
+int irq_to_evtchn_port(int irq)
+{
+       return evtchn_from_irq(irq);
+}
+EXPORT_SYMBOL_GPL(irq_to_evtchn_port);
+
 void mask_evtchn(int port)
 {
        shared_info_t *s = HYPERVISOR_shared_info;
diff -r 63fb88610e1e -r d275951acf10 
linux-2.6-xen-sparse/drivers/xen/fbfront/xenfb.c
--- a/linux-2.6-xen-sparse/drivers/xen/fbfront/xenfb.c  Sat Dec 30 15:45:13 
2006 +0000
+++ b/linux-2.6-xen-sparse/drivers/xen/fbfront/xenfb.c  Sat Dec 30 18:23:27 
2006 +0000
@@ -56,7 +56,6 @@ struct xenfb_info
        struct page             **pages;
        struct list_head        mappings; /* protected by mm_lock */
 
-       unsigned                evtchn;
        int                     irq;
        struct xenfb_page       *page;
        unsigned long           *mfns;
@@ -156,7 +155,7 @@ static void xenfb_do_update(struct xenfb
        wmb();                  /* ensure ring contents visible */
        info->page->out_prod = prod + 1;
 
-       notify_remote_via_evtchn(info->evtchn);
+       notify_remote_via_irq(info->irq);
 }
 
 static int xenfb_queue_full(struct xenfb_info *info)
@@ -429,7 +428,7 @@ static irqreturn_t xenfb_event_handler(i
 
        if (page->in_cons != page->in_prod) {
                info->page->in_cons = info->page->in_prod;
-               notify_remote_via_evtchn(info->evtchn);
+               notify_remote_via_irq(info->irq);
        }
        return IRQ_HANDLED;
 }
@@ -618,14 +617,11 @@ static int xenfb_connect_backend(struct 
        int ret;
        struct xenbus_transaction xbt;
 
-       ret = xenbus_alloc_evtchn(dev, &info->evtchn);
-       if (ret)
-               return ret;
-       ret = bind_evtchn_to_irqhandler(info->evtchn, xenfb_event_handler,
-                                       0, "xenfb", info);
+       ret = bind_listening_port_to_irqhandler(
+               dev->otherend_id, xenfb_event_handler, 0, "xenfb", info);
        if (ret < 0) {
-               xenbus_free_evtchn(dev, info->evtchn);
-               xenbus_dev_fatal(dev, ret, "bind_evtchn_to_irqhandler");
+               xenbus_dev_fatal(dev, ret,
+                                "bind_listening_port_to_irqhandler");
                return ret;
        }
        info->irq = ret;
@@ -641,7 +637,7 @@ static int xenfb_connect_backend(struct 
        if (ret)
                goto error_xenbus;
        ret = xenbus_printf(xbt, dev->nodename, "event-channel", "%u",
-                           info->evtchn);
+                           irq_to_evtchn_port(info->irq));
        if (ret)
                goto error_xenbus;
        ret = xenbus_printf(xbt, dev->nodename, "feature-update", "1");
diff -r 63fb88610e1e -r d275951acf10 
linux-2.6-xen-sparse/drivers/xen/fbfront/xenkbd.c
--- a/linux-2.6-xen-sparse/drivers/xen/fbfront/xenkbd.c Sat Dec 30 15:45:13 
2006 +0000
+++ b/linux-2.6-xen-sparse/drivers/xen/fbfront/xenkbd.c Sat Dec 30 18:23:27 
2006 +0000
@@ -31,7 +31,6 @@ struct xenkbd_info
 {
        struct input_dev *dev;
        struct xenkbd_page *page;
-       unsigned evtchn;
        int irq;
        struct xenbus_device *xbdev;
 };
@@ -76,7 +75,7 @@ static irqreturn_t input_handler(int rq,
        input_sync(info->dev);
        mb();                   /* ensure we got ring contents */
        page->in_cons = cons;
-       notify_remote_via_evtchn(info->evtchn);
+       notify_remote_via_irq(info->irq);
 
        return IRQ_HANDLED;
 }
@@ -168,14 +167,11 @@ static int xenkbd_connect_backend(struct
        int ret;
        struct xenbus_transaction xbt;
 
-       ret = xenbus_alloc_evtchn(dev, &info->evtchn);
-       if (ret)
-               return ret;
-       ret = bind_evtchn_to_irqhandler(info->evtchn, input_handler, 0,
-                                       "xenkbd", info);
+       ret = bind_listening_port_to_irqhandler(
+               dev->otherend_id, input_handler, 0, "xenkbd", info);
        if (ret < 0) {
-               xenbus_free_evtchn(dev, info->evtchn);
-               xenbus_dev_fatal(dev, ret, "bind_evtchn_to_irqhandler");
+               xenbus_dev_fatal(dev, ret,
+                                "bind_listening_port_to_irqhandler");
                return ret;
        }
        info->irq = ret;
@@ -191,7 +187,7 @@ static int xenkbd_connect_backend(struct
        if (ret)
                goto error_xenbus;
        ret = xenbus_printf(xbt, dev->nodename, "event-channel", "%u",
-                           info->evtchn);
+                           irq_to_evtchn_port(info->irq));
        if (ret)
                goto error_xenbus;
        ret = xenbus_transaction_end(xbt, 0);
diff -r 63fb88610e1e -r d275951acf10 
linux-2.6-xen-sparse/drivers/xen/netback/common.h
--- a/linux-2.6-xen-sparse/drivers/xen/netback/common.h Sat Dec 30 15:45:13 
2006 +0000
+++ b/linux-2.6-xen-sparse/drivers/xen/netback/common.h Sat Dec 30 18:23:27 
2006 +0000
@@ -67,7 +67,6 @@ typedef struct netif_st {
        grant_ref_t      tx_shmem_ref;
        grant_handle_t   rx_shmem_handle;
        grant_ref_t      rx_shmem_ref;
-       unsigned int     evtchn;
        unsigned int     irq;
 
        /* The shared rings and indexes. */
diff -r 63fb88610e1e -r d275951acf10 
linux-2.6-xen-sparse/drivers/xen/netback/interface.c
--- a/linux-2.6-xen-sparse/drivers/xen/netback/interface.c      Sat Dec 30 
15:45:13 2006 +0000
+++ b/linux-2.6-xen-sparse/drivers/xen/netback/interface.c      Sat Dec 30 
18:23:27 2006 +0000
@@ -259,7 +259,6 @@ int netif_map(netif_t *netif, unsigned l
        int err = -ENOMEM;
        netif_tx_sring_t *txs;
        netif_rx_sring_t *rxs;
-       struct evtchn_bind_interdomain bind_interdomain;
 
        /* Already connected through? */
        if (netif->irq)
@@ -276,18 +275,12 @@ int netif_map(netif_t *netif, unsigned l
        if (err)
                goto err_map;
 
-       bind_interdomain.remote_dom = netif->domid;
-       bind_interdomain.remote_port = evtchn;
-
-       err = HYPERVISOR_event_channel_op(EVTCHNOP_bind_interdomain,
-                                         &bind_interdomain);
-       if (err)
+       err = bind_interdomain_evtchn_to_irqhandler(
+               netif->domid, evtchn, netif_be_int, 0,
+               netif->dev->name, netif);
+       if (err < 0)
                goto err_hypervisor;
-
-       netif->evtchn = bind_interdomain.local_port;
-
-       netif->irq = bind_evtchn_to_irqhandler(
-               netif->evtchn, netif_be_int, 0, netif->dev->name, netif);
+       netif->irq = err;
        disable_irq(netif->irq);
 
        txs = (netif_tx_sring_t *)netif->tx_comms_area->addr;
diff -r 63fb88610e1e -r d275951acf10 
linux-2.6-xen-sparse/drivers/xen/netfront/netfront.c
--- a/linux-2.6-xen-sparse/drivers/xen/netfront/netfront.c      Sat Dec 30 
15:45:13 2006 +0000
+++ b/linux-2.6-xen-sparse/drivers/xen/netfront/netfront.c      Sat Dec 30 
18:23:27 2006 +0000
@@ -153,7 +153,7 @@ struct netfront_info {
        spinlock_t   tx_lock;
        spinlock_t   rx_lock;
 
-       unsigned int evtchn, irq;
+       unsigned int irq;
        unsigned int copying_receiver;
 
        /* Receive-ring batched refills. */
@@ -408,7 +408,8 @@ again:
                goto abort_transaction;
        }
        err = xenbus_printf(xbt, dev->nodename,
-                           "event-channel", "%u", info->evtchn);
+                           "event-channel", "%u",
+                           irq_to_evtchn_port(info->irq));
        if (err) {
                message = "writing event-channel";
                goto abort_transaction;
@@ -513,17 +514,15 @@ static int setup_device(struct xenbus_de
        }
        info->rx_ring_ref = err;
 
-       err = xenbus_alloc_evtchn(dev, &info->evtchn);
-       if (err)
-               goto fail;
-
        memcpy(netdev->dev_addr, info->mac, ETH_ALEN);
-       err = bind_evtchn_to_irqhandler(info->evtchn, netif_int,
-                                       SA_SAMPLE_RANDOM, netdev->name,
-                                       netdev);
+
+       err = bind_listening_port_to_irqhandler(
+               dev->otherend_id, netif_int, SA_SAMPLE_RANDOM, netdev->name,
+               netdev);
        if (err < 0)
                goto fail;
        info->irq = err;
+
        return 0;
 
  fail:
@@ -2029,7 +2028,7 @@ static void netif_disconnect_backend(str
 
        if (info->irq)
                unbind_from_irqhandler(info->irq, info->netdev);
-       info->evtchn = info->irq = 0;
+       info->irq = 0;
 
        end_access(info->tx_ring_ref, info->tx.sring);
        end_access(info->rx_ring_ref, info->rx.sring);
diff -r 63fb88610e1e -r d275951acf10 
linux-2.6-xen-sparse/drivers/xen/pciback/xenbus.c
--- a/linux-2.6-xen-sparse/drivers/xen/pciback/xenbus.c Sat Dec 30 15:45:13 
2006 +0000
+++ b/linux-2.6-xen-sparse/drivers/xen/pciback/xenbus.c Sat Dec 30 18:23:27 
2006 +0000
@@ -71,7 +71,6 @@ static int pciback_do_attach(struct pcib
                             int remote_evtchn)
 {
        int err = 0;
-       int evtchn;
        struct vm_struct *area;
 
        dev_dbg(&pdev->xdev->dev,
@@ -86,12 +85,9 @@ static int pciback_do_attach(struct pcib
        pdev->sh_area = area;
        pdev->sh_info = area->addr;
 
-       err = xenbus_bind_evtchn(pdev->xdev, remote_evtchn, &evtchn);
-       if (err)
-               goto out;
-
-       err = bind_evtchn_to_irqhandler(evtchn, pciback_handle_event,
-                                       SA_SAMPLE_RANDOM, "pciback", pdev);
+       err = bind_interdomain_evtchn_to_irqhandler(
+               pdev->xdev->otherend_id, remote_evtchn, pciback_handle_event,
+               SA_SAMPLE_RANDOM, "pciback", pdev);
        if (err < 0) {
                xenbus_dev_fatal(pdev->xdev, err,
                                 "Error binding event channel to IRQ");
diff -r 63fb88610e1e -r d275951acf10 
linux-2.6-xen-sparse/drivers/xen/tpmback/common.h
--- a/linux-2.6-xen-sparse/drivers/xen/tpmback/common.h Sat Dec 30 15:45:13 
2006 +0000
+++ b/linux-2.6-xen-sparse/drivers/xen/tpmback/common.h Sat Dec 30 18:23:27 
2006 +0000
@@ -30,7 +30,6 @@ typedef struct tpmif_st {
        unsigned int handle;
 
        /* Physical parameters of the comms window. */
-       unsigned int evtchn;
        unsigned int irq;
 
        /* The shared rings and indexes. */
diff -r 63fb88610e1e -r d275951acf10 
linux-2.6-xen-sparse/drivers/xen/tpmback/interface.c
--- a/linux-2.6-xen-sparse/drivers/xen/tpmback/interface.c      Sat Dec 30 
15:45:13 2006 +0000
+++ b/linux-2.6-xen-sparse/drivers/xen/tpmback/interface.c      Sat Dec 30 
18:23:27 2006 +0000
@@ -118,11 +118,9 @@ int tpmif_map(tpmif_t *tpmif, unsigned l
 int tpmif_map(tpmif_t *tpmif, unsigned long shared_page, unsigned int evtchn)
 {
        int err;
-       struct evtchn_bind_interdomain bind_interdomain;
 
-       if (tpmif->irq) {
+       if (tpmif->irq)
                return 0;
-       }
 
        if ((tpmif->tx_area = alloc_vm_area(PAGE_SIZE)) == NULL)
                return -ENOMEM;
@@ -133,24 +131,17 @@ int tpmif_map(tpmif_t *tpmif, unsigned l
                return err;
        }
 
+       tpmif->tx = (tpmif_tx_interface_t *)tpmif->tx_area->addr;
 
-       bind_interdomain.remote_dom  = tpmif->domid;
-       bind_interdomain.remote_port = evtchn;
-
-       err = HYPERVISOR_event_channel_op(EVTCHNOP_bind_interdomain,
-                                         &bind_interdomain);
-       if (err) {
+       err = bind_interdomain_evtchn_to_irqhandler(
+               tpmif->domid, evtchn, tpmif_be_int, 0, tpmif->devname, tpmif);
+       if (err < 0) {
                unmap_frontend_page(tpmif);
                free_vm_area(tpmif->tx_area);
                return err;
        }
+       tpmif->irq = err;
 
-       tpmif->evtchn = bind_interdomain.local_port;
-
-       tpmif->tx = (tpmif_tx_interface_t *)tpmif->tx_area->addr;
-
-       tpmif->irq = bind_evtchn_to_irqhandler(
-               tpmif->evtchn, tpmif_be_int, 0, tpmif->devname, tpmif);
        tpmif->shmem_ref = shared_page;
        tpmif->active = 1;
 
diff -r 63fb88610e1e -r d275951acf10 
linux-2.6-xen-sparse/drivers/xen/xenbus/xenbus_client.c
--- a/linux-2.6-xen-sparse/drivers/xen/xenbus/xenbus_client.c   Sat Dec 30 
15:45:13 2006 +0000
+++ b/linux-2.6-xen-sparse/drivers/xen/xenbus/xenbus_client.c   Sat Dec 30 
18:23:27 2006 +0000
@@ -254,28 +254,6 @@ EXPORT_SYMBOL_GPL(xenbus_alloc_evtchn);
 EXPORT_SYMBOL_GPL(xenbus_alloc_evtchn);
 
 
-int xenbus_bind_evtchn(struct xenbus_device *dev, int remote_port, int *port)
-{
-       struct evtchn_bind_interdomain bind_interdomain;
-       int err;
-
-       bind_interdomain.remote_dom  = dev->otherend_id;
-       bind_interdomain.remote_port = remote_port,
-
-       err = HYPERVISOR_event_channel_op(EVTCHNOP_bind_interdomain,
-                                         &bind_interdomain);
-       if (err)
-               xenbus_dev_fatal(dev, err,
-                                "binding to event channel %d from domain %d",
-                                remote_port, dev->otherend_id);
-       else
-               *port = bind_interdomain.local_port;
-
-       return err;
-}
-EXPORT_SYMBOL_GPL(xenbus_bind_evtchn);
-
-
 int xenbus_free_evtchn(struct xenbus_device *dev, int port)
 {
        struct evtchn_close close;
diff -r 63fb88610e1e -r d275951acf10 
linux-2.6-xen-sparse/drivers/xen/xenbus/xenbus_comms.c
--- a/linux-2.6-xen-sparse/drivers/xen/xenbus/xenbus_comms.c    Sat Dec 30 
15:45:13 2006 +0000
+++ b/linux-2.6-xen-sparse/drivers/xen/xenbus/xenbus_comms.c    Sat Dec 30 
18:23:27 2006 +0000
@@ -196,7 +196,7 @@ int xb_init_comms(void)
        if (xenbus_irq)
                unbind_from_irqhandler(xenbus_irq, &xb_waitq);
 
-       err = bind_evtchn_to_irqhandler(
+       err = bind_caller_port_to_irqhandler(
                xen_store_evtchn, wake_waiting,
                0, "xenbus", &xb_waitq);
        if (err <= 0) {
diff -r 63fb88610e1e -r d275951acf10 linux-2.6-xen-sparse/include/xen/evtchn.h
--- a/linux-2.6-xen-sparse/include/xen/evtchn.h Sat Dec 30 15:45:13 2006 +0000
+++ b/linux-2.6-xen-sparse/include/xen/evtchn.h Sat Dec 30 18:23:27 2006 +0000
@@ -52,22 +52,34 @@
  * The IRQ argument passed to the callback handler is the same as returned
  * from the bind call. It may not correspond to a Linux IRQ number.
  * Returns IRQ or negative errno.
- * UNBIND: Takes IRQ to unbind from; automatically closes the event channel.
  */
-extern int bind_evtchn_to_irqhandler(
-       unsigned int evtchn,
+int bind_caller_port_to_irqhandler(
+       unsigned int caller_port,
        irqreturn_t (*handler)(int, void *, struct pt_regs *),
        unsigned long irqflags,
        const char *devname,
        void *dev_id);
-extern int bind_virq_to_irqhandler(
+int bind_listening_port_to_irqhandler(
+       unsigned int remote_domain,
+       irqreturn_t (*handler)(int, void *, struct pt_regs *),
+       unsigned long irqflags,
+       const char *devname,
+       void *dev_id);
+int bind_interdomain_evtchn_to_irqhandler(
+       unsigned int remote_domain,
+       unsigned int remote_port,
+       irqreturn_t (*handler)(int, void *, struct pt_regs *),
+       unsigned long irqflags,
+       const char *devname,
+       void *dev_id);
+int bind_virq_to_irqhandler(
        unsigned int virq,
        unsigned int cpu,
        irqreturn_t (*handler)(int, void *, struct pt_regs *),
        unsigned long irqflags,
        const char *devname,
        void *dev_id);
-extern int bind_ipi_to_irqhandler(
+int bind_ipi_to_irqhandler(
        unsigned int ipi,
        unsigned int cpu,
        irqreturn_t (*handler)(int, void *, struct pt_regs *),
@@ -77,21 +89,21 @@ extern int bind_ipi_to_irqhandler(
 
 /*
  * Common unbind function for all event sources. Takes IRQ to unbind from.
- * Automatically closes the underlying event channel (even for bindings
- * made with bind_evtchn_to_irqhandler()).
+ * Automatically closes the underlying event channel (except for bindings
+ * made with bind_caller_port_to_irqhandler()).
  */
-extern void unbind_from_irqhandler(unsigned int irq, void *dev_id);
+void unbind_from_irqhandler(unsigned int irq, void *dev_id);
 
-extern void irq_resume(void);
+void irq_resume(void);
 
 /* Entry point for notifications into Linux subsystems. */
 asmlinkage void evtchn_do_upcall(struct pt_regs *regs);
 
 /* Entry point for notifications into the userland character device. */
-extern void evtchn_device_upcall(int port);
+void evtchn_device_upcall(int port);
 
-extern void mask_evtchn(int port);
-extern void unmask_evtchn(int port);
+void mask_evtchn(int port);
+void unmask_evtchn(int port);
 
 static inline void clear_evtchn(int port)
 {
@@ -106,9 +118,10 @@ static inline void notify_remote_via_evt
 }
 
 /*
- * Unlike notify_remote_via_evtchn(), this is safe to use across
- * save/restore. Notifications on a broken connection are silently dropped.
+ * Use these to access the event channel underlying the IRQ handle returned
+ * by bind_*_to_irqhandler().
  */
-extern void notify_remote_via_irq(int irq);
+void notify_remote_via_irq(int irq);
+int irq_to_evtchn_port(int irq);
 
 #endif /* __ASM_EVTCHN_H__ */
diff -r 63fb88610e1e -r d275951acf10 linux-2.6-xen-sparse/include/xen/xenbus.h
--- a/linux-2.6-xen-sparse/include/xen/xenbus.h Sat Dec 30 15:45:13 2006 +0000
+++ b/linux-2.6-xen-sparse/include/xen/xenbus.h Sat Dec 30 18:23:27 2006 +0000
@@ -262,14 +262,6 @@ int xenbus_alloc_evtchn(struct xenbus_de
 
 
 /**
- * Bind to an existing interdomain event channel in another domain. Returns 0
- * on success and stores the local port in *port. On error, returns -errno,
- * switches the device to XenbusStateClosing, and saves the error in XenStore.
- */
-int xenbus_bind_evtchn(struct xenbus_device *dev, int remote_port, int *port);
-
-
-/**
  * Free an existing event channel. Returns 0 on success or -errno on error.
  */
 int xenbus_free_evtchn(struct xenbus_device *dev, int port);

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


 


Rackspace

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