Merge branch 'misc' into for-next
Roland Dreier [Tue, 2 Mar 2010 07:52:31 +0000 (23:52 -0800)]
Conflicts:
drivers/infiniband/core/uverbs_main.c

drivers/infiniband/Kconfig
drivers/infiniband/core/ud_header.c
drivers/infiniband/core/umem.c
drivers/infiniband/core/uverbs_main.c
drivers/infiniband/hw/ipath/ipath_user_pages.c
drivers/infiniband/hw/mlx4/qp.c
drivers/infiniband/hw/mthca/mthca_qp.c
include/rdma/ib_pack.h

index dd0db67..975adce 100644 (file)
@@ -20,6 +20,7 @@ config INFINIBAND_USER_MAD
 
 config INFINIBAND_USER_ACCESS
        tristate "InfiniBand userspace access (verbs and CM)"
+       select ANON_INODES
        ---help---
          Userspace InfiniBand access support.  This enables the
          kernel side of userspace verbs and the userspace
index 8ec7876..650b501 100644 (file)
@@ -181,6 +181,7 @@ static const struct ib_field deth_table[] = {
  * ib_ud_header_init - Initialize UD header structure
  * @payload_bytes:Length of packet payload
  * @grh_present:GRH flag (if non-zero, GRH will be included)
+ * @immediate_present: specify if immediate data should be used
  * @header:Structure to initialize
  *
  * ib_ud_header_init() initializes the lrh.link_version, lrh.link_next_header,
@@ -191,21 +192,13 @@ static const struct ib_field deth_table[] = {
  */
 void ib_ud_header_init(int                         payload_bytes,
                       int                  grh_present,
+                      int                  immediate_present,
                       struct ib_ud_header *header)
 {
-       int header_len;
        u16 packet_length;
 
        memset(header, 0, sizeof *header);
 
-       header_len =
-               IB_LRH_BYTES  +
-               IB_BTH_BYTES  +
-               IB_DETH_BYTES;
-       if (grh_present) {
-               header_len += IB_GRH_BYTES;
-       }
-
        header->lrh.link_version     = 0;
        header->lrh.link_next_header =
                grh_present ? IB_LNH_IBA_GLOBAL : IB_LNH_IBA_LOCAL;
@@ -231,7 +224,8 @@ void ib_ud_header_init(int                      payload_bytes,
 
        header->lrh.packet_length = cpu_to_be16(packet_length);
 
-       if (header->immediate_present)
+       header->immediate_present            = immediate_present;
+       if (immediate_present)
                header->bth.opcode           = IB_OPCODE_UD_SEND_ONLY_WITH_IMMEDIATE;
        else
                header->bth.opcode           = IB_OPCODE_UD_SEND_ONLY;
index 6f7c096..4f906f0 100644 (file)
@@ -136,7 +136,7 @@ struct ib_umem *ib_umem_get(struct ib_ucontext *context, unsigned long addr,
        down_write(&current->mm->mmap_sem);
 
        locked     = npages + current->mm->locked_vm;
-       lock_limit = current->signal->rlim[RLIMIT_MEMLOCK].rlim_cur >> PAGE_SHIFT;
+       lock_limit = rlimit(RLIMIT_MEMLOCK) >> PAGE_SHIFT;
 
        if ((locked > lock_limit) && !capable(CAP_IPC_LOCK)) {
                ret = -ENOMEM;
index dbf0451..ff59a79 100644 (file)
@@ -42,7 +42,8 @@
 #include <linux/poll.h>
 #include <linux/sched.h>
 #include <linux/file.h>
-#include <linux/mount.h>
+#include <linux/cdev.h>
+#include <linux/anon_inodes.h>
 
 #include <asm/uaccess.h>
 
@@ -52,8 +53,6 @@ MODULE_AUTHOR("Roland Dreier");
 MODULE_DESCRIPTION("InfiniBand userspace verbs access");
 MODULE_LICENSE("Dual BSD/GPL");
 
-#define INFINIBANDEVENTFS_MAGIC        0x49426576      /* "IBev" */
-
 enum {
        IB_UVERBS_MAJOR       = 231,
        IB_UVERBS_BASE_MINOR  = 192,
@@ -109,8 +108,6 @@ static ssize_t (*uverbs_cmd_table[])(struct ib_uverbs_file *file,
        [IB_USER_VERBS_CMD_DESTROY_SRQ]         = ib_uverbs_destroy_srq,
 };
 
-static struct vfsmount *uverbs_event_mnt;
-
 static void ib_uverbs_add_one(struct ib_device *device);
 static void ib_uverbs_remove_one(struct ib_device *device);
 
@@ -490,7 +487,6 @@ struct file *ib_uverbs_alloc_event_file(struct ib_uverbs_file *uverbs_file,
                                        int is_async, int *fd)
 {
        struct ib_uverbs_event_file *ev_file;
-       struct path path;
        struct file *filp;
        int ret;
 
@@ -513,27 +509,16 @@ struct file *ib_uverbs_alloc_event_file(struct ib_uverbs_file *uverbs_file,
                goto err;
        }
 
-       /*
-        * fops_get() can't fail here, because we're coming from a
-        * system call on a uverbs file, which will already have a
-        * module reference.
-        */
-       path.mnt = uverbs_event_mnt;
-       path.dentry = uverbs_event_mnt->mnt_root;
-       path_get(&path);
-       filp = alloc_file(&path, FMODE_READ, fops_get(&uverbs_event_fops));
+       filp = anon_inode_getfile("[uverbs-event]", &uverbs_event_fops,
+                                 ev_file, O_RDONLY);
        if (!filp) {
                ret = -ENFILE;
                goto err_fd;
        }
 
-       filp->private_data = ev_file;
-
        return filp;
 
 err_fd:
-       fops_put(&uverbs_event_fops);
-       path_put(&path);
        put_unused_fd(*fd);
 
 err:
@@ -854,21 +839,6 @@ static void ib_uverbs_remove_one(struct ib_device *device)
        kfree(uverbs_dev);
 }
 
-static int uverbs_event_get_sb(struct file_system_type *fs_type, int flags,
-                              const char *dev_name, void *data,
-                              struct vfsmount *mnt)
-{
-       return get_sb_pseudo(fs_type, "infinibandevent:", NULL,
-                            INFINIBANDEVENTFS_MAGIC, mnt);
-}
-
-static struct file_system_type uverbs_event_fs = {
-       /* No owner field so module can be unloaded */
-       .name    = "infinibandeventfs",
-       .get_sb  = uverbs_event_get_sb,
-       .kill_sb = kill_litter_super
-};
-
 static int __init ib_uverbs_init(void)
 {
        int ret;
@@ -893,33 +863,14 @@ static int __init ib_uverbs_init(void)
                goto out_class;
        }
 
-       ret = register_filesystem(&uverbs_event_fs);
-       if (ret) {
-               printk(KERN_ERR "user_verbs: couldn't register infinibandeventfs\n");
-               goto out_class;
-       }
-
-       uverbs_event_mnt = kern_mount(&uverbs_event_fs);
-       if (IS_ERR(uverbs_event_mnt)) {
-               ret = PTR_ERR(uverbs_event_mnt);
-               printk(KERN_ERR "user_verbs: couldn't mount infinibandeventfs\n");
-               goto out_fs;
-       }
-
        ret = ib_register_client(&uverbs_client);
        if (ret) {
                printk(KERN_ERR "user_verbs: couldn't register client\n");
-               goto out_mnt;
+               goto out_class;
        }
 
        return 0;
 
-out_mnt:
-       mntput(uverbs_event_mnt);
-
-out_fs:
-       unregister_filesystem(&uverbs_event_fs);
-
 out_class:
        class_destroy(uverbs_class);
 
@@ -933,8 +884,6 @@ out:
 static void __exit ib_uverbs_cleanup(void)
 {
        ib_unregister_client(&uverbs_client);
-       mntput(uverbs_event_mnt);
-       unregister_filesystem(&uverbs_event_fs);
        class_destroy(uverbs_class);
        unregister_chrdev_region(IB_UVERBS_BASE_DEV, IB_UVERBS_MAX_DEVICES);
        if (overflow_maj)
index 82878e3..eb7d59a 100644 (file)
@@ -59,8 +59,7 @@ static int __get_user_pages(unsigned long start_page, size_t num_pages,
        size_t got;
        int ret;
 
-       lock_limit = current->signal->rlim[RLIMIT_MEMLOCK].rlim_cur >>
-               PAGE_SHIFT;
+       lock_limit = rlimit(RLIMIT_MEMLOCK) >> PAGE_SHIFT;
 
        if (num_pages > lock_limit) {
                ret = -ENOMEM;
index b377671..ae75389 100644 (file)
@@ -1228,7 +1228,7 @@ static int build_mlx_header(struct mlx4_ib_sqp *sqp, struct ib_send_wr *wr,
        for (i = 0; i < wr->num_sge; ++i)
                send_size += wr->sg_list[i].length;
 
-       ib_ud_header_init(send_size, mlx4_ib_ah_grh_present(ah), &sqp->ud_header);
+       ib_ud_header_init(send_size, mlx4_ib_ah_grh_present(ah), 0, &sqp->ud_header);
 
        sqp->ud_header.lrh.service_level   =
                be32_to_cpu(ah->av.sl_tclass_flowlabel) >> 28;
index c10576f..d2d172e 100644 (file)
@@ -1494,7 +1494,7 @@ static int build_mlx_header(struct mthca_dev *dev, struct mthca_sqp *sqp,
        u16 pkey;
 
        ib_ud_header_init(256, /* assume a MAD */
-                         mthca_ah_grh_present(to_mah(wr->wr.ud.ah)),
+                         mthca_ah_grh_present(to_mah(wr->wr.ud.ah)), 0,
                          &sqp->ud_header);
 
        err = mthca_read_ah(dev, to_mah(wr->wr.ud.ah), &sqp->ud_header);
index d7fc45c..cbb50f4 100644 (file)
@@ -232,6 +232,7 @@ void ib_unpack(const struct ib_field        *desc,
 
 void ib_ud_header_init(int                        payload_bytes,
                       int                 grh_present,
+                      int                 immediate_present,
                       struct ib_ud_header *header);
 
 int ib_ud_header_pack(struct ib_ud_header *header,