diff options
| -rw-r--r-- | drivers/infiniband/Kconfig | 1 | ||||
| -rw-r--r-- | drivers/infiniband/core/ud_header.c | 14 | ||||
| -rw-r--r-- | drivers/infiniband/core/umem.c | 2 | ||||
| -rw-r--r-- | drivers/infiniband/core/uverbs_main.c | 61 | ||||
| -rw-r--r-- | drivers/infiniband/hw/ipath/ipath_user_pages.c | 3 | ||||
| -rw-r--r-- | drivers/infiniband/hw/mlx4/qp.c | 2 | ||||
| -rw-r--r-- | drivers/infiniband/hw/mthca/mthca_qp.c | 2 | ||||
| -rw-r--r-- | include/rdma/ib_pack.h | 1 |
8 files changed, 15 insertions, 71 deletions
diff --git a/drivers/infiniband/Kconfig b/drivers/infiniband/Kconfig index dd0db67bf8d7..975adce5f40c 100644 --- a/drivers/infiniband/Kconfig +++ b/drivers/infiniband/Kconfig | |||
| @@ -20,6 +20,7 @@ config INFINIBAND_USER_MAD | |||
| 20 | 20 | ||
| 21 | config INFINIBAND_USER_ACCESS | 21 | config INFINIBAND_USER_ACCESS |
| 22 | tristate "InfiniBand userspace access (verbs and CM)" | 22 | tristate "InfiniBand userspace access (verbs and CM)" |
| 23 | select ANON_INODES | ||
| 23 | ---help--- | 24 | ---help--- |
| 24 | Userspace InfiniBand access support. This enables the | 25 | Userspace InfiniBand access support. This enables the |
| 25 | kernel side of userspace verbs and the userspace | 26 | kernel side of userspace verbs and the userspace |
diff --git a/drivers/infiniband/core/ud_header.c b/drivers/infiniband/core/ud_header.c index 8ec7876bedcf..650b501eb142 100644 --- a/drivers/infiniband/core/ud_header.c +++ b/drivers/infiniband/core/ud_header.c | |||
| @@ -181,6 +181,7 @@ static const struct ib_field deth_table[] = { | |||
| 181 | * ib_ud_header_init - Initialize UD header structure | 181 | * ib_ud_header_init - Initialize UD header structure |
| 182 | * @payload_bytes:Length of packet payload | 182 | * @payload_bytes:Length of packet payload |
| 183 | * @grh_present:GRH flag (if non-zero, GRH will be included) | 183 | * @grh_present:GRH flag (if non-zero, GRH will be included) |
| 184 | * @immediate_present: specify if immediate data should be used | ||
| 184 | * @header:Structure to initialize | 185 | * @header:Structure to initialize |
| 185 | * | 186 | * |
| 186 | * ib_ud_header_init() initializes the lrh.link_version, lrh.link_next_header, | 187 | * ib_ud_header_init() initializes the lrh.link_version, lrh.link_next_header, |
| @@ -191,21 +192,13 @@ static const struct ib_field deth_table[] = { | |||
| 191 | */ | 192 | */ |
| 192 | void ib_ud_header_init(int payload_bytes, | 193 | void ib_ud_header_init(int payload_bytes, |
| 193 | int grh_present, | 194 | int grh_present, |
| 195 | int immediate_present, | ||
| 194 | struct ib_ud_header *header) | 196 | struct ib_ud_header *header) |
| 195 | { | 197 | { |
| 196 | int header_len; | ||
| 197 | u16 packet_length; | 198 | u16 packet_length; |
| 198 | 199 | ||
| 199 | memset(header, 0, sizeof *header); | 200 | memset(header, 0, sizeof *header); |
| 200 | 201 | ||
| 201 | header_len = | ||
| 202 | IB_LRH_BYTES + | ||
| 203 | IB_BTH_BYTES + | ||
| 204 | IB_DETH_BYTES; | ||
| 205 | if (grh_present) { | ||
| 206 | header_len += IB_GRH_BYTES; | ||
| 207 | } | ||
| 208 | |||
| 209 | header->lrh.link_version = 0; | 202 | header->lrh.link_version = 0; |
| 210 | header->lrh.link_next_header = | 203 | header->lrh.link_next_header = |
| 211 | grh_present ? IB_LNH_IBA_GLOBAL : IB_LNH_IBA_LOCAL; | 204 | grh_present ? IB_LNH_IBA_GLOBAL : IB_LNH_IBA_LOCAL; |
| @@ -231,7 +224,8 @@ void ib_ud_header_init(int payload_bytes, | |||
| 231 | 224 | ||
| 232 | header->lrh.packet_length = cpu_to_be16(packet_length); | 225 | header->lrh.packet_length = cpu_to_be16(packet_length); |
| 233 | 226 | ||
| 234 | if (header->immediate_present) | 227 | header->immediate_present = immediate_present; |
| 228 | if (immediate_present) | ||
| 235 | header->bth.opcode = IB_OPCODE_UD_SEND_ONLY_WITH_IMMEDIATE; | 229 | header->bth.opcode = IB_OPCODE_UD_SEND_ONLY_WITH_IMMEDIATE; |
| 236 | else | 230 | else |
| 237 | header->bth.opcode = IB_OPCODE_UD_SEND_ONLY; | 231 | header->bth.opcode = IB_OPCODE_UD_SEND_ONLY; |
diff --git a/drivers/infiniband/core/umem.c b/drivers/infiniband/core/umem.c index 6f7c096abf13..4f906f0614f0 100644 --- a/drivers/infiniband/core/umem.c +++ b/drivers/infiniband/core/umem.c | |||
| @@ -136,7 +136,7 @@ struct ib_umem *ib_umem_get(struct ib_ucontext *context, unsigned long addr, | |||
| 136 | down_write(¤t->mm->mmap_sem); | 136 | down_write(¤t->mm->mmap_sem); |
| 137 | 137 | ||
| 138 | locked = npages + current->mm->locked_vm; | 138 | locked = npages + current->mm->locked_vm; |
| 139 | lock_limit = current->signal->rlim[RLIMIT_MEMLOCK].rlim_cur >> PAGE_SHIFT; | 139 | lock_limit = rlimit(RLIMIT_MEMLOCK) >> PAGE_SHIFT; |
| 140 | 140 | ||
| 141 | if ((locked > lock_limit) && !capable(CAP_IPC_LOCK)) { | 141 | if ((locked > lock_limit) && !capable(CAP_IPC_LOCK)) { |
| 142 | ret = -ENOMEM; | 142 | ret = -ENOMEM; |
diff --git a/drivers/infiniband/core/uverbs_main.c b/drivers/infiniband/core/uverbs_main.c index dbf04511cf0a..ff59a795e840 100644 --- a/drivers/infiniband/core/uverbs_main.c +++ b/drivers/infiniband/core/uverbs_main.c | |||
| @@ -42,7 +42,8 @@ | |||
| 42 | #include <linux/poll.h> | 42 | #include <linux/poll.h> |
| 43 | #include <linux/sched.h> | 43 | #include <linux/sched.h> |
| 44 | #include <linux/file.h> | 44 | #include <linux/file.h> |
| 45 | #include <linux/mount.h> | 45 | #include <linux/cdev.h> |
| 46 | #include <linux/anon_inodes.h> | ||
| 46 | 47 | ||
| 47 | #include <asm/uaccess.h> | 48 | #include <asm/uaccess.h> |
| 48 | 49 | ||
| @@ -52,8 +53,6 @@ MODULE_AUTHOR("Roland Dreier"); | |||
| 52 | MODULE_DESCRIPTION("InfiniBand userspace verbs access"); | 53 | MODULE_DESCRIPTION("InfiniBand userspace verbs access"); |
| 53 | MODULE_LICENSE("Dual BSD/GPL"); | 54 | MODULE_LICENSE("Dual BSD/GPL"); |
| 54 | 55 | ||
| 55 | #define INFINIBANDEVENTFS_MAGIC 0x49426576 /* "IBev" */ | ||
| 56 | |||
| 57 | enum { | 56 | enum { |
| 58 | IB_UVERBS_MAJOR = 231, | 57 | IB_UVERBS_MAJOR = 231, |
| 59 | IB_UVERBS_BASE_MINOR = 192, | 58 | IB_UVERBS_BASE_MINOR = 192, |
| @@ -109,8 +108,6 @@ static ssize_t (*uverbs_cmd_table[])(struct ib_uverbs_file *file, | |||
| 109 | [IB_USER_VERBS_CMD_DESTROY_SRQ] = ib_uverbs_destroy_srq, | 108 | [IB_USER_VERBS_CMD_DESTROY_SRQ] = ib_uverbs_destroy_srq, |
| 110 | }; | 109 | }; |
| 111 | 110 | ||
| 112 | static struct vfsmount *uverbs_event_mnt; | ||
| 113 | |||
| 114 | static void ib_uverbs_add_one(struct ib_device *device); | 111 | static void ib_uverbs_add_one(struct ib_device *device); |
| 115 | static void ib_uverbs_remove_one(struct ib_device *device); | 112 | static void ib_uverbs_remove_one(struct ib_device *device); |
| 116 | 113 | ||
| @@ -490,7 +487,6 @@ struct file *ib_uverbs_alloc_event_file(struct ib_uverbs_file *uverbs_file, | |||
| 490 | int is_async, int *fd) | 487 | int is_async, int *fd) |
| 491 | { | 488 | { |
| 492 | struct ib_uverbs_event_file *ev_file; | 489 | struct ib_uverbs_event_file *ev_file; |
| 493 | struct path path; | ||
| 494 | struct file *filp; | 490 | struct file *filp; |
| 495 | int ret; | 491 | int ret; |
| 496 | 492 | ||
| @@ -513,27 +509,16 @@ struct file *ib_uverbs_alloc_event_file(struct ib_uverbs_file *uverbs_file, | |||
| 513 | goto err; | 509 | goto err; |
| 514 | } | 510 | } |
| 515 | 511 | ||
| 516 | /* | 512 | filp = anon_inode_getfile("[uverbs-event]", &uverbs_event_fops, |
| 517 | * fops_get() can't fail here, because we're coming from a | 513 | ev_file, O_RDONLY); |
| 518 | * system call on a uverbs file, which will already have a | ||
| 519 | * module reference. | ||
| 520 | */ | ||
| 521 | path.mnt = uverbs_event_mnt; | ||
| 522 | path.dentry = uverbs_event_mnt->mnt_root; | ||
| 523 | path_get(&path); | ||
| 524 | filp = alloc_file(&path, FMODE_READ, fops_get(&uverbs_event_fops)); | ||
| 525 | if (!filp) { | 514 | if (!filp) { |
| 526 | ret = -ENFILE; | 515 | ret = -ENFILE; |
| 527 | goto err_fd; | 516 | goto err_fd; |
| 528 | } | 517 | } |
| 529 | 518 | ||
| 530 | filp->private_data = ev_file; | ||
| 531 | |||
| 532 | return filp; | 519 | return filp; |
| 533 | 520 | ||
| 534 | err_fd: | 521 | err_fd: |
| 535 | fops_put(&uverbs_event_fops); | ||
| 536 | path_put(&path); | ||
| 537 | put_unused_fd(*fd); | 522 | put_unused_fd(*fd); |
| 538 | 523 | ||
| 539 | err: | 524 | err: |
| @@ -854,21 +839,6 @@ static void ib_uverbs_remove_one(struct ib_device *device) | |||
| 854 | kfree(uverbs_dev); | 839 | kfree(uverbs_dev); |
| 855 | } | 840 | } |
| 856 | 841 | ||
| 857 | static int uverbs_event_get_sb(struct file_system_type *fs_type, int flags, | ||
| 858 | const char *dev_name, void *data, | ||
| 859 | struct vfsmount *mnt) | ||
| 860 | { | ||
| 861 | return get_sb_pseudo(fs_type, "infinibandevent:", NULL, | ||
| 862 | INFINIBANDEVENTFS_MAGIC, mnt); | ||
| 863 | } | ||
| 864 | |||
| 865 | static struct file_system_type uverbs_event_fs = { | ||
| 866 | /* No owner field so module can be unloaded */ | ||
| 867 | .name = "infinibandeventfs", | ||
| 868 | .get_sb = uverbs_event_get_sb, | ||
| 869 | .kill_sb = kill_litter_super | ||
| 870 | }; | ||
| 871 | |||
| 872 | static int __init ib_uverbs_init(void) | 842 | static int __init ib_uverbs_init(void) |
| 873 | { | 843 | { |
| 874 | int ret; | 844 | int ret; |
| @@ -893,33 +863,14 @@ static int __init ib_uverbs_init(void) | |||
| 893 | goto out_class; | 863 | goto out_class; |
| 894 | } | 864 | } |
| 895 | 865 | ||
| 896 | ret = register_filesystem(&uverbs_event_fs); | ||
| 897 | if (ret) { | ||
| 898 | printk(KERN_ERR "user_verbs: couldn't register infinibandeventfs\n"); | ||
| 899 | goto out_class; | ||
| 900 | } | ||
| 901 | |||
| 902 | uverbs_event_mnt = kern_mount(&uverbs_event_fs); | ||
| 903 | if (IS_ERR(uverbs_event_mnt)) { | ||
| 904 | ret = PTR_ERR(uverbs_event_mnt); | ||
| 905 | printk(KERN_ERR "user_verbs: couldn't mount infinibandeventfs\n"); | ||
| 906 | goto out_fs; | ||
| 907 | } | ||
| 908 | |||
| 909 | ret = ib_register_client(&uverbs_client); | 866 | ret = ib_register_client(&uverbs_client); |
| 910 | if (ret) { | 867 | if (ret) { |
| 911 | printk(KERN_ERR "user_verbs: couldn't register client\n"); | 868 | printk(KERN_ERR "user_verbs: couldn't register client\n"); |
| 912 | goto out_mnt; | 869 | goto out_class; |
| 913 | } | 870 | } |
| 914 | 871 | ||
| 915 | return 0; | 872 | return 0; |
| 916 | 873 | ||
| 917 | out_mnt: | ||
| 918 | mntput(uverbs_event_mnt); | ||
| 919 | |||
| 920 | out_fs: | ||
| 921 | unregister_filesystem(&uverbs_event_fs); | ||
| 922 | |||
| 923 | out_class: | 874 | out_class: |
| 924 | class_destroy(uverbs_class); | 875 | class_destroy(uverbs_class); |
| 925 | 876 | ||
| @@ -933,8 +884,6 @@ out: | |||
| 933 | static void __exit ib_uverbs_cleanup(void) | 884 | static void __exit ib_uverbs_cleanup(void) |
| 934 | { | 885 | { |
| 935 | ib_unregister_client(&uverbs_client); | 886 | ib_unregister_client(&uverbs_client); |
| 936 | mntput(uverbs_event_mnt); | ||
| 937 | unregister_filesystem(&uverbs_event_fs); | ||
| 938 | class_destroy(uverbs_class); | 887 | class_destroy(uverbs_class); |
| 939 | unregister_chrdev_region(IB_UVERBS_BASE_DEV, IB_UVERBS_MAX_DEVICES); | 888 | unregister_chrdev_region(IB_UVERBS_BASE_DEV, IB_UVERBS_MAX_DEVICES); |
| 940 | if (overflow_maj) | 889 | if (overflow_maj) |
diff --git a/drivers/infiniband/hw/ipath/ipath_user_pages.c b/drivers/infiniband/hw/ipath/ipath_user_pages.c index 82878e348627..eb7d59abd12d 100644 --- a/drivers/infiniband/hw/ipath/ipath_user_pages.c +++ b/drivers/infiniband/hw/ipath/ipath_user_pages.c | |||
| @@ -59,8 +59,7 @@ static int __get_user_pages(unsigned long start_page, size_t num_pages, | |||
| 59 | size_t got; | 59 | size_t got; |
| 60 | int ret; | 60 | int ret; |
| 61 | 61 | ||
| 62 | lock_limit = current->signal->rlim[RLIMIT_MEMLOCK].rlim_cur >> | 62 | lock_limit = rlimit(RLIMIT_MEMLOCK) >> PAGE_SHIFT; |
| 63 | PAGE_SHIFT; | ||
| 64 | 63 | ||
| 65 | if (num_pages > lock_limit) { | 64 | if (num_pages > lock_limit) { |
| 66 | ret = -ENOMEM; | 65 | ret = -ENOMEM; |
diff --git a/drivers/infiniband/hw/mlx4/qp.c b/drivers/infiniband/hw/mlx4/qp.c index b377671264e9..ae75389937d6 100644 --- a/drivers/infiniband/hw/mlx4/qp.c +++ b/drivers/infiniband/hw/mlx4/qp.c | |||
| @@ -1228,7 +1228,7 @@ static int build_mlx_header(struct mlx4_ib_sqp *sqp, struct ib_send_wr *wr, | |||
| 1228 | for (i = 0; i < wr->num_sge; ++i) | 1228 | for (i = 0; i < wr->num_sge; ++i) |
| 1229 | send_size += wr->sg_list[i].length; | 1229 | send_size += wr->sg_list[i].length; |
| 1230 | 1230 | ||
| 1231 | ib_ud_header_init(send_size, mlx4_ib_ah_grh_present(ah), &sqp->ud_header); | 1231 | ib_ud_header_init(send_size, mlx4_ib_ah_grh_present(ah), 0, &sqp->ud_header); |
| 1232 | 1232 | ||
| 1233 | sqp->ud_header.lrh.service_level = | 1233 | sqp->ud_header.lrh.service_level = |
| 1234 | be32_to_cpu(ah->av.sl_tclass_flowlabel) >> 28; | 1234 | be32_to_cpu(ah->av.sl_tclass_flowlabel) >> 28; |
diff --git a/drivers/infiniband/hw/mthca/mthca_qp.c b/drivers/infiniband/hw/mthca/mthca_qp.c index c10576fa60c1..d2d172e6289c 100644 --- a/drivers/infiniband/hw/mthca/mthca_qp.c +++ b/drivers/infiniband/hw/mthca/mthca_qp.c | |||
| @@ -1494,7 +1494,7 @@ static int build_mlx_header(struct mthca_dev *dev, struct mthca_sqp *sqp, | |||
| 1494 | u16 pkey; | 1494 | u16 pkey; |
| 1495 | 1495 | ||
| 1496 | ib_ud_header_init(256, /* assume a MAD */ | 1496 | ib_ud_header_init(256, /* assume a MAD */ |
| 1497 | mthca_ah_grh_present(to_mah(wr->wr.ud.ah)), | 1497 | mthca_ah_grh_present(to_mah(wr->wr.ud.ah)), 0, |
| 1498 | &sqp->ud_header); | 1498 | &sqp->ud_header); |
| 1499 | 1499 | ||
| 1500 | err = mthca_read_ah(dev, to_mah(wr->wr.ud.ah), &sqp->ud_header); | 1500 | err = mthca_read_ah(dev, to_mah(wr->wr.ud.ah), &sqp->ud_header); |
diff --git a/include/rdma/ib_pack.h b/include/rdma/ib_pack.h index d7fc45c4eba9..cbb50f4da3dd 100644 --- a/include/rdma/ib_pack.h +++ b/include/rdma/ib_pack.h | |||
| @@ -232,6 +232,7 @@ void ib_unpack(const struct ib_field *desc, | |||
| 232 | 232 | ||
| 233 | void ib_ud_header_init(int payload_bytes, | 233 | void ib_ud_header_init(int payload_bytes, |
| 234 | int grh_present, | 234 | int grh_present, |
| 235 | int immediate_present, | ||
| 235 | struct ib_ud_header *header); | 236 | struct ib_ud_header *header); |
| 236 | 237 | ||
| 237 | int ib_ud_header_pack(struct ib_ud_header *header, | 238 | int ib_ud_header_pack(struct ib_ud_header *header, |
