WARNING - OLD ARCHIVES

This is an archived copy of the Xen.org mailing list, which we have preserved to ensure that existing links to archives are not broken. The live archive, which contains the latest emails, can be found at http://lists.xen.org/
   
 
 
Xen 
 
Home Products Support Community News
 
   
 

xen-changelog

[Xen-changelog] Change semantics of bind_evtchn_to_xxx and

To: xen-changelog@xxxxxxxxxxxxxxxxxxx
Subject: [Xen-changelog] Change semantics of bind_evtchn_to_xxx and
From: Xen patchbot -unstable <patchbot-unstable@xxxxxxxxxxxxxxxxxxx>
Date: Thu, 29 Sep 2005 14:16:11 +0000
Delivery-date: Thu, 29 Sep 2005 14:13:44 +0000
Envelope-to: www-data@xxxxxxxxxxxxxxxxxxx
List-help: <mailto:xen-changelog-request@lists.xensource.com?subject=help>
List-id: BK change log <xen-changelog.lists.xensource.com>
List-post: <mailto:xen-changelog@lists.xensource.com>
List-subscribe: <http://lists.xensource.com/cgi-bin/mailman/listinfo/xen-changelog>, <mailto:xen-changelog-request@lists.xensource.com?subject=subscribe>
List-unsubscribe: <http://lists.xensource.com/cgi-bin/mailman/listinfo/xen-changelog>, <mailto:xen-changelog-request@lists.xensource.com?subject=unsubscribe>
Reply-to: xen-devel@xxxxxxxxxxxxxxxxxxx
Sender: xen-changelog-bounces@xxxxxxxxxxxxxxxxxxx
# HG changeset patch
# User kaf24@xxxxxxxxxxxxxxxxxxxx
# Node ID 559ad1abb3d502079ff5bbd39e2979f0a637549e
# Parent  805ee053e61f4c25e642ff3bb9e657966a15bc33
Change semantics of bind_evtchn_to_xxx and
unbind_evtchn_from_xxx. The bind now returns the IRQ
number on success. The unbind takes this as a parameter
instead of the event-channel port. Also, unbind closes
down the underlying event-channel port if it is still
live.

Signed-off-by: Keir Fraser <keir@xxxxxxxxxxxxx>

diff -r 805ee053e61f -r 559ad1abb3d5 
linux-2.6-xen-sparse/arch/xen/kernel/evtchn.c
--- a/linux-2.6-xen-sparse/arch/xen/kernel/evtchn.c     Thu Sep 29 12:05:43 2005
+++ b/linux-2.6-xen-sparse/arch/xen/kernel/evtchn.c     Thu Sep 29 14:14:03 2005
@@ -320,13 +320,19 @@
 }
 EXPORT_SYMBOL(bind_evtchn_to_irq);
 
-void unbind_evtchn_from_irq(unsigned int evtchn)
-{
-       int irq = evtchn_to_irq[evtchn];
+void unbind_evtchn_from_irq(unsigned int irq)
+{
+       evtchn_op_t op;
+       int evtchn = irq_to_evtchn[irq];
 
        spin_lock(&irq_mapping_update_lock);
 
-       if (--irq_bindcount[irq] == 0) {
+       if ((--irq_bindcount[irq] == 0) && (evtchn != -1)) {
+               op.cmd          = EVTCHNOP_close;
+               op.u.close.dom  = DOMID_SELF;
+               op.u.close.port = evtchn;
+               BUG_ON(HYPERVISOR_event_channel_op(&op) != 0);
+
                evtchn_to_irq[evtchn] = -1;
                irq_to_evtchn[irq]    = -1;
        }
@@ -348,17 +354,16 @@
        irq = bind_evtchn_to_irq(evtchn);
        retval = request_irq(irq, handler, irqflags, devname, dev_id);
        if (retval != 0)
-               unbind_evtchn_from_irq(evtchn);
-
-       return retval;
+               unbind_evtchn_from_irq(irq);
+
+       return irq;
 }
 EXPORT_SYMBOL(bind_evtchn_to_irqhandler);
 
-void unbind_evtchn_from_irqhandler(unsigned int evtchn, void *dev_id)
-{
-       unsigned int irq = evtchn_to_irq[evtchn];
+void unbind_evtchn_from_irqhandler(unsigned int irq, void *dev_id)
+{
        free_irq(irq, dev_id);
-       unbind_evtchn_from_irq(evtchn);
+       unbind_evtchn_from_irq(irq);
 }
 EXPORT_SYMBOL(unbind_evtchn_from_irqhandler);
 
@@ -425,9 +430,8 @@
 {
        int evtchn = irq_to_evtchn[irq];
 
-       if (!VALID_EVTCHN(evtchn))
-               return 0;
-       unmask_evtchn(evtchn);
+       if (VALID_EVTCHN(evtchn))
+               unmask_evtchn(evtchn);
        return 0;
 }
 
@@ -435,38 +439,41 @@
 {
        int evtchn = irq_to_evtchn[irq];
 
-       if (!VALID_EVTCHN(evtchn))
-               return;
-       mask_evtchn(evtchn);
+       if (VALID_EVTCHN(evtchn))
+               mask_evtchn(evtchn);
 }
 
 static void enable_dynirq(unsigned int irq)
 {
        int evtchn = irq_to_evtchn[irq];
 
-       unmask_evtchn(evtchn);
+       if (VALID_EVTCHN(evtchn))
+               unmask_evtchn(evtchn);
 }
 
 static void disable_dynirq(unsigned int irq)
 {
        int evtchn = irq_to_evtchn[irq];
 
-       mask_evtchn(evtchn);
+       if (VALID_EVTCHN(evtchn))
+               mask_evtchn(evtchn);
 }
 
 static void ack_dynirq(unsigned int irq)
 {
        int evtchn = irq_to_evtchn[irq];
 
-       mask_evtchn(evtchn);
-       clear_evtchn(evtchn);
+       if (VALID_EVTCHN(evtchn)) {
+               mask_evtchn(evtchn);
+               clear_evtchn(evtchn);
+       }
 }
 
 static void end_dynirq(unsigned int irq)
 {
        int evtchn = irq_to_evtchn[irq];
 
-       if (!(irq_desc[irq].status & IRQ_DISABLED))
+       if (VALID_EVTCHN(evtchn) && !(irq_desc[irq].status & IRQ_DISABLED))
                unmask_evtchn(evtchn);
 }
 
@@ -559,35 +566,36 @@
 static void enable_pirq(unsigned int irq)
 {
        int evtchn = irq_to_evtchn[irq];
-       if (!VALID_EVTCHN(evtchn))
-               return;
-       unmask_evtchn(evtchn);
-       pirq_unmask_notify(irq_to_pirq(irq));
+
+       if (VALID_EVTCHN(evtchn)) {
+               unmask_evtchn(evtchn);
+               pirq_unmask_notify(irq_to_pirq(irq));
+       }
 }
 
 static void disable_pirq(unsigned int irq)
 {
        int evtchn = irq_to_evtchn[irq];
-       if (!VALID_EVTCHN(evtchn))
-               return;
-       mask_evtchn(evtchn);
+
+       if (VALID_EVTCHN(evtchn))
+               mask_evtchn(evtchn);
 }
 
 static void ack_pirq(unsigned int irq)
 {
        int evtchn = irq_to_evtchn[irq];
-       if (!VALID_EVTCHN(evtchn))
-               return;
-       mask_evtchn(evtchn);
-       clear_evtchn(evtchn);
+
+       if (VALID_EVTCHN(evtchn)) {
+               mask_evtchn(evtchn);
+               clear_evtchn(evtchn);
+       }
 }
 
 static void end_pirq(unsigned int irq)
 {
        int evtchn = irq_to_evtchn[irq];
-       if (!VALID_EVTCHN(evtchn))
-               return;
-       if (!(irq_desc[irq].status & IRQ_DISABLED)) {
+
+       if (VALID_EVTCHN(evtchn) && !(irq_desc[irq].status & IRQ_DISABLED)) {
                unmask_evtchn(evtchn);
                pirq_unmask_notify(irq_to_pirq(irq));
        }
@@ -637,6 +645,10 @@
                        BUG_ON(per_cpu(ipi_to_evtchn, cpu)[ipi] != -1);
        }
 
+       /* No IRQ -> event-channel mappings. */
+       for (irq = 0; irq < NR_IRQS; irq++)
+               irq_to_evtchn[irq] = -1;
+
        /* Primary CPU: rebind VIRQs automatically. */
        for (virq = 0; virq < NR_VIRQS; virq++) {
                if ((irq = per_cpu(virq_to_irq, 0)[virq]) == -1)
@@ -676,6 +688,13 @@
                /* Ready for use. */
                unmask_evtchn(evtchn);
        }
+
+       /* Remove defunct event-channel -> IRQ mappings. */
+       for (evtchn = 0; evtchn < NR_EVENT_CHANNELS; evtchn++) {
+               if ((evtchn_to_irq[evtchn] != -1) &&
+                   (irq_to_evtchn[evtchn_to_irq[evtchn]] == -1))
+                       evtchn_to_irq[evtchn] = -1;
+       }
 }
 
 void __init init_IRQ(void)
@@ -689,11 +708,10 @@
 
        init_evtchn_cpu_bindings();
 
+       /* No VIRQ or IPI bindings. */
        for (cpu = 0; cpu < NR_CPUS; cpu++) {
-               /* No VIRQ -> IRQ mappings. */
                for (i = 0; i < NR_VIRQS; i++)
                        per_cpu(virq_to_irq, cpu)[i] = -1;
-               /* No VIRQ -> IRQ mappings. */
                for (i = 0; i < NR_IPIS; i++)
                        per_cpu(ipi_to_evtchn, cpu)[i] = -1;
        }
diff -r 805ee053e61f -r 559ad1abb3d5 
linux-2.6-xen-sparse/arch/xen/kernel/reboot.c
--- a/linux-2.6-xen-sparse/arch/xen/kernel/reboot.c     Thu Sep 29 12:05:43 2005
+++ b/linux-2.6-xen-sparse/arch/xen/kernel/reboot.c     Thu Sep 29 14:14:03 2005
@@ -65,12 +65,6 @@
 {
        int i, j, k, fpp;
 
-#ifdef CONFIG_XEN_USB_FRONTEND
-       extern void usbif_resume();
-#else
-#define usbif_resume() do{}while(0)
-#endif
-
        extern int gnttab_suspend(void);
        extern int gnttab_resume(void);
 
@@ -87,7 +81,6 @@
        int restore_vcpu_context(int vcpu, vcpu_guest_context_t *ctxt);
 #endif
 
-       extern void xencons_suspend(void);
        extern void xencons_resume(void);
 
        int err = 0;
@@ -147,16 +140,14 @@
        }
 #endif
 
+       xenbus_suspend();
+
+       gnttab_suspend();
+
 #ifdef __i386__
        mm_pin_all();
        kmem_cache_shrink(pgd_cache);
 #endif
-
-       xenbus_suspend();
-
-       xencons_suspend();
-
-       gnttab_suspend();
 
        HYPERVISOR_shared_info = (shared_info_t *)empty_zero_page;
        clear_fixmap(FIX_SHARED_INFO);
@@ -202,8 +193,6 @@
 
        time_resume();
 
-       usbif_resume();
-
 #ifdef CONFIG_SMP
        for_each_cpu_mask(i, prev_present_cpus)
                restore_vcpu_context(i, &suspended_cpu_records[i]);
diff -r 805ee053e61f -r 559ad1abb3d5 
linux-2.6-xen-sparse/drivers/xen/blkback/common.h
--- a/linux-2.6-xen-sparse/drivers/xen/blkback/common.h Thu Sep 29 12:05:43 2005
+++ b/linux-2.6-xen-sparse/drivers/xen/blkback/common.h Thu Sep 29 14:14:03 2005
@@ -44,7 +44,7 @@
        unsigned int      handle;
        /* Physical parameters of the comms window. */
        unsigned int      evtchn;
-       unsigned int      remote_evtchn;
+       unsigned int      irq;
        /* Comms information. */
        blkif_back_ring_t blk_ring;
        struct vm_struct *blk_ring_area;
diff -r 805ee053e61f -r 559ad1abb3d5 
linux-2.6-xen-sparse/drivers/xen/blkback/interface.c
--- a/linux-2.6-xen-sparse/drivers/xen/blkback/interface.c      Thu Sep 29 
12:05:43 2005
+++ b/linux-2.6-xen-sparse/drivers/xen/blkback/interface.c      Thu Sep 29 
14:14:03 2005
@@ -71,8 +71,6 @@
        evtchn_op_t op = { .cmd = EVTCHNOP_bind_interdomain };
        int err;
 
-       BUG_ON(blkif->remote_evtchn);
-
        if ( (blkif->blk_ring_area = alloc_vm_area(PAGE_SIZE)) == NULL )
                return -ENOMEM;
 
@@ -94,13 +92,12 @@
        }
 
        blkif->evtchn = op.u.bind_interdomain.port1;
-       blkif->remote_evtchn = evtchn;
 
        sring = (blkif_sring_t *)blkif->blk_ring_area->addr;
        SHARED_RING_INIT(sring);
        BACK_RING_INIT(&blkif->blk_ring, sring, PAGE_SIZE);
 
-       bind_evtchn_to_irqhandler(
+       blkif->irq = bind_evtchn_to_irqhandler(
                blkif->evtchn, blkif_be_int, 0, "blkif-backend", blkif);
        blkif->status = CONNECTED;
 
@@ -109,20 +106,12 @@
 
 static void free_blkif(void *arg)
 {
-       evtchn_op_t op = { .cmd = EVTCHNOP_close };
        blkif_t *blkif = (blkif_t *)arg;
 
-       op.u.close.port = blkif->evtchn;
-       op.u.close.dom = DOMID_SELF;
-       HYPERVISOR_event_channel_op(&op);
-       op.u.close.port = blkif->remote_evtchn;
-       op.u.close.dom = blkif->domid;
-       HYPERVISOR_event_channel_op(&op);
+       if (blkif->irq)
+               unbind_evtchn_from_irqhandler(blkif->irq, blkif);
 
        vbd_free(&blkif->vbd);
-
-       if (blkif->evtchn)
-               unbind_evtchn_from_irqhandler(blkif->evtchn, blkif);
 
        if (blkif->blk_ring.sring) {
                unmap_frontend_page(blkif);
diff -r 805ee053e61f -r 559ad1abb3d5 
linux-2.6-xen-sparse/drivers/xen/blkfront/blkfront.c
--- a/linux-2.6-xen-sparse/drivers/xen/blkfront/blkfront.c      Thu Sep 29 
12:05:43 2005
+++ b/linux-2.6-xen-sparse/drivers/xen/blkfront/blkfront.c      Thu Sep 29 
14:14:03 2005
@@ -357,8 +357,9 @@
        if (info->ring_ref != GRANT_INVALID_REF)
                gnttab_end_foreign_access(info->ring_ref, 0);
        info->ring_ref = GRANT_INVALID_REF;
-       unbind_evtchn_from_irqhandler(info->evtchn, info); 
-       info->evtchn = 0;
+       if (info->irq)
+               unbind_evtchn_from_irqhandler(info->irq, info); 
+       info->evtchn = info->irq = 0;
 }
 
 static void blkif_recover(struct blkfront_info *info)
@@ -429,10 +430,12 @@
 
        err = bind_evtchn_to_irqhandler(
                info->evtchn, blkif_int, SA_SAMPLE_RANDOM, "blkif", info);
-       if (err != 0) {
+       if (err <= 0) {
                WPRINTK("bind_evtchn_to_irqhandler failed (err=%d)\n", err);
                return;
        }
+
+       info->irq = err;
 }
 
 
diff -r 805ee053e61f -r 559ad1abb3d5 
linux-2.6-xen-sparse/drivers/xen/blkfront/block.h
--- a/linux-2.6-xen-sparse/drivers/xen/blkfront/block.h Thu Sep 29 12:05:43 2005
+++ b/linux-2.6-xen-sparse/drivers/xen/blkfront/block.h Thu Sep 29 14:14:03 2005
@@ -123,7 +123,7 @@
        int backend_id;
        int ring_ref;
        blkif_front_ring_t ring;
-       unsigned int evtchn;
+       unsigned int evtchn, irq;
        struct xlbd_major_info *mi;
        request_queue_t *rq;
        struct work_struct work;
diff -r 805ee053e61f -r 559ad1abb3d5 
linux-2.6-xen-sparse/drivers/xen/blktap/common.h
--- a/linux-2.6-xen-sparse/drivers/xen/blktap/common.h  Thu Sep 29 12:05:43 2005
+++ b/linux-2.6-xen-sparse/drivers/xen/blktap/common.h  Thu Sep 29 14:14:03 2005
@@ -46,7 +46,7 @@
        unsigned int      handle;
        /* Physical parameters of the comms window. */
        unsigned int      evtchn;
-       unsigned int      remote_evtchn;
+       unsigned int      irq;
        /* Comms information. */
        blkif_back_ring_t blk_ring;
        struct vm_struct *blk_ring_area;
diff -r 805ee053e61f -r 559ad1abb3d5 
linux-2.6-xen-sparse/drivers/xen/blktap/interface.c
--- a/linux-2.6-xen-sparse/drivers/xen/blktap/interface.c       Thu Sep 29 
12:05:43 2005
+++ b/linux-2.6-xen-sparse/drivers/xen/blktap/interface.c       Thu Sep 29 
14:14:03 2005
@@ -71,8 +71,6 @@
        evtchn_op_t op = { .cmd = EVTCHNOP_bind_interdomain };
        int err;
 
-       BUG_ON(blkif->remote_evtchn);
-
        if ((blkif->blk_ring_area = alloc_vm_area(PAGE_SIZE)) == NULL)
                return -ENOMEM;
 
@@ -93,35 +91,26 @@
                return err;
        }
 
-
        blkif->evtchn = op.u.bind_interdomain.port1;
-       blkif->remote_evtchn = evtchn;
 
        sring = (blkif_sring_t *)blkif->blk_ring_area->addr;
        SHARED_RING_INIT(sring);
        BACK_RING_INIT(&blkif->blk_ring, sring, PAGE_SIZE);
 
-       bind_evtchn_to_irqhandler(
+       blkif->irq = bind_evtchn_to_irqhandler(
                blkif->evtchn, blkif_be_int, 0, "blkif-backend", blkif);
-       blkif->status        = CONNECTED;
+
+       blkif->status = CONNECTED;
 
        return 0;
 }
 
 static void free_blkif(void *arg)
 {
-       evtchn_op_t op = { .cmd = EVTCHNOP_close };
        blkif_t *blkif = (blkif_t *)arg;
 
-       op.u.close.port = blkif->evtchn;
-       op.u.close.dom = DOMID_SELF;
-       HYPERVISOR_event_channel_op(&op);
-       op.u.close.port = blkif->remote_evtchn;
-       op.u.close.dom = blkif->domid;
-       HYPERVISOR_event_channel_op(&op);
-
-       if (blkif->evtchn)
-               unbind_evtchn_from_irqhandler(blkif->evtchn, blkif);
+       if (blkif->irq)
+               unbind_evtchn_from_irqhandler(blkif->irq, blkif);
 
        if (blkif->blk_ring.sring) {
                unmap_frontend_page(blkif);
diff -r 805ee053e61f -r 559ad1abb3d5 
linux-2.6-xen-sparse/drivers/xen/console/xencons_ring.c
--- a/linux-2.6-xen-sparse/drivers/xen/console/xencons_ring.c   Thu Sep 29 
12:05:43 2005
+++ b/linux-2.6-xen-sparse/drivers/xen/console/xencons_ring.c   Thu Sep 29 
14:14:03 2005
@@ -21,7 +21,6 @@
 #include <linux/err.h>
 #include "xencons_ring.h"
 
-
 struct ring_head
 {
        u32 cons;
@@ -29,6 +28,7 @@
        char buf[0];
 } __attribute__((packed));
 
+static int xencons_irq;
 
 #define XENCONS_RING_SIZE (PAGE_SIZE/2 - sizeof (struct ring_head))
 #define XENCONS_IDX(cnt) ((cnt) % XENCONS_RING_SIZE)
@@ -97,32 +97,28 @@
 {
        int err;
 
+       if (xencons_irq)
+               unbind_evtchn_from_irqhandler(xencons_irq, inring());
+       xencons_irq = 0;
+
        if (!xen_start_info->console_evtchn)
                return 0;
 
-       err = bind_evtchn_to_irqhandler(xen_start_info->console_evtchn,
-                                       handle_input, 0, "xencons", inring());
-       if (err) {
+       err = bind_evtchn_to_irqhandler(
+               xen_start_info->console_evtchn,
+               handle_input, 0, "xencons", inring());
+       if (err <= 0) {
                xprintk("XEN console request irq failed %i\n", err);
                return err;
        }
 
+       xencons_irq = err;
+
        return 0;
-}
-
-void xencons_suspend(void)
-{
-
-       if (!xen_start_info->console_evtchn)
-               return;
-
-       unbind_evtchn_from_irqhandler(xen_start_info->console_evtchn,
-                                     inring());
 }
 
 void xencons_resume(void)
 {
-
        (void)xencons_ring_init();
 }
 
diff -r 805ee053e61f -r 559ad1abb3d5 
linux-2.6-xen-sparse/drivers/xen/netback/common.h
--- a/linux-2.6-xen-sparse/drivers/xen/netback/common.h Thu Sep 29 12:05:43 2005
+++ b/linux-2.6-xen-sparse/drivers/xen/netback/common.h Thu Sep 29 14:14:03 2005
@@ -50,7 +50,7 @@
        u16              rx_shmem_handle;
        grant_ref_t      rx_shmem_ref; 
        unsigned int     evtchn;
-       unsigned int     remote_evtchn;
+       unsigned int     irq;
 
        /* The shared rings and indexes. */
        netif_tx_interface_t *tx;
diff -r 805ee053e61f -r 559ad1abb3d5 
linux-2.6-xen-sparse/drivers/xen/netback/interface.c
--- a/linux-2.6-xen-sparse/drivers/xen/netback/interface.c      Thu Sep 29 
12:05:43 2005
+++ b/linux-2.6-xen-sparse/drivers/xen/netback/interface.c      Thu Sep 29 
14:14:03 2005
@@ -15,18 +15,17 @@
        spin_lock_bh(&dev->xmit_lock);
        netif->active = 1;
        spin_unlock_bh(&dev->xmit_lock);
-       (void)bind_evtchn_to_irqhandler(
-               netif->evtchn, netif_be_int, 0, dev->name, netif);
+       enable_irq(netif->irq);
        netif_schedule_work(netif);
 }
 
 static void __netif_down(netif_t *netif)
 {
        struct net_device *dev = netif->dev;
+       disable_irq(netif->irq);
        spin_lock_bh(&dev->xmit_lock);
        netif->active = 0;
        spin_unlock_bh(&dev->xmit_lock);
-       unbind_evtchn_from_irqhandler(netif->evtchn, netif);
        netif_deschedule_work(netif);
 }
 
@@ -203,7 +202,10 @@
        }
 
        netif->evtchn = op.u.bind_interdomain.port1;
-       netif->remote_evtchn = evtchn;
+
+       netif->irq = bind_evtchn_to_irqhandler(
+               netif->evtchn, netif_be_int, 0, netif->dev->name, netif);
+       disable_irq(netif->irq);
 
        netif->tx = (netif_tx_interface_t *)netif->comms_area->addr;
        netif->rx = (netif_rx_interface_t *)
@@ -224,21 +226,15 @@
 
 static void free_netif_callback(void *arg)
 {
-       evtchn_op_t op = { .cmd = EVTCHNOP_close };
        netif_t *netif = (netif_t *)arg;
 
        /*
-        * These can't be done in netif_disconnect() because at that point
+        * This can't be done in netif_disconnect() because at that point
         * there may be outstanding requests in the network stack whose
         * asynchronous responses must still be notified to the remote driver.
         */
-
-       op.u.close.port = netif->evtchn;
-       op.u.close.dom = DOMID_SELF;
-       HYPERVISOR_event_channel_op(&op);
-       op.u.close.port = netif->remote_evtchn;
-       op.u.close.dom = netif->domid;
-       HYPERVISOR_event_channel_op(&op);
+       if (netif->irq)
+               unbind_evtchn_from_irqhandler(netif->irq, netif);
 
        unregister_netdev(netif->dev);
 
diff -r 805ee053e61f -r 559ad1abb3d5 
linux-2.6-xen-sparse/drivers/xen/netfront/netfront.c
--- a/linux-2.6-xen-sparse/drivers/xen/netfront/netfront.c      Thu Sep 29 
12:05:43 2005
+++ b/linux-2.6-xen-sparse/drivers/xen/netfront/netfront.c      Thu Sep 29 
14:14:03 2005
@@ -127,7 +127,7 @@
        spinlock_t   rx_lock;
 
        unsigned int handle;
-       unsigned int evtchn;
+       unsigned int evtchn, irq;
 
        /* What is the status of our connection to the remote backend? */
 #define BEST_CLOSED       0
@@ -815,7 +815,7 @@
        memcpy(dev->dev_addr, np->mac, ETH_ALEN);
        np->evtchn = evtchn;
        network_connect(dev);
-       (void)bind_evtchn_to_irqhandler(
+       np->irq = bind_evtchn_to_irqhandler(
                np->evtchn, netif_int, SA_SAMPLE_RANDOM, dev->name, dev);
        (void)send_fake_arp(dev);
        show_device(np);
@@ -1055,8 +1055,9 @@
                gnttab_end_foreign_access(info->rx_ring_ref, 0);
        info->rx_ring_ref = GRANT_INVALID_REF;
 
-       unbind_evtchn_from_irqhandler(info->evtchn, info->netdev);
-       info->evtchn = 0;
+       if (info->irq)
+               unbind_evtchn_from_irqhandler(info->irq, info->netdev);
+       info->evtchn = info->irq = 0;
 }
 
 /* Stop network device and free tx/rx queues and irq. */
diff -r 805ee053e61f -r 559ad1abb3d5 
linux-2.6-xen-sparse/drivers/xen/tpmback/common.h
--- a/linux-2.6-xen-sparse/drivers/xen/tpmback/common.h Thu Sep 29 12:05:43 2005
+++ b/linux-2.6-xen-sparse/drivers/xen/tpmback/common.h Thu Sep 29 14:14:03 2005
@@ -35,7 +35,7 @@
 
        /* Physical parameters of the comms window. */
        unsigned int evtchn;
-       unsigned int remote_evtchn;
+       unsigned int irq;
 
        /* The shared rings and indexes. */
        tpmif_tx_interface_t *tx;
diff -r 805ee053e61f -r 559ad1abb3d5 
linux-2.6-xen-sparse/drivers/xen/tpmback/interface.c
--- a/linux-2.6-xen-sparse/drivers/xen/tpmback/interface.c      Thu Sep 29 
12:05:43 2005
+++ b/linux-2.6-xen-sparse/drivers/xen/tpmback/interface.c      Thu Sep 29 
14:14:03 2005
@@ -120,8 +120,6 @@
        evtchn_op_t op = {.cmd = EVTCHNOP_bind_interdomain };
        int err;
 
-       BUG_ON(tpmif->remote_evtchn);
-
        if ((tpmif->tx_area = alloc_vm_area(PAGE_SIZE)) == NULL)
                return -ENOMEM;
 
@@ -143,12 +141,11 @@
        }
 
        tpmif->evtchn = op.u.bind_interdomain.port1;
-       tpmif->remote_evtchn = evtchn;
 
        tpmif->tx = (tpmif_tx_interface_t *)tpmif->tx_area->addr;
 
-       bind_evtchn_to_irqhandler(tpmif->evtchn,
-                                 tpmif_be_int, 0, "tpmif-backend", tpmif);
+       tpmif->irq = bind_evtchn_to_irqhandler(
+               tpmif->evtchn, tpmif_be_int, 0, "tpmif-backend", tpmif);
        tpmif->status = CONNECTED;
        tpmif->shmem_ref = shared_page;
        tpmif->active = 1;
@@ -159,18 +156,10 @@
 static void
 __tpmif_disconnect_complete(void *arg)
 {
-       evtchn_op_t op = {.cmd = EVTCHNOP_close };
        tpmif_t *tpmif = (tpmif_t *) arg;
 
-       op.u.close.port = tpmif->evtchn;
-       op.u.close.dom = DOMID_SELF;
-       HYPERVISOR_event_channel_op(&op);
-       op.u.close.port = tpmif->remote_evtchn;
-       op.u.close.dom = tpmif->domid;
-       HYPERVISOR_event_channel_op(&op);
-
-       if (tpmif->evtchn)
-               unbind_evtchn_from_irqhandler(tpmif->evtchn, tpmif);
+       if (tpmif->irq)
+               unbind_evtchn_from_irqhandler(tpmif->irq, tpmif);
 
        if (tpmif->tx) {
                unmap_frontend_page(tpmif);
diff -r 805ee053e61f -r 559ad1abb3d5 
linux-2.6-xen-sparse/drivers/xen/tpmfront/tpmfront.c
--- a/linux-2.6-xen-sparse/drivers/xen/tpmfront/tpmfront.c      Thu Sep 29 
12:05:43 2005
+++ b/linux-2.6-xen-sparse/drivers/xen/tpmfront/tpmfront.c      Thu Sep 29 
14:14:03 2005
@@ -292,8 +292,10 @@
                free_page((unsigned long)tp->tx);
                tp->tx = NULL;
        }
-       unbind_evtchn_from_irqhandler(tp->evtchn, NULL);
-       tp->evtchn = 0;
+
+       if (tpm->irq)
+               unbind_evtchn_from_irqhandler(tp->irq, NULL);
+       tp->evtchn = tpm->irq = 0;
 }
 
 
@@ -501,10 +503,12 @@
        err = bind_evtchn_to_irqhandler(
                tp->evtchn,
                tpmif_int, SA_SAMPLE_RANDOM, "tpmif", tp);
-       if ( err != 0 ) {
+       if ( err <= 0 ) {
                WPRINTK("bind_evtchn_to_irqhandler failed (err=%d)\n", err);
                return;
        }
+
+       tp->irq = err;
 }
 
 static struct xenbus_device_id tpmfront_ids[] = {
diff -r 805ee053e61f -r 559ad1abb3d5 
linux-2.6-xen-sparse/drivers/xen/tpmfront/tpmfront.h
--- a/linux-2.6-xen-sparse/drivers/xen/tpmfront/tpmfront.h      Thu Sep 29 
12:05:43 2005
+++ b/linux-2.6-xen-sparse/drivers/xen/tpmfront/tpmfront.h      Thu Sep 29 
14:14:03 2005
@@ -5,7 +5,7 @@
 struct tpm_private
 {
        tpmif_tx_interface_t *tx;
-       unsigned int evtchn;
+       unsigned int evtchn, irq;
        int connected;
 
        spinlock_t tx_lock;
diff -r 805ee053e61f -r 559ad1abb3d5 
linux-2.6-xen-sparse/drivers/xen/xenbus/xenbus_comms.c
--- a/linux-2.6-xen-sparse/drivers/xen/xenbus/xenbus_comms.c    Thu Sep 29 
12:05:43 2005
+++ b/linux-2.6-xen-sparse/drivers/xen/xenbus/xenbus_comms.c    Thu Sep 29 
14:14:03 2005
@@ -43,6 +43,8 @@
        u8 flags;
        char buf[0];
 } __attribute__((packed));
+
+static int xenbus_irq;
 
 DECLARE_WAIT_QUEUE_HEAD(xb_waitq);
 
@@ -205,31 +207,27 @@
 {
        int err;
 
+       if (xenbus_irq)
+               unbind_evtchn_from_irqhandler(xenbus_irq, &xb_waitq);
+       xenbus_irq = 0;
+
        if (!xen_start_info->store_evtchn)
                return 0;
 
        err = bind_evtchn_to_irqhandler(
                xen_start_info->store_evtchn, wake_waiting,
                0, "xenbus", &xb_waitq);
-       if (err) {
+       if (err <= 0) {
                printk(KERN_ERR "XENBUS request irq failed %i\n", err);
-               unbind_evtchn_from_irq(xen_start_info->store_evtchn);
                return err;
        }
 
+       xenbus_irq = err;
+
        /* FIXME zero out page -- domain builder should probably do this*/
        memset(mfn_to_virt(xen_start_info->store_mfn), 0, PAGE_SIZE);
 
        return 0;
-}
-
-void xb_suspend_comms(void)
-{
-
-       if (!xen_start_info->store_evtchn)
-               return;
-
-       unbind_evtchn_from_irqhandler(xen_start_info->store_evtchn, &xb_waitq);
 }
 
 /*
diff -r 805ee053e61f -r 559ad1abb3d5 
linux-2.6-xen-sparse/drivers/xen/xenbus/xenbus_comms.h
--- a/linux-2.6-xen-sparse/drivers/xen/xenbus/xenbus_comms.h    Thu Sep 29 
12:05:43 2005
+++ b/linux-2.6-xen-sparse/drivers/xen/xenbus/xenbus_comms.h    Thu Sep 29 
14:14:03 2005
@@ -30,7 +30,6 @@
 
 int xs_init(void);
 int xb_init_comms(void);
-void xb_suspend_comms(void);
 
 /* Low level routines. */
 int xb_write(const void *data, unsigned len);
diff -r 805ee053e61f -r 559ad1abb3d5 
linux-2.6-xen-sparse/drivers/xen/xenbus/xenbus_probe.c
--- a/linux-2.6-xen-sparse/drivers/xen/xenbus/xenbus_probe.c    Thu Sep 29 
12:05:43 2005
+++ b/linux-2.6-xen-sparse/drivers/xen/xenbus/xenbus_probe.c    Thu Sep 29 
14:14:03 2005
@@ -607,7 +607,6 @@
        down(&xenbus_lock);
        bus_for_each_dev(&xenbus_frontend.bus, NULL, NULL, suspend_dev);
        bus_for_each_dev(&xenbus_backend.bus, NULL, NULL, suspend_dev);
-       xb_suspend_comms();
 }
 
 void xenbus_resume(void)
diff -r 805ee053e61f -r 559ad1abb3d5 
linux-2.6-xen-sparse/include/asm-xen/evtchn.h
--- a/linux-2.6-xen-sparse/include/asm-xen/evtchn.h     Thu Sep 29 12:05:43 2005
+++ b/linux-2.6-xen-sparse/include/asm-xen/evtchn.h     Thu Sep 29 14:14:03 2005
@@ -51,14 +51,21 @@
 extern int  bind_ipi_to_irq(int ipi);
 extern void unbind_ipi_from_irq(int ipi);
 
-/* Dynamically bind an event-channel port to Linux IRQ space. */
+/*
+ * Dynamically bind an event-channel port to Linux IRQ space.
+ * BIND:   Returns IRQ or error.
+ * UNBIND: Takes IRQ to unbind from; automatically closes the event channel.
+ */
 extern int  bind_evtchn_to_irq(unsigned int evtchn);
-extern void unbind_evtchn_from_irq(unsigned int evtchn);
+extern void unbind_evtchn_from_irq(unsigned int irq);
 
 /*
  * Dynamically bind an event-channel port to an IRQ-like callback handler.
  * On some platforms this may not be implemented via the Linux IRQ subsystem.
- * You *cannot* trust the irq argument passed to the callback handler.
+ * 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.
+ * BIND:   Returns IRQ or error.
+ * UNBIND: Takes IRQ to unbind from; automatically closes the event channel.
  */
 extern int  bind_evtchn_to_irqhandler(
        unsigned int evtchn,
@@ -66,7 +73,7 @@
        unsigned long irqflags,
        const char *devname,
        void *dev_id);
-extern void unbind_evtchn_from_irqhandler(unsigned int evtchn, void *dev_id);
+extern void unbind_evtchn_from_irqhandler(unsigned int irq, void *dev_id);
 
 extern void irq_resume(void);
 

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

<Prev in Thread] Current Thread [Next in Thread>
  • [Xen-changelog] Change semantics of bind_evtchn_to_xxx and, Xen patchbot -unstable <=