* [gentoo-commits] linux-patches r2074 - genpatches-2.6/trunk/3.2
@ 2012-01-30 21:07 Mike Pagano (mpagano)
0 siblings, 0 replies; only message in thread
From: Mike Pagano (mpagano) @ 2012-01-30 21:07 UTC (permalink / raw
To: gentoo-commits
Author: mpagano
Date: 2012-01-30 21:07:06 +0000 (Mon, 30 Jan 2012)
New Revision: 2074
Removed:
genpatches-2.6/trunk/3.2/2400_kcopy-patch-for-infiniband-driver.patch
Log:
Removed kcopy patch. Will recommit with fixed patch when provided
Deleted: genpatches-2.6/trunk/3.2/2400_kcopy-patch-for-infiniband-driver.patch
===================================================================
--- genpatches-2.6/trunk/3.2/2400_kcopy-patch-for-infiniband-driver.patch 2012-01-30 21:05:01 UTC (rev 2073)
+++ genpatches-2.6/trunk/3.2/2400_kcopy-patch-for-infiniband-driver.patch 2012-01-30 21:07:06 UTC (rev 2074)
@@ -1,719 +0,0 @@
-From 3b2e8091390000a15bdceccb57a6e3956a751134 Mon Sep 17 00:00:00 2001
-From: Alexey Shvetsov <alexxy@gentoo.org>
-Date: Tue, 17 Jan 2012 21:08:49 +0400
-Subject: [PATCH] [kcopy] Add kcopy driver
-
-Add kcopy driver from qlogic to implement zero copy for infiniband psm
-userspace driver
-
-Signed-off-by: Alexey Shvetsov <alexxy@gentoo.org>
----
-
-diff --git a/drivers/char/Kconfig b/drivers/char/Kconfig
-index 4364303..f206545 100644
---- a/drivers/char/Kconfig
-+++ b/drivers/char/Kconfig
-@@ -6,6 +6,8 @@ menu "Character devices"
-
- source "drivers/tty/Kconfig"
-
-+source "drivers/char/kcopy/Kconfig"
-+
- config DEVKMEM
- bool "/dev/kmem virtual device support"
- default y
---- a/drivers/char/Makefile 2012-01-26 12:01:22.564709470 -0500
-+++ b/drivers/char/Makefile 2012-01-26 12:01:42.632906542 -0500
-@@ -2,6 +2,7 @@
- # Makefile for the kernel character device drivers.
- #
-
-+obj-$(CONFIG_KCOPY) += kcopy.o
- obj-y += mem.o random.o
- obj-$(CONFIG_TTY_PRINTK) += ttyprintk.o
- obj-y += misc.o
-diff --git a/drivers/char/kcopy/Kconfig b/drivers/char/kcopy/Kconfig
-new file mode 100644
-index 0000000..453ae52
---- /dev/null
-+++ b/drivers/char/kcopy/Kconfig
-@@ -0,0 +1,17 @@
-+#
-+# KCopy character device configuration
-+#
-+
-+menu "KCopy"
-+
-+config KCOPY
-+ tristate "Memory-to-memory copies using kernel assist"
-+ default m
-+ ---help---
-+ High-performance inter-process memory copies. Can often save a
-+ memory copy to shared memory in the application. Useful at least
-+ for MPI applications where the point-to-point nature of vmsplice
-+ and pipes can be a limiting factor in performance.
-+
-+endmenu
-+
-diff --git a/drivers/char/kcopy/Makefile b/drivers/char/kcopy/Makefile
-new file mode 100644
-index 0000000..9cb269b
---- /dev/null
-+++ b/drivers/char/kcopy/Makefile
-@@ -0,0 +1,4 @@
-+#
-+# Makefile for the kernel character device drivers.
-+#
-+obj-$(CONFIG_KCOPY) += kcopy.o
-diff --git a/drivers/char/kcopy/kcopy.c b/drivers/char/kcopy/kcopy.c
-new file mode 100644
-index 0000000..a9f915c
---- /dev/null
-+++ b/drivers/char/kcopy/kcopy.c
-@@ -0,0 +1,646 @@
-+#include <linux/module.h>
-+#include <linux/fs.h>
-+#include <linux/cdev.h>
-+#include <linux/device.h>
-+#include <linux/mutex.h>
-+#include <linux/mman.h>
-+#include <linux/highmem.h>
-+#include <linux/spinlock.h>
-+#include <linux/sched.h>
-+#include <linux/rbtree.h>
-+#include <linux/rcupdate.h>
-+#include <linux/uaccess.h>
-+#include <linux/slab.h>
-+
-+MODULE_LICENSE("GPL");
-+MODULE_AUTHOR("Arthur Jones <arthur.jones@qlogic.com>");
-+MODULE_DESCRIPTION("QLogic kcopy driver");
-+
-+#define KCOPY_ABI 1
-+#define KCOPY_MAX_MINORS 64
-+
-+struct kcopy_device {
-+ struct cdev cdev;
-+ struct class *class;
-+ struct device *devp[KCOPY_MAX_MINORS];
-+ dev_t dev;
-+
-+ struct kcopy_file *kf[KCOPY_MAX_MINORS];
-+ struct mutex open_lock;
-+};
-+
-+static struct kcopy_device kcopy_dev;
-+
-+/* per file data / one of these is shared per minor */
-+struct kcopy_file {
-+ int count;
-+
-+ /* pid indexed */
-+ struct rb_root live_map_tree;
-+
-+ struct mutex map_lock;
-+};
-+
-+struct kcopy_map_entry {
-+ int count;
-+ struct task_struct *task;
-+ pid_t pid;
-+ struct kcopy_file *file; /* file backpointer */
-+
-+ struct list_head list; /* free map list */
-+ struct rb_node node; /* live map tree */
-+};
-+
-+#define KCOPY_GET_SYSCALL 1
-+#define KCOPY_PUT_SYSCALL 2
-+#define KCOPY_ABI_SYSCALL 3
-+
-+struct kcopy_syscall {
-+ __u32 tag;
-+ pid_t pid;
-+ __u64 n;
-+ __u64 src;
-+ __u64 dst;
-+};
-+
-+static const void __user *kcopy_syscall_src(const struct kcopy_syscall *ks)
-+{
-+ return (const void __user *) (unsigned long) ks->src;
-+}
-+
-+static void __user *kcopy_syscall_dst(const struct kcopy_syscall *ks)
-+{
-+ return (void __user *) (unsigned long) ks->dst;
-+}
-+
-+static unsigned long kcopy_syscall_n(const struct kcopy_syscall *ks)
-+{
-+ return (unsigned long) ks->n;
-+}
-+
-+static struct kcopy_map_entry *kcopy_create_entry(struct kcopy_file *file)
-+{
-+ struct kcopy_map_entry *kme =
-+ kmalloc(sizeof(struct kcopy_map_entry), GFP_KERNEL);
-+
-+ if (!kme)
-+ return NULL;
-+
-+ kme->count = 1;
-+ kme->file = file;
-+ kme->task = current;
-+ kme->pid = current->tgid;
-+ INIT_LIST_HEAD(&kme->list);
-+
-+ return kme;
-+}
-+
-+static struct kcopy_map_entry *
-+kcopy_lookup_pid(struct rb_root *root, pid_t pid)
-+{
-+ struct rb_node *node = root->rb_node;
-+
-+ while (node) {
-+ struct kcopy_map_entry *kme =
-+ container_of(node, struct kcopy_map_entry, node);
-+
-+ if (pid < kme->pid)
-+ node = node->rb_left;
-+ else if (pid > kme->pid)
-+ node = node->rb_right;
-+ else
-+ return kme;
-+ }
-+
-+ return NULL;
-+}
-+
-+static int kcopy_insert(struct rb_root *root, struct kcopy_map_entry *kme)
-+{
-+ struct rb_node **new = &(root->rb_node);
-+ struct rb_node *parent = NULL;
-+
-+ while (*new) {
-+ struct kcopy_map_entry *tkme =
-+ container_of(*new, struct kcopy_map_entry, node);
-+
-+ parent = *new;
-+ if (kme->pid < tkme->pid)
-+ new = &((*new)->rb_left);
-+ else if (kme->pid > tkme->pid)
-+ new = &((*new)->rb_right);
-+ else {
-+ printk(KERN_INFO "!!! debugging: bad rb tree !!!\n");
-+ return -EINVAL;
-+ }
-+ }
-+
-+ rb_link_node(&kme->node, parent, new);
-+ rb_insert_color(&kme->node, root);
-+
-+ return 0;
-+}
-+
-+static int kcopy_open(struct inode *inode, struct file *filp)
-+{
-+ int ret;
-+ const int minor = iminor(inode);
-+ struct kcopy_file *kf = NULL;
-+ struct kcopy_map_entry *kme;
-+ struct kcopy_map_entry *okme;
-+
-+ if (minor < 0 || minor >= KCOPY_MAX_MINORS)
-+ return -ENODEV;
-+
-+ mutex_lock(&kcopy_dev.open_lock);
-+
-+ if (!kcopy_dev.kf[minor]) {
-+ kf = kmalloc(sizeof(struct kcopy_file), GFP_KERNEL);
-+
-+ if (!kf) {
-+ ret = -ENOMEM;
-+ goto bail;
-+ }
-+
-+ kf->count = 1;
-+ kf->live_map_tree = RB_ROOT;
-+ mutex_init(&kf->map_lock);
-+ kcopy_dev.kf[minor] = kf;
-+ } else {
-+ if (filp->f_flags & O_EXCL) {
-+ ret = -EBUSY;
-+ goto bail;
-+ }
-+ kcopy_dev.kf[minor]->count++;
-+ }
-+
-+ kme = kcopy_create_entry(kcopy_dev.kf[minor]);
-+ if (!kme) {
-+ ret = -ENOMEM;
-+ goto err_free_kf;
-+ }
-+
-+ kf = kcopy_dev.kf[minor];
-+
-+ mutex_lock(&kf->map_lock);
-+
-+ okme = kcopy_lookup_pid(&kf->live_map_tree, kme->pid);
-+ if (okme) {
-+ /* pid already exists... */
-+ okme->count++;
-+ kfree(kme);
-+ kme = okme;
-+ } else
-+ ret = kcopy_insert(&kf->live_map_tree, kme);
-+
-+ mutex_unlock(&kf->map_lock);
-+
-+ filp->private_data = kme;
-+
-+ ret = 0;
-+ goto bail;
-+
-+err_free_kf:
-+ if (kf) {
-+ kcopy_dev.kf[minor] = NULL;
-+ kfree(kf);
-+ }
-+bail:
-+ mutex_unlock(&kcopy_dev.open_lock);
-+ return ret;
-+}
-+
-+static int kcopy_flush(struct file *filp, fl_owner_t id)
-+{
-+ struct kcopy_map_entry *kme = filp->private_data;
-+ struct kcopy_file *kf = kme->file;
-+
-+ if (file_count(filp) == 1) {
-+ mutex_lock(&kf->map_lock);
-+ kme->count--;
-+
-+ if (!kme->count) {
-+ rb_erase(&kme->node, &kf->live_map_tree);
-+ kfree(kme);
-+ }
-+ mutex_unlock(&kf->map_lock);
-+ }
-+
-+ return 0;
-+}
-+
-+static int kcopy_release(struct inode *inode, struct file *filp)
-+{
-+ const int minor = iminor(inode);
-+
-+ mutex_lock(&kcopy_dev.open_lock);
-+ kcopy_dev.kf[minor]->count--;
-+ if (!kcopy_dev.kf[minor]->count) {
-+ kfree(kcopy_dev.kf[minor]);
-+ kcopy_dev.kf[minor] = NULL;
-+ }
-+ mutex_unlock(&kcopy_dev.open_lock);
-+
-+ return 0;
-+}
-+
-+static void kcopy_put_pages(struct page **pages, int npages)
-+{
-+ int j;
-+
-+ for (j = 0; j < npages; j++)
-+ put_page(pages[j]);
-+}
-+
-+static int kcopy_validate_task(struct task_struct *p)
-+{
-+ return p && ((current_euid() == task_euid(p)) || (current_euid() == task_uid(p)));
-+}
-+
-+static int kcopy_get_pages(struct kcopy_file *kf, pid_t pid,
-+ struct page **pages, void __user *addr,
-+ int write, size_t npages)
-+{
-+ int err;
-+ struct mm_struct *mm;
-+ struct kcopy_map_entry *rkme;
-+
-+ mutex_lock(&kf->map_lock);
-+
-+ rkme = kcopy_lookup_pid(&kf->live_map_tree, pid);
-+ if (!rkme || !kcopy_validate_task(rkme->task)) {
-+ err = -EINVAL;
-+ goto bail_unlock;
-+ }
-+
-+ mm = get_task_mm(rkme->task);
-+ if (unlikely(!mm)) {
-+ err = -ENOMEM;
-+ goto bail_unlock;
-+ }
-+
-+ down_read(&mm->mmap_sem);
-+ err = get_user_pages(rkme->task, mm,
-+ (unsigned long) addr, npages, write, 0,
-+ pages, NULL);
-+
-+ if (err < npages && err > 0) {
-+ kcopy_put_pages(pages, err);
-+ err = -ENOMEM;
-+ } else if (err == npages)
-+ err = 0;
-+
-+ up_read(&mm->mmap_sem);
-+
-+ mmput(mm);
-+
-+bail_unlock:
-+ mutex_unlock(&kf->map_lock);
-+
-+ return err;
-+}
-+
-+static unsigned long kcopy_copy_pages_from_user(void __user *src,
-+ struct page **dpages,
-+ unsigned doff,
-+ unsigned long n)
-+{
-+ struct page *dpage = *dpages;
-+ char *daddr = kmap(dpage);
-+ int ret = 0;
-+
-+ while (1) {
-+ const unsigned long nleft = PAGE_SIZE - doff;
-+ const unsigned long nc = (n < nleft) ? n : nleft;
-+
-+ /* if (copy_from_user(daddr + doff, src, nc)) { */
-+ if (__copy_from_user_nocache(daddr + doff, src, nc)) {
-+ ret = -EFAULT;
-+ goto bail;
-+ }
-+
-+ n -= nc;
-+ if (n == 0)
-+ break;
-+
-+ doff += nc;
-+ doff &= ~PAGE_MASK;
-+ if (doff == 0) {
-+ kunmap(dpage);
-+ dpages++;
-+ dpage = *dpages;
-+ daddr = kmap(dpage);
-+ }
-+
-+ src += nc;
-+ }
-+
-+bail:
-+ kunmap(dpage);
-+
-+ return ret;
-+}
-+
-+static unsigned long kcopy_copy_pages_to_user(void __user *dst,
-+ struct page **spages,
-+ unsigned soff,
-+ unsigned long n)
-+{
-+ struct page *spage = *spages;
-+ const char *saddr = kmap(spage);
-+ int ret = 0;
-+
-+ while (1) {
-+ const unsigned long nleft = PAGE_SIZE - soff;
-+ const unsigned long nc = (n < nleft) ? n : nleft;
-+
-+ if (copy_to_user(dst, saddr + soff, nc)) {
-+ ret = -EFAULT;
-+ goto bail;
-+ }
-+
-+ n -= nc;
-+ if (n == 0)
-+ break;
-+
-+ soff += nc;
-+ soff &= ~PAGE_MASK;
-+ if (soff == 0) {
-+ kunmap(spage);
-+ spages++;
-+ spage = *spages;
-+ saddr = kmap(spage);
-+ }
-+
-+ dst += nc;
-+ }
-+
-+bail:
-+ kunmap(spage);
-+
-+ return ret;
-+}
-+
-+static unsigned long kcopy_copy_to_user(void __user *dst,
-+ struct kcopy_file *kf, pid_t pid,
-+ void __user *src,
-+ unsigned long n)
-+{
-+ struct page **pages;
-+ const int pages_len = PAGE_SIZE / sizeof(struct page *);
-+ int ret = 0;
-+
-+ pages = (struct page **) __get_free_page(GFP_KERNEL);
-+ if (!pages) {
-+ ret = -ENOMEM;
-+ goto bail;
-+ }
-+
-+ while (n) {
-+ const unsigned long soff = (unsigned long) src & ~PAGE_MASK;
-+ const unsigned long spages_left =
-+ (soff + n + PAGE_SIZE - 1) >> PAGE_SHIFT;
-+ const unsigned long spages_cp =
-+ min_t(unsigned long, spages_left, pages_len);
-+ const unsigned long sbytes =
-+ PAGE_SIZE - soff + (spages_cp - 1) * PAGE_SIZE;
-+ const unsigned long nbytes = min_t(unsigned long, sbytes, n);
-+
-+ ret = kcopy_get_pages(kf, pid, pages, src, 0, spages_cp);
-+ if (unlikely(ret))
-+ goto bail_free;
-+
-+ ret = kcopy_copy_pages_to_user(dst, pages, soff, nbytes);
-+ kcopy_put_pages(pages, spages_cp);
-+ if (ret)
-+ goto bail_free;
-+ dst = (char *) dst + nbytes;
-+ src = (char *) src + nbytes;
-+
-+ n -= nbytes;
-+ }
-+
-+bail_free:
-+ free_page((unsigned long) pages);
-+bail:
-+ return ret;
-+}
-+
-+static unsigned long kcopy_copy_from_user(const void __user *src,
-+ struct kcopy_file *kf, pid_t pid,
-+ void __user *dst,
-+ unsigned long n)
-+{
-+ struct page **pages;
-+ const int pages_len = PAGE_SIZE / sizeof(struct page *);
-+ int ret = 0;
-+
-+ pages = (struct page **) __get_free_page(GFP_KERNEL);
-+ if (!pages) {
-+ ret = -ENOMEM;
-+ goto bail;
-+ }
-+
-+ while (n) {
-+ const unsigned long doff = (unsigned long) dst & ~PAGE_MASK;
-+ const unsigned long dpages_left =
-+ (doff + n + PAGE_SIZE - 1) >> PAGE_SHIFT;
-+ const unsigned long dpages_cp =
-+ min_t(unsigned long, dpages_left, pages_len);
-+ const unsigned long dbytes =
-+ PAGE_SIZE - doff + (dpages_cp - 1) * PAGE_SIZE;
-+ const unsigned long nbytes = min_t(unsigned long, dbytes, n);
-+
-+ ret = kcopy_get_pages(kf, pid, pages, dst, 1, dpages_cp);
-+ if (unlikely(ret))
-+ goto bail_free;
-+
-+ ret = kcopy_copy_pages_from_user((void __user *) src,
-+ pages, doff, nbytes);
-+ kcopy_put_pages(pages, dpages_cp);
-+ if (ret)
-+ goto bail_free;
-+
-+ dst = (char *) dst + nbytes;
-+ src = (char *) src + nbytes;
-+
-+ n -= nbytes;
-+ }
-+
-+bail_free:
-+ free_page((unsigned long) pages);
-+bail:
-+ return ret;
-+}
-+
-+static int kcopy_do_get(struct kcopy_map_entry *kme, pid_t pid,
-+ const void __user *src, void __user *dst,
-+ unsigned long n)
-+{
-+ struct kcopy_file *kf = kme->file;
-+ int ret = 0;
-+
-+ if (n == 0) {
-+ ret = -EINVAL;
-+ goto bail;
-+ }
-+
-+ ret = kcopy_copy_to_user(dst, kf, pid, (void __user *) src, n);
-+
-+bail:
-+ return ret;
-+}
-+
-+static int kcopy_do_put(struct kcopy_map_entry *kme, const void __user *src,
-+ pid_t pid, void __user *dst,
-+ unsigned long n)
-+{
-+ struct kcopy_file *kf = kme->file;
-+ int ret = 0;
-+
-+ if (n == 0) {
-+ ret = -EINVAL;
-+ goto bail;
-+ }
-+
-+ ret = kcopy_copy_from_user(src, kf, pid, (void __user *) dst, n);
-+
-+bail:
-+ return ret;
-+}
-+
-+static int kcopy_do_abi(u32 __user *dst)
-+{
-+ u32 val = KCOPY_ABI;
-+ int err;
-+
-+ err = put_user(val, dst);
-+ if (err)
-+ return -EFAULT;
-+
-+ return 0;
-+}
-+
-+ssize_t kcopy_write(struct file *filp, const char __user *data, size_t cnt,
-+ loff_t *o)
-+{
-+ struct kcopy_map_entry *kme = filp->private_data;
-+ struct kcopy_syscall ks;
-+ int err = 0;
-+ const void __user *src;
-+ void __user *dst;
-+ unsigned long n;
-+
-+ if (cnt != sizeof(struct kcopy_syscall)) {
-+ err = -EINVAL;
-+ goto bail;
-+ }
-+
-+ err = copy_from_user(&ks, data, cnt);
-+ if (unlikely(err))
-+ goto bail;
-+
-+ src = kcopy_syscall_src(&ks);
-+ dst = kcopy_syscall_dst(&ks);
-+ n = kcopy_syscall_n(&ks);
-+ if (ks.tag == KCOPY_GET_SYSCALL)
-+ err = kcopy_do_get(kme, ks.pid, src, dst, n);
-+ else if (ks.tag == KCOPY_PUT_SYSCALL)
-+ err = kcopy_do_put(kme, src, ks.pid, dst, n);
-+ else if (ks.tag == KCOPY_ABI_SYSCALL)
-+ err = kcopy_do_abi(dst);
-+ else
-+ err = -EINVAL;
-+
-+bail:
-+ return err ? err : cnt;
-+}
-+
-+static const struct file_operations kcopy_fops = {
-+ .owner = THIS_MODULE,
-+ .open = kcopy_open,
-+ .release = kcopy_release,
-+ .flush = kcopy_flush,
-+ .write = kcopy_write,
-+};
-+
-+static int __init kcopy_init(void)
-+{
-+ int ret;
-+ const char *name = "kcopy";
-+ int i;
-+ int ninit = 0;
-+
-+ mutex_init(&kcopy_dev.open_lock);
-+
-+ ret = alloc_chrdev_region(&kcopy_dev.dev, 0, KCOPY_MAX_MINORS, name);
-+ if (ret)
-+ goto bail;
-+
-+ kcopy_dev.class = class_create(THIS_MODULE, (char *) name);
-+
-+ if (IS_ERR(kcopy_dev.class)) {
-+ ret = PTR_ERR(kcopy_dev.class);
-+ printk(KERN_ERR "kcopy: Could not create "
-+ "device class (err %d)\n", -ret);
-+ goto bail_chrdev;
-+ }
-+
-+ cdev_init(&kcopy_dev.cdev, &kcopy_fops);
-+ ret = cdev_add(&kcopy_dev.cdev, kcopy_dev.dev, KCOPY_MAX_MINORS);
-+ if (ret < 0) {
-+ printk(KERN_ERR "kcopy: Could not add cdev (err %d)\n",
-+ -ret);
-+ goto bail_class;
-+ }
-+
-+ for (i = 0; i < KCOPY_MAX_MINORS; i++) {
-+ char devname[8];
-+ const int minor = MINOR(kcopy_dev.dev) + i;
-+ const dev_t dev = MKDEV(MAJOR(kcopy_dev.dev), minor);
-+
-+ snprintf(devname, sizeof(devname), "kcopy%02d", i);
-+ kcopy_dev.devp[i] =
-+ device_create(kcopy_dev.class, NULL,
-+ dev, NULL, devname);
-+
-+ if (IS_ERR(kcopy_dev.devp[i])) {
-+ ret = PTR_ERR(kcopy_dev.devp[i]);
-+ printk(KERN_ERR "kcopy: Could not create "
-+ "devp %d (err %d)\n", i, -ret);
-+ goto bail_cdev_add;
-+ }
-+
-+ ninit++;
-+ }
-+
-+ ret = 0;
-+ goto bail;
-+
-+bail_cdev_add:
-+ for (i = 0; i < ninit; i++)
-+ device_unregister(kcopy_dev.devp[i]);
-+
-+ cdev_del(&kcopy_dev.cdev);
-+bail_class:
-+ class_destroy(kcopy_dev.class);
-+bail_chrdev:
-+ unregister_chrdev_region(kcopy_dev.dev, KCOPY_MAX_MINORS);
-+bail:
-+ return ret;
-+}
-+
-+static void __exit kcopy_fini(void)
-+{
-+ int i;
-+
-+ for (i = 0; i < KCOPY_MAX_MINORS; i++)
-+ device_unregister(kcopy_dev.devp[i]);
-+
-+ cdev_del(&kcopy_dev.cdev);
-+ class_destroy(kcopy_dev.class);
-+ unregister_chrdev_region(kcopy_dev.dev, KCOPY_MAX_MINORS);
-+}
-+
-+module_init(kcopy_init);
-+module_exit(kcopy_fini);
^ permalink raw reply [flat|nested] only message in thread
only message in thread, other threads:[~2012-01-30 21:07 UTC | newest]
Thread overview: (only message) (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2012-01-30 21:07 [gentoo-commits] linux-patches r2074 - genpatches-2.6/trunk/3.2 Mike Pagano (mpagano)
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox