All of lore.kernel.org
 help / color / mirror / Atom feed
From: Gregory Haskins <ghaskins@novell.com>
To: alacrityvm-devel@lists.sourceforge.net
Cc: linux-kernel@vger.kernel.org
Subject: [ALACRITYVM PATCH 2/2] vbus: register shm-signal events as standard Linux IRQ vectors
Date: Wed, 14 Oct 2009 12:22:41 -0400	[thread overview]
Message-ID: <20091014162241.19298.18475.stgit@dev.haskins.net> (raw)
In-Reply-To: <20091014162030.19298.48508.stgit@dev.haskins.net>

This will allow us to view the vector statistics in a uniform way, as
well as pave the way for supporting irqbalance in the future.

The VBUS PCI-BRIDGE will present itself as an irqchip device to the
kernel proper.  Each shm-signal that is created by a specific driver
will show up as a "VBUS-edge" IRQ in /proc/interrupts.  For instane,
here is example output from running a venet device as "eth1" (see
vectors 28-31):

vbus-guest:/home/ghaskins # cat /proc/interrupts
            CPU0
   0:         89   IO-APIC-edge      timer
   1:          6   IO-APIC-edge      i8042
   4:       1620   IO-APIC-edge      serial
   6:          2   IO-APIC-edge      floppy
   7:          0   IO-APIC-edge      parport0
   8:          0   IO-APIC-edge      rtc0
   9:          0   IO-APIC-fasteoi   acpi
  10:          0   IO-APIC-fasteoi   virtio1
  12:         90   IO-APIC-edge      i8042
  14:       3474   IO-APIC-edge      ata_piix
  15:       7778   IO-APIC-edge      ata_piix
  24:     185849   PCI-MSI-edge      vbus
  25:          0   PCI-MSI-edge      virtio0-config
  26:        210   PCI-MSI-edge      virtio0-input
  27:         28   PCI-MSI-edge      virtio0-output
  28:     167062      VBUS-edge      eth1-evq
  29:          0      VBUS-edge      eth1-pageq
  30:     161593      VBUS-edge      eth1-rx
  31:          0      VBUS-edge      eth1-tx
 NMI:          0   Non-maskable interrupts
 LOC:      72010   Local timer interrupts
 SPU:          0   Spurious interrupts
 CNT:          0   Performance counter interrupts
 PND:          0   Performance pending work
 RES:          0   Rescheduling interrupts
 CAL:          0   Function call interrupts
 TLB:          0   TLB shootdowns
 TRM:          0   Thermal event interrupts
 THR:          0   Threshold APIC interrupts
 MCE:          0   Machine check exceptions
 MCP:         20   Machine check polls
 ERR:          0
 MIS:          0

Signed-off-by: Gregory Haskins <ghaskins@novell.com>
---

 drivers/vbus/Kconfig      |    4 +-
 drivers/vbus/pci-bridge.c |   91 ++++++++++++++++++++++++++++++++++++---------
 2 files changed, 74 insertions(+), 21 deletions(-)

diff --git a/drivers/vbus/Kconfig b/drivers/vbus/Kconfig
index 08667aa..f51cba1 100644
--- a/drivers/vbus/Kconfig
+++ b/drivers/vbus/Kconfig
@@ -3,7 +3,7 @@
 #
 
 config VBUS_PROXY
-       tristate "Virtual-Bus support"
+       bool "Virtual-Bus support"
        select SHM_SIGNAL
        select IOQ
        default n
@@ -14,7 +14,7 @@ config VBUS_PROXY
 	on the backend, say Y.  If unsure, say N.
 
 config VBUS_PCIBRIDGE
-       tristate "PCI to Virtual-Bus bridge"
+       bool "PCI to Virtual-Bus bridge"
        depends on PCI
        depends on VBUS_PROXY
        select IOQ
diff --git a/drivers/vbus/pci-bridge.c b/drivers/vbus/pci-bridge.c
index fa77318..fcde495 100644
--- a/drivers/vbus/pci-bridge.c
+++ b/drivers/vbus/pci-bridge.c
@@ -147,15 +147,14 @@ _signal_init(struct shm_signal *signal, struct shm_signal_desc *desc,
  */
 
 struct _signal {
+	char               name[64];
 	struct vbus_pci   *pcivbus;
 	struct shm_signal  signal;
 	u32                handle;
 	struct rb_node     node;
 	struct list_head   list;
-	struct {
-		int        notify;
-		int        inject;
-	} stats;
+	int                irq;
+	struct irq_desc   *desc;
 };
 
 static struct _signal *
@@ -170,7 +169,6 @@ _signal_inject(struct shm_signal *signal)
 	struct _signal *_signal = to_signal(signal);
 
 	vbus_pci.stats.inject++;
-	_signal->stats.inject++;
 	iowrite32(_signal->handle, &vbus_pci.signals->shmsignal);
 
 	return 0;
@@ -236,6 +234,7 @@ vbus_pci_device_close(struct vbus_device_proxy *vdev, int flags)
 		_signal = list_first_entry(&dev->shms, struct _signal, list);
 
 		list_del(&_signal->list);
+		free_irq(_signal->irq, _signal);
 
 		spin_unlock_irqrestore(&vbus_pci.lock, iflags);
 		shm_signal_put(&_signal->signal);
@@ -261,6 +260,27 @@ vbus_pci_device_close(struct vbus_device_proxy *vdev, int flags)
 	return 0;
 }
 
+static void vbus_irq_chip_noop(unsigned int irq)
+{
+}
+
+static struct irq_chip vbus_irq_chip = {
+	.name		= "VBUS",
+	.mask		= vbus_irq_chip_noop,
+	.unmask		= vbus_irq_chip_noop,
+	.eoi		= vbus_irq_chip_noop,
+};
+
+irqreturn_t
+shm_signal_intr(int irq, void *dev)
+{
+	struct _signal *_signal = (struct _signal *)dev;
+
+	_shm_signal_wakeup(&_signal->signal);
+
+	return IRQ_HANDLED;
+}
+
 static int
 vbus_pci_device_shm(struct vbus_device_proxy *vdev, const char *name,
 		    int id, int prio,
@@ -315,24 +335,45 @@ vbus_pci_device_shm(struct vbus_device_proxy *vdev, const char *name,
 
 	ret = vbus_pci_buscall(VBUS_PCI_HC_DEVSHM,
 				 &params, sizeof(params));
-	if (ret < 0) {
-		if (_signal) {
-			/*
-			 * We held two references above, so we need to drop
-			 * both of them
-			 */
-			shm_signal_put(&_signal->signal);
-			shm_signal_put(&_signal->signal);
-		}
-
-		return ret;
-	}
+	if (ret < 0)
+		goto fail;
 
 	if (signal) {
+		int irq;
+
 		BUG_ON(ret < 0);
 
 		_signal->handle = ret;
 
+		irq = create_irq();
+		if (irq < 0) {
+			printk(KERN_ERR "Failed to create IRQ: %d\n", irq);
+			ret = -ENOSPC;
+			goto fail;
+		}
+
+		_signal->irq = irq;
+		_signal->desc = irq_to_desc(irq);
+
+		set_irq_chip_and_handler_name(irq,
+					      &vbus_irq_chip,
+					      handle_percpu_irq,
+					      "edge");
+
+		if (!name)
+			snprintf(_signal->name, sizeof(_signal->name),
+				"dev%lld-id%d", vdev->id, id);
+		else
+			snprintf(_signal->name, sizeof(_signal->name),
+				"%s", name);
+
+		ret = request_irq(irq, shm_signal_intr, 0,
+				  _signal->name, _signal);
+		if (ret) {
+			printk(KERN_ERR "Failed to request irq: %d\n", irq);
+			goto fail;
+		}
+
 		spin_lock_irqsave(&vbus_pci.lock, iflags);
 
 		list_add_tail(&_signal->list, &dev->shms);
@@ -344,6 +385,18 @@ vbus_pci_device_shm(struct vbus_device_proxy *vdev, const char *name,
 	}
 
 	return 0;
+
+fail:
+	if (_signal) {
+		/*
+		 * We held two references above, so we need to drop
+		 * both of them
+		 */
+		shm_signal_put(&_signal->signal);
+		shm_signal_put(&_signal->signal);
+	}
+
+	return ret;
 }
 
 static int
@@ -454,10 +507,10 @@ static void
 event_shmsignal(struct vbus_pci_handle_event *event)
 {
 	struct _signal *_signal = (struct _signal *)event->handle;
+	struct irq_desc *desc = _signal->desc;
 
 	vbus_pci.stats.notify++;
-	_signal->stats.notify++;
-	_shm_signal_wakeup(&_signal->signal);
+	desc->handle_irq(_signal->irq, desc);
 }
 
 static void


      parent reply	other threads:[~2009-10-14 16:23 UTC|newest]

Thread overview: 3+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2009-10-14 16:22 [ALACRITYVM PATCH 0/2] render shm-signals as standard irqs Gregory Haskins
2009-10-14 16:22 ` [ALACRITYVM PATCH 1/2] vbus: allow shmsignals to be named Gregory Haskins
2009-10-14 16:22 ` Gregory Haskins [this message]

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20091014162241.19298.18475.stgit@dev.haskins.net \
    --to=ghaskins@novell.com \
    --cc=alacrityvm-devel@lists.sourceforge.net \
    --cc=linux-kernel@vger.kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.