* [ALACRITYVM PATCH 0/2] render shm-signals as standard irqs
@ 2009-10-14 16:22 Gregory Haskins
2009-10-14 16:22 ` [ALACRITYVM PATCH 1/2] vbus: allow shmsignals to be named Gregory Haskins
2009-10-14 16:22 ` [ALACRITYVM PATCH 2/2] vbus: register shm-signal events as standard Linux IRQ vectors Gregory Haskins
0 siblings, 2 replies; 3+ messages in thread
From: Gregory Haskins @ 2009-10-14 16:22 UTC (permalink / raw)
To: alacrityvm-devel; +Cc: linux-kernel
This series applies to the "linux-next" branch for alacrity-vm.git:
git://git.kernel.org/pub/scm/linux/kernel/git/ghaskins/alacrityvm/linux-2.6.git
Please see the patch headers for details.
Kind Regards,
-Greg
---
Gregory Haskins (2):
vbus: register shm-signal events as standard Linux IRQ vectors
vbus: allow shmsignals to be named
drivers/net/vbus-enet.c | 43 ++++++++++++++++----
drivers/vbus/Kconfig | 4 +-
drivers/vbus/bus-proxy.c | 6 +--
drivers/vbus/pci-bridge.c | 94 ++++++++++++++++++++++++++++++++++---------
include/linux/vbus_driver.h | 7 ++-
5 files changed, 117 insertions(+), 37 deletions(-)
--
Signature
^ permalink raw reply [flat|nested] 3+ messages in thread
* [ALACRITYVM PATCH 1/2] vbus: allow shmsignals to be named
2009-10-14 16:22 [ALACRITYVM PATCH 0/2] render shm-signals as standard irqs Gregory Haskins
@ 2009-10-14 16:22 ` Gregory Haskins
2009-10-14 16:22 ` [ALACRITYVM PATCH 2/2] vbus: register shm-signal events as standard Linux IRQ vectors Gregory Haskins
1 sibling, 0 replies; 3+ messages in thread
From: Gregory Haskins @ 2009-10-14 16:22 UTC (permalink / raw)
To: alacrityvm-devel; +Cc: linux-kernel
This will allow the signals to be displayed to the end-user in some
meaningful way later in the series, such as for statistics, etc.
Signed-off-by: Gregory Haskins <ghaskins@novell.com>
---
drivers/net/vbus-enet.c | 43 ++++++++++++++++++++++++++++++++++---------
drivers/vbus/bus-proxy.c | 6 +++---
drivers/vbus/pci-bridge.c | 3 ++-
include/linux/vbus_driver.h | 7 ++++---
4 files changed, 43 insertions(+), 16 deletions(-)
diff --git a/drivers/net/vbus-enet.c b/drivers/net/vbus-enet.c
index 6fe2241..9d48674 100644
--- a/drivers/net/vbus-enet.c
+++ b/drivers/net/vbus-enet.c
@@ -101,14 +101,20 @@ napi_to_priv(struct napi_struct *napi)
static int
queue_init(struct vbus_enet_priv *priv,
struct vbus_enet_queue *q,
+ const char *name,
int qid,
size_t ringsize,
void (*func)(struct ioq_notifier *))
{
struct vbus_device_proxy *dev = priv->vdev;
int ret;
+ char _name[64];
- ret = vbus_driver_ioq_alloc(dev, qid, 0, ringsize, &q->queue);
+ if (name)
+ snprintf(_name, sizeof(_name), "%s-%s", priv->dev->name, name);
+
+ ret = vbus_driver_ioq_alloc(dev, name ? _name : NULL, qid, 0,
+ ringsize, &q->queue);
if (ret < 0)
panic("ioq_alloc failed: %d\n", ret);
@@ -396,7 +402,8 @@ tx_setup(struct vbus_enet_priv *priv)
priv->pmtd.pool = pool;
- ret = dev->ops->shm(dev, shmid, 0, pool, poollen, 0, NULL, 0);
+ ret = dev->ops->shm(dev, NULL, shmid, 0, pool, poollen,
+ 0, NULL, 0);
BUG_ON(ret < 0);
}
@@ -1227,12 +1234,13 @@ vbus_enet_evq_negcap(struct vbus_enet_priv *priv, unsigned long count)
priv->evq.pool = pool;
- ret = dev->ops->shm(dev, query.dpid, 0,
+ ret = dev->ops->shm(dev, NULL, query.dpid, 0,
pool, poollen, 0, NULL, 0);
if (ret < 0)
return ret;
- queue_init(priv, &priv->evq.veq, query.qid, count, evq_isr);
+ queue_init(priv, &priv->evq.veq, "evq",
+ query.qid, count, evq_isr);
ret = ioq_iter_init(priv->evq.veq.queue,
&iter, ioq_idxtype_valid, 0);
@@ -1302,7 +1310,7 @@ vbus_enet_l4ro_negcap(struct vbus_enet_priv *priv, unsigned long count)
/*
* pre-mapped descriptor pool
*/
- ret = dev->ops->shm(dev, query.dpid, 0,
+ ret = dev->ops->shm(dev, NULL, query.dpid, 0,
pool, poollen, 0, NULL, 0);
if (ret < 0) {
printk(KERN_ERR "Error registering L4RO pool: %d\n",
@@ -1317,7 +1325,8 @@ vbus_enet_l4ro_negcap(struct vbus_enet_priv *priv, unsigned long count)
* one MTU frame. All we need to do is keep it populated
* with free pages.
*/
- queue_init(priv, &priv->l4ro.pageq, query.pqid, count, NULL);
+ queue_init(priv, &priv->l4ro.pageq, "pageq", query.pqid,
+ count, NULL);
priv->l4ro.pool = pool;
priv->l4ro.available = true;
@@ -1395,6 +1404,16 @@ vbus_enet_probe(struct vbus_device_proxy *vdev)
if (!dev)
return -ENOMEM;
+ /*
+ * establish our device-name early so we can incorporate it into
+ * the signal-path names, etc
+ */
+ rtnl_lock();
+
+ ret = dev_alloc_name(dev, dev->name);
+ if (ret < 0)
+ goto out_free;
+
priv = netdev_priv(dev);
spin_lock_init(&priv->lock);
@@ -1416,8 +1435,10 @@ vbus_enet_probe(struct vbus_device_proxy *vdev)
skb_queue_head_init(&priv->tx.outstanding);
- queue_init(priv, &priv->rxq, VENET_QUEUE_RX, rx_ringlen, rx_isr);
- queue_init(priv, &priv->tx.veq, VENET_QUEUE_TX, tx_ringlen, tx_isr);
+ queue_init(priv, &priv->rxq, "rx", VENET_QUEUE_RX, rx_ringlen,
+ rx_isr);
+ queue_init(priv, &priv->tx.veq, "tx", VENET_QUEUE_TX, tx_ringlen,
+ tx_isr);
rx_setup(priv);
tx_setup(priv);
@@ -1453,18 +1474,22 @@ vbus_enet_probe(struct vbus_device_proxy *vdev)
dev->features |= NETIF_F_HIGHDMA;
- ret = register_netdev(dev);
+ ret = register_netdevice(dev);
if (ret < 0) {
printk(KERN_INFO "VENET: error %i registering device \"%s\"\n",
ret, dev->name);
goto out_free;
}
+ rtnl_unlock();
+
vdev->priv = priv;
return 0;
out_free:
+ rtnl_unlock();
+
free_netdev(dev);
return ret;
diff --git a/drivers/vbus/bus-proxy.c b/drivers/vbus/bus-proxy.c
index 88cd904..5d34942 100644
--- a/drivers/vbus/bus-proxy.c
+++ b/drivers/vbus/bus-proxy.c
@@ -167,8 +167,8 @@ static struct ioq_ops vbus_driver_ioq_ops = {
};
-int vbus_driver_ioq_alloc(struct vbus_device_proxy *dev, int id, int prio,
- size_t count, struct ioq **ioq)
+int vbus_driver_ioq_alloc(struct vbus_device_proxy *dev, const char *name,
+ int id, int prio, size_t count, struct ioq **ioq)
{
struct ioq *_ioq;
struct ioq_ring_head *head = NULL;
@@ -188,7 +188,7 @@ int vbus_driver_ioq_alloc(struct vbus_device_proxy *dev, int id, int prio,
head->ver = IOQ_RING_VER;
head->count = count;
- ret = dev->ops->shm(dev, id, prio, head, len,
+ ret = dev->ops->shm(dev, name, id, prio, head, len,
&head->signal, &signal, 0);
if (ret < 0)
goto error;
diff --git a/drivers/vbus/pci-bridge.c b/drivers/vbus/pci-bridge.c
index 80718e6..fa77318 100644
--- a/drivers/vbus/pci-bridge.c
+++ b/drivers/vbus/pci-bridge.c
@@ -262,7 +262,8 @@ vbus_pci_device_close(struct vbus_device_proxy *vdev, int flags)
}
static int
-vbus_pci_device_shm(struct vbus_device_proxy *vdev, int id, int prio,
+vbus_pci_device_shm(struct vbus_device_proxy *vdev, const char *name,
+ int id, int prio,
void *ptr, size_t len,
struct shm_signal_desc *sdesc, struct shm_signal **signal,
int flags)
diff --git a/include/linux/vbus_driver.h b/include/linux/vbus_driver.h
index 9cfbf60..2b1dac4 100644
--- a/include/linux/vbus_driver.h
+++ b/include/linux/vbus_driver.h
@@ -34,7 +34,8 @@ struct vbus_driver;
struct vbus_device_proxy_ops {
int (*open)(struct vbus_device_proxy *dev, int version, int flags);
int (*close)(struct vbus_device_proxy *dev, int flags);
- int (*shm)(struct vbus_device_proxy *dev, int id, int prio,
+ int (*shm)(struct vbus_device_proxy *dev, const char *name,
+ int id, int prio,
void *ptr, size_t len,
struct shm_signal_desc *sigdesc, struct shm_signal **signal,
int flags);
@@ -74,7 +75,7 @@ void vbus_driver_unregister(struct vbus_driver *drv);
/*
* driver-side IOQ helper - allocates device-shm and maps an IOQ on it
*/
-int vbus_driver_ioq_alloc(struct vbus_device_proxy *dev, int id, int prio,
- size_t ringsize, struct ioq **ioq);
+int vbus_driver_ioq_alloc(struct vbus_device_proxy *dev, const char *name,
+ int id, int prio, size_t ringsize, struct ioq **ioq);
#endif /* _LINUX_VBUS_DRIVER_H */
^ permalink raw reply related [flat|nested] 3+ messages in thread
* [ALACRITYVM PATCH 2/2] vbus: register shm-signal events as standard Linux IRQ vectors
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
1 sibling, 0 replies; 3+ messages in thread
From: Gregory Haskins @ 2009-10-14 16:22 UTC (permalink / raw)
To: alacrityvm-devel; +Cc: linux-kernel
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,
¶ms, 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
^ permalink raw reply related [flat|nested] 3+ messages in thread
end of thread, other threads:[~2009-10-14 16:23 UTC | newest]
Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
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 ` [ALACRITYVM PATCH 2/2] vbus: register shm-signal events as standard Linux IRQ vectors Gregory Haskins
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.