Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]
Groups > linux.kernel > #1259119 > unrolled thread
| Started by | jakeo@microsoft.com |
|---|---|
| First post | 2015-10-30 00:50 +0100 |
| Last post | 2015-10-30 00:50 +0100 |
| Articles | 6 — 3 participants |
Back to article view | Back to linux.kernel
[PATCH v4 0/7] PCI: hv: New paravirtual PCI front-end for Hyper-V VMs jakeo@microsoft.com - 2015-10-30 00:50 +0100
[PATCH v4 5/7] PCI: irqdomain: Look up IRQ domain by fwnode_handle jakeo@microsoft.com - 2015-10-30 00:50 +0100
Re: [PATCH v4 5/7] PCI: irqdomain: Look up IRQ domain by fwnode_handle Andy Shevchenko <andy.shevchenko@gmail.com> - 2015-10-30 01:30 +0100
RE: [PATCH v4 5/7] PCI: irqdomain: Look up IRQ domain by fwnode_handle Jake Oshins <jakeo@microsoft.com> - 2015-10-30 17:20 +0100
[PATCH v4 3/7] PCI: Make it possible to implement a PCI MSI IRQ Domain in a module. jakeo@microsoft.com - 2015-10-30 00:50 +0100
[PATCH v4 2/7] drivers:hv: Export hv_do_hypercall() jakeo@microsoft.com - 2015-10-30 00:50 +0100
| From | jakeo@microsoft.com |
|---|---|
| Date | 2015-10-30 00:50 +0100 |
| Subject | [PATCH v4 0/7] PCI: hv: New paravirtual PCI front-end for Hyper-V VMs |
| Message-ID | <qp57c-6Mj-17@gated-at.bofh.it> |
From: Jake Oshins <jakeo@microsoft.com>
This patch series incorporates feedback from Gerry Liu
(jiang.liu@linux.intel.com).
First, export functions that allow correlating Hyper-V virtual processors
and Linux cpus, along with the means for invoking a hypercall that targets
interrupts at chosen vectors on specfic cpus.
Second, mark various parts of IRQ domain related code as exported, so that
this PCI front-end can implement an IRQ domain as part of a module. (The
alternative would be to pull all this into the kernel, which would pull
in a lot of other Hyper-V related code, as this IRQ domain depends on
hv_vmbus.ko.)
Third, modify PCI so that new root PCI buses can be marked with an associated
fwnode_handle, and so that root PCI buses can look up their associated IRQ
domain by that handle.
Fourth, introduce a new driver, hv_pcifront, which eposes root PCI buses in
a Hyper-V VM. These root PCI buses expose real PCIe devices, or PCI Virtual
Functions.
Jake Oshins (7):
drivers:hv: Export a function that maps Linux CPU num onto Hyper-V
proc num
drivers:hv: Export hv_do_hypercall()
PCI: Make it possible to implement a PCI MSI IRQ Domain in a module.
PCI: Add fwnode_handle to pci_sysdata
PCI: irqdomain: Look up IRQ domain by fwnode_handle
drivers:hv: Define the channel type for Hyper-V PCI Express
pass-through
PCI: hv: New paravirtual PCI front-end for Hyper-V VMs
MAINTAINERS | 1 +
arch/x86/include/asm/msi.h | 4 +
arch/x86/include/asm/pci.h | 11 +
arch/x86/kernel/apic/msi.c | 5 +-
arch/x86/kernel/apic/vector.c | 2 +
drivers/hv/hv.c | 20 +-
drivers/hv/hyperv_vmbus.h | 2 +-
drivers/hv/vmbus_drv.c | 17 +
drivers/pci/Kconfig | 7 +
drivers/pci/host/Makefile | 1 +
drivers/pci/host/hv_pcifront.c | 2267 ++++++++++++++++++++++++++++++++++++++++
drivers/pci/msi.c | 4 +
drivers/pci/probe.c | 13 +
include/linux/hyperv.h | 14 +
kernel/irq/chip.c | 1 +
kernel/irq/irqdomain.c | 2 +
16 files changed, 2358 insertions(+), 13 deletions(-)
create mode 100644 drivers/pci/host/hv_pcifront.c
--
1.9.1
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/
[toc] | [next] | [standalone]
| From | jakeo@microsoft.com |
|---|---|
| Date | 2015-10-30 00:50 +0100 |
| Subject | [PATCH v4 5/7] PCI: irqdomain: Look up IRQ domain by fwnode_handle |
| Message-ID | <qp57d-6Mj-39@gated-at.bofh.it> |
| In reply to | #1259119 |
From: Jake Oshins <jakeo@microsoft.com>
This patch adds a second way of finding an IRQ domain associated with
a root PCI bus. After looking to see if one can be found through
the OF tree, it attempts to look up the IRQ domain through an
fwnode_handle stored in the pci_sysdata struct.
Signed-off-by: Jake Oshins <jakeo@microsoft.com>
---
drivers/pci/probe.c | 13 +++++++++++++
1 file changed, 13 insertions(+)
diff --git a/drivers/pci/probe.c b/drivers/pci/probe.c
index f441d1b..3d5d7d6 100644
--- a/drivers/pci/probe.c
+++ b/drivers/pci/probe.c
@@ -671,6 +671,19 @@ static struct irq_domain *pci_host_bridge_msi_domain(struct pci_bus *bus)
*/
d = pci_host_bridge_of_msi_domain(bus);
+#ifdef CONFIG_PCI_MSI_IRQ_DOMAIN
+ /*
+ * If no IRQ domain was found via the OF tree, try looking it up
+ * directly through the fwnode_handle.
+ */
+ if (!d) {
+ if (pci_fwnode(bus)) {
+ d = irq_find_matching_fwnode(pci_fwnode(bus),
+ DOMAIN_BUS_PCI_MSI);
+ }
+ }
+#endif
+
return d;
}
--
1.9.1
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/
[toc] | [prev] | [next] | [standalone]
| From | Andy Shevchenko <andy.shevchenko@gmail.com> |
|---|---|
| Date | 2015-10-30 01:30 +0100 |
| Subject | Re: [PATCH v4 5/7] PCI: irqdomain: Look up IRQ domain by fwnode_handle |
| Message-ID | <qp5JU-7eP-5@gated-at.bofh.it> |
| In reply to | #1259122 |
On Fri, Oct 30, 2015 at 1:46 AM, <jakeo@microsoft.com> wrote:
> From: Jake Oshins <jakeo@microsoft.com>
>
> This patch adds a second way of finding an IRQ domain associated with
> a root PCI bus. After looking to see if one can be found through
> the OF tree, it attempts to look up the IRQ domain through an
> fwnode_handle stored in the pci_sysdata struct.
> +#ifdef CONFIG_PCI_MSI_IRQ_DOMAIN
> + /*
> + * If no IRQ domain was found via the OF tree, try looking it up
> + * directly through the fwnode_handle.
> + */
> + if (!d) {
> + if (pci_fwnode(bus)) {
Isn't it the same to
if (!d && pci_fwnode(bus))
d = ...
?
> + d = irq_find_matching_fwnode(pci_fwnode(bus),
> + DOMAIN_BUS_PCI_MSI);
> + }
> + }
> +#endif
--
With Best Regards,
Andy Shevchenko
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/
[toc] | [prev] | [next] | [standalone]
| From | Jake Oshins <jakeo@microsoft.com> |
|---|---|
| Date | 2015-10-30 17:20 +0100 |
| Subject | RE: [PATCH v4 5/7] PCI: irqdomain: Look up IRQ domain by fwnode_handle |
| Message-ID | <qpkzg-81c-17@gated-at.bofh.it> |
| In reply to | #1259135 |
PiAtLS0tLU9yaWdpbmFsIE1lc3NhZ2UtLS0tLQ0KPiBGcm9tOiBBbmR5IFNoZXZjaGVua28gW21h aWx0bzphbmR5LnNoZXZjaGVua29AZ21haWwuY29tXQ0KPiBTZW50OiBUaHVyc2RheSwgT2N0b2Jl ciAyOSwgMjAxNSA1OjI4IFBNDQo+IFRvOiBKYWtlIE9zaGlucyA8amFrZW9AbWljcm9zb2Z0LmNv bT4NCj4gQ2M6IEdyZWcgS3JvYWgtSGFydG1hbiA8Z3JlZ2toQGxpbnV4Zm91bmRhdGlvbi5vcmc+ OyBLWSBTcmluaXZhc2FuDQo+IDxreXNAbWljcm9zb2Z0LmNvbT47IGxpbnV4LWtlcm5lbEB2Z2Vy Lmtlcm5lbC5vcmc7DQo+IGRldmVsQGxpbnV4ZHJpdmVycHJvamVjdC5vcmc7IG9sYWZAYWVwZmxl LmRlOyBhcHdAY2Fub25pY2FsLmNvbTsgVml0YWx5DQo+IEt1em5ldHNvdiA8dmt1em5ldHNAcmVk aGF0LmNvbT47IHRnbHhAcmVkaGF0LmNvbTsgSGFpeWFuZyBaaGFuZw0KPiA8aGFpeWFuZ3pAbWlj cm9zb2Z0LmNvbT47IG1hcmMuenluZ2llckBhcm0uY29tOyBKaWFuZyBMaXUNCj4gPGppYW5nLmxp dUBsaW51eC5pbnRlbC5jb20+OyBCam9ybiBIZWxnYWFzIDxiaGVsZ2Fhc0Bnb29nbGUuY29tPjsg bGludXgtDQo+IHBjaUB2Z2VyLmtlcm5lbC5vcmcNCj4gU3ViamVjdDogUmU6IFtQQVRDSCB2NCA1 LzddIFBDSTogaXJxZG9tYWluOiBMb29rIHVwIElSUSBkb21haW4gYnkNCj4gZndub2RlX2hhbmRs ZQ0KPiANCj4gT24gRnJpLCBPY3QgMzAsIDIwMTUgYXQgMTo0NiBBTSwgIDxqYWtlb0BtaWNyb3Nv ZnQuY29tPiB3cm90ZToNCj4gPiBGcm9tOiBKYWtlIE9zaGlucyA8amFrZW9AbWljcm9zb2Z0LmNv bT4NCj4gPg0KPiA+IFRoaXMgcGF0Y2ggYWRkcyBhIHNlY29uZCB3YXkgb2YgZmluZGluZyBhbiBJ UlEgZG9tYWluIGFzc29jaWF0ZWQgd2l0aA0KPiA+IGEgcm9vdCBQQ0kgYnVzLiAgQWZ0ZXIgbG9v a2luZyB0byBzZWUgaWYgb25lIGNhbiBiZSBmb3VuZCB0aHJvdWdoDQo+ID4gdGhlIE9GIHRyZWUs IGl0IGF0dGVtcHRzIHRvIGxvb2sgdXAgdGhlIElSUSBkb21haW4gdGhyb3VnaCBhbg0KPiA+IGZ3 bm9kZV9oYW5kbGUgc3RvcmVkIGluIHRoZSBwY2lfc3lzZGF0YSBzdHJ1Y3QuDQo+IA0KPiANCj4g PiArI2lmZGVmIENPTkZJR19QQ0lfTVNJX0lSUV9ET01BSU4NCj4gPiArICAgICAgIC8qDQo+ID4g KyAgICAgICAgKiBJZiBubyBJUlEgZG9tYWluIHdhcyBmb3VuZCB2aWEgdGhlIE9GIHRyZWUsIHRy eSBsb29raW5nIGl0IHVwDQo+ID4gKyAgICAgICAgKiBkaXJlY3RseSB0aHJvdWdoIHRoZSBmd25v ZGVfaGFuZGxlLg0KPiA+ICsgICAgICAgICovDQo+ID4gKyAgICAgICBpZiAoIWQpIHsNCj4gPiAr ICAgICAgICAgICAgICAgaWYgKHBjaV9md25vZGUoYnVzKSkgew0KPiANCj4gSXNuJ3QgaXQgdGhl IHNhbWUgdG8NCj4gaWYgKCFkICYmIHBjaV9md25vZGUoYnVzKSkNCj4gIGQgPSAuLi4NCj4gDQoN ClRoYW5rcy4gIEknbGwgbWFrZSB0aGlzIGNoYW5nZSBhbmQgcmVzZW5kLg0KDQotLSBKYWtlIE9z aGlucw0K -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
[toc] | [prev] | [next] | [standalone]
| From | jakeo@microsoft.com |
|---|---|
| Date | 2015-10-30 00:50 +0100 |
| Subject | [PATCH v4 3/7] PCI: Make it possible to implement a PCI MSI IRQ Domain in a module. |
| Message-ID | <qp57d-6Mj-41@gated-at.bofh.it> |
| In reply to | #1259119 |
From: Jake Oshins <jakeo@microsoft.com>
The Linux kernel already has the concpet of IRQ domain, whereing a component
can expose a set of IRQs which are managed by a particular interrupt controller
chip or other subsystem. The PCI driver exposes the notion of an IRQ domain
for Message-Signaled Interrupts (MSI) from PCI Express devices. This patch
exposes the functions which are necessary for making an MSI IRQ domain within
a module.
Signed-off-by: Jake Oshins <jakeo@microsoft.com>
---
arch/x86/include/asm/msi.h | 4 ++++
arch/x86/kernel/apic/msi.c | 5 +++--
arch/x86/kernel/apic/vector.c | 2 ++
drivers/pci/msi.c | 4 ++++
kernel/irq/chip.c | 1 +
kernel/irq/irqdomain.c | 2 ++
6 files changed, 16 insertions(+), 2 deletions(-)
diff --git a/arch/x86/include/asm/msi.h b/arch/x86/include/asm/msi.h
index 93724cc..e8b7924 100644
--- a/arch/x86/include/asm/msi.h
+++ b/arch/x86/include/asm/msi.h
@@ -1,7 +1,11 @@
#ifndef _ASM_X86_MSI_H
#define _ASM_X86_MSI_H
#include <asm/hw_irq.h>
+#include <asm/irqdomain.h>
typedef struct irq_alloc_info msi_alloc_info_t;
+int pci_msi_prepare(struct irq_domain *domain, struct device *dev, int nvec,
+ msi_alloc_info_t *arg);
+
#endif /* _ASM_X86_MSI_H */
diff --git a/arch/x86/kernel/apic/msi.c b/arch/x86/kernel/apic/msi.c
index 5f1feb6..bdb28fc 100644
--- a/arch/x86/kernel/apic/msi.c
+++ b/arch/x86/kernel/apic/msi.c
@@ -96,8 +96,8 @@ static irq_hw_number_t pci_msi_get_hwirq(struct msi_domain_info *info,
return arg->msi_hwirq;
}
-static int pci_msi_prepare(struct irq_domain *domain, struct device *dev,
- int nvec, msi_alloc_info_t *arg)
+int pci_msi_prepare(struct irq_domain *domain, struct device *dev, int nvec,
+ msi_alloc_info_t *arg)
{
struct pci_dev *pdev = to_pci_dev(dev);
struct msi_desc *desc = first_pci_msi_entry(pdev);
@@ -113,6 +113,7 @@ static int pci_msi_prepare(struct irq_domain *domain, struct device *dev,
return 0;
}
+EXPORT_SYMBOL_GPL(pci_msi_prepare);
static void pci_msi_set_desc(msi_alloc_info_t *arg, struct msi_desc *desc)
{
diff --git a/arch/x86/kernel/apic/vector.c b/arch/x86/kernel/apic/vector.c
index 836d11b..f3ac5e1 100644
--- a/arch/x86/kernel/apic/vector.c
+++ b/arch/x86/kernel/apic/vector.c
@@ -29,6 +29,7 @@ struct apic_chip_data {
};
struct irq_domain *x86_vector_domain;
+EXPORT_SYMBOL_GPL(x86_vector_domain);
static DEFINE_RAW_SPINLOCK(vector_lock);
static cpumask_var_t vector_cpumask;
static struct irq_chip lapic_controller;
@@ -66,6 +67,7 @@ struct irq_cfg *irqd_cfg(struct irq_data *irq_data)
return data ? &data->cfg : NULL;
}
+EXPORT_SYMBOL_GPL(irqd_cfg);
struct irq_cfg *irq_cfg(unsigned int irq)
{
diff --git a/drivers/pci/msi.c b/drivers/pci/msi.c
index 53e4632..3915a99 100644
--- a/drivers/pci/msi.c
+++ b/drivers/pci/msi.c
@@ -257,6 +257,7 @@ void pci_msi_mask_irq(struct irq_data *data)
{
msi_set_mask_bit(data, 1);
}
+EXPORT_SYMBOL_GPL(pci_msi_mask_irq);
/**
* pci_msi_unmask_irq - Generic irq chip callback to unmask PCI/MSI interrupts
@@ -266,6 +267,7 @@ void pci_msi_unmask_irq(struct irq_data *data)
{
msi_set_mask_bit(data, 0);
}
+EXPORT_SYMBOL_GPL(pci_msi_unmask_irq);
void default_restore_msi_irqs(struct pci_dev *dev)
{
@@ -1126,6 +1128,7 @@ struct pci_dev *msi_desc_to_pci_dev(struct msi_desc *desc)
{
return to_pci_dev(desc->dev);
}
+EXPORT_SYMBOL(msi_desc_to_pci_dev);
void *msi_desc_to_pci_sysdata(struct msi_desc *desc)
{
@@ -1285,6 +1288,7 @@ struct irq_domain *pci_msi_create_irq_domain(struct fwnode_handle *fwnode,
domain->bus_token = DOMAIN_BUS_PCI_MSI;
return domain;
}
+EXPORT_SYMBOL_GPL(pci_msi_create_irq_domain);
/**
* pci_msi_domain_alloc_irqs - Allocate interrupts for @dev in @domain
diff --git a/kernel/irq/chip.c b/kernel/irq/chip.c
index 1520645..2414775 100644
--- a/kernel/irq/chip.c
+++ b/kernel/irq/chip.c
@@ -950,6 +950,7 @@ void irq_chip_ack_parent(struct irq_data *data)
data = data->parent_data;
data->chip->irq_ack(data);
}
+EXPORT_SYMBOL_GPL(irq_chip_ack_parent);
/**
* irq_chip_mask_parent - Mask the parent interrupt
diff --git a/kernel/irq/irqdomain.c b/kernel/irq/irqdomain.c
index 22aa961..174d7e0 100644
--- a/kernel/irq/irqdomain.c
+++ b/kernel/irq/irqdomain.c
@@ -60,6 +60,7 @@ struct fwnode_handle *irq_domain_alloc_fwnode(void *data)
fwid->fwnode.type = FWNODE_IRQCHIP;
return &fwid->fwnode;
}
+EXPORT_SYMBOL_GPL(irq_domain_alloc_fwnode);
/**
* irq_domain_free_fwnode - Free a non-OF-backed fwnode_handle
@@ -77,6 +78,7 @@ void irq_domain_free_fwnode(struct fwnode_handle *fwnode)
kfree(fwid->name);
kfree(fwid);
}
+EXPORT_SYMBOL_GPL(irq_domain_free_fwnode);
/**
* __irq_domain_add() - Allocate a new irq_domain data structure
--
1.9.1
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/
[toc] | [prev] | [next] | [standalone]
| From | jakeo@microsoft.com |
|---|---|
| Date | 2015-10-30 00:50 +0100 |
| Subject | [PATCH v4 2/7] drivers:hv: Export hv_do_hypercall() |
| Message-ID | <qp57d-6Mj-47@gated-at.bofh.it> |
| In reply to | #1259119 |
From: Jake Oshins <jakeo@microsoft.com>
This patch exposes the function that hv_vmbus.ko uses to make hypercalls. This
is necessary for retargeting an interrupt when it is given a new affinity and
vector.
Signed-off-by: Jake Oshins <jakeo@microsoft.com>
---
drivers/hv/hv.c | 20 ++++++++++----------
drivers/hv/hyperv_vmbus.h | 2 +-
include/linux/hyperv.h | 1 +
3 files changed, 12 insertions(+), 11 deletions(-)
diff --git a/drivers/hv/hv.c b/drivers/hv/hv.c
index 6341be8..7a06933 100644
--- a/drivers/hv/hv.c
+++ b/drivers/hv/hv.c
@@ -89,9 +89,9 @@ static int query_hypervisor_info(void)
}
/*
- * do_hypercall- Invoke the specified hypercall
+ * hv_do_hypercall- Invoke the specified hypercall
*/
-static u64 do_hypercall(u64 control, void *input, void *output)
+u64 hv_do_hypercall(u64 control, void *input, void *output)
{
u64 input_address = (input) ? virt_to_phys(input) : 0;
u64 output_address = (output) ? virt_to_phys(output) : 0;
@@ -132,6 +132,7 @@ static u64 do_hypercall(u64 control, void *input, void *output)
return hv_status_lo | ((u64)hv_status_hi << 32);
#endif /* !x86_64 */
}
+EXPORT_SYMBOL_GPL(hv_do_hypercall);
#ifdef CONFIG_X86_64
static cycle_t read_hv_clock_tsc(struct clocksource *arg)
@@ -315,7 +316,7 @@ int hv_post_message(union hv_connection_id connection_id,
{
struct hv_input_post_message *aligned_msg;
- u16 status;
+ u64 status;
if (payload_size > HV_MESSAGE_PAYLOAD_BYTE_COUNT)
return -EMSGSIZE;
@@ -329,11 +330,10 @@ int hv_post_message(union hv_connection_id connection_id,
aligned_msg->payload_size = payload_size;
memcpy((void *)aligned_msg->payload, payload, payload_size);
- status = do_hypercall(HVCALL_POST_MESSAGE, aligned_msg, NULL)
- & 0xFFFF;
+ status = hv_do_hypercall(HVCALL_POST_MESSAGE, aligned_msg, NULL);
put_cpu();
- return status;
+ return status & 0xFFFF;
}
@@ -343,13 +343,13 @@ int hv_post_message(union hv_connection_id connection_id,
*
* This involves a hypercall.
*/
-u16 hv_signal_event(void *con_id)
+int hv_signal_event(void *con_id)
{
- u16 status;
+ u64 status;
- status = (do_hypercall(HVCALL_SIGNAL_EVENT, con_id, NULL) & 0xFFFF);
+ status = hv_do_hypercall(HVCALL_SIGNAL_EVENT, con_id, NULL);
- return status;
+ return status & 0xFFFF;
}
static int hv_ce_set_next_event(unsigned long delta,
diff --git a/drivers/hv/hyperv_vmbus.h b/drivers/hv/hyperv_vmbus.h
index 3d70e36..18c66fc 100644
--- a/drivers/hv/hyperv_vmbus.h
+++ b/drivers/hv/hyperv_vmbus.h
@@ -587,7 +587,7 @@ extern int hv_post_message(union hv_connection_id connection_id,
enum hv_message_type message_type,
void *payload, size_t payload_size);
-extern u16 hv_signal_event(void *con_id);
+extern int hv_signal_event(void *con_id);
extern int hv_synic_alloc(void);
diff --git a/include/linux/hyperv.h b/include/linux/hyperv.h
index 02393b6..ea0a0e3 100644
--- a/include/linux/hyperv.h
+++ b/include/linux/hyperv.h
@@ -983,6 +983,7 @@ int vmbus_allocate_mmio(struct resource **new, struct hv_device *device_obj,
bool fb_overlap_ok);
int vmbus_cpu_number_to_vp_number(int cpu_number);
+u64 hv_do_hypercall(u64 control, void *input, void *output);
/**
* VMBUS_DEVICE - macro used to describe a specific hyperv vmbus device
--
1.9.1
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/
[toc] | [prev] | [standalone]
Back to top | Article view | linux.kernel
csiph-web