Merge branch 'misc' into for-next
Conflicts: drivers/infiniband/core/uverbs_main.c
This commit is contained in:
commit
fe8875e5a4
@ -20,6 +20,7 @@ config INFINIBAND_USER_MAD
|
|||||||
|
|
||||||
config INFINIBAND_USER_ACCESS
|
config INFINIBAND_USER_ACCESS
|
||||||
tristate "InfiniBand userspace access (verbs and CM)"
|
tristate "InfiniBand userspace access (verbs and CM)"
|
||||||
|
select ANON_INODES
|
||||||
---help---
|
---help---
|
||||||
Userspace InfiniBand access support. This enables the
|
Userspace InfiniBand access support. This enables the
|
||||||
kernel side of userspace verbs and the userspace
|
kernel side of userspace verbs and the userspace
|
||||||
|
@ -181,6 +181,7 @@ static const struct ib_field deth_table[] = {
|
|||||||
* ib_ud_header_init - Initialize UD header structure
|
* ib_ud_header_init - Initialize UD header structure
|
||||||
* @payload_bytes:Length of packet payload
|
* @payload_bytes:Length of packet payload
|
||||||
* @grh_present:GRH flag (if non-zero, GRH will be included)
|
* @grh_present:GRH flag (if non-zero, GRH will be included)
|
||||||
|
* @immediate_present: specify if immediate data should be used
|
||||||
* @header:Structure to initialize
|
* @header:Structure to initialize
|
||||||
*
|
*
|
||||||
* ib_ud_header_init() initializes the lrh.link_version, lrh.link_next_header,
|
* 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,
|
void ib_ud_header_init(int payload_bytes,
|
||||||
int grh_present,
|
int grh_present,
|
||||||
|
int immediate_present,
|
||||||
struct ib_ud_header *header)
|
struct ib_ud_header *header)
|
||||||
{
|
{
|
||||||
int header_len;
|
|
||||||
u16 packet_length;
|
u16 packet_length;
|
||||||
|
|
||||||
memset(header, 0, sizeof *header);
|
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_version = 0;
|
||||||
header->lrh.link_next_header =
|
header->lrh.link_next_header =
|
||||||
grh_present ? IB_LNH_IBA_GLOBAL : IB_LNH_IBA_LOCAL;
|
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);
|
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;
|
header->bth.opcode = IB_OPCODE_UD_SEND_ONLY_WITH_IMMEDIATE;
|
||||||
else
|
else
|
||||||
header->bth.opcode = IB_OPCODE_UD_SEND_ONLY;
|
header->bth.opcode = IB_OPCODE_UD_SEND_ONLY;
|
||||||
|
@ -136,7 +136,7 @@ struct ib_umem *ib_umem_get(struct ib_ucontext *context, unsigned long addr,
|
|||||||
down_write(¤t->mm->mmap_sem);
|
down_write(¤t->mm->mmap_sem);
|
||||||
|
|
||||||
locked = npages + current->mm->locked_vm;
|
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)) {
|
if ((locked > lock_limit) && !capable(CAP_IPC_LOCK)) {
|
||||||
ret = -ENOMEM;
|
ret = -ENOMEM;
|
||||||
|
@ -42,7 +42,8 @@
|
|||||||
#include <linux/poll.h>
|
#include <linux/poll.h>
|
||||||
#include <linux/sched.h>
|
#include <linux/sched.h>
|
||||||
#include <linux/file.h>
|
#include <linux/file.h>
|
||||||
#include <linux/mount.h>
|
#include <linux/cdev.h>
|
||||||
|
#include <linux/anon_inodes.h>
|
||||||
|
|
||||||
#include <asm/uaccess.h>
|
#include <asm/uaccess.h>
|
||||||
|
|
||||||
@ -52,8 +53,6 @@ MODULE_AUTHOR("Roland Dreier");
|
|||||||
MODULE_DESCRIPTION("InfiniBand userspace verbs access");
|
MODULE_DESCRIPTION("InfiniBand userspace verbs access");
|
||||||
MODULE_LICENSE("Dual BSD/GPL");
|
MODULE_LICENSE("Dual BSD/GPL");
|
||||||
|
|
||||||
#define INFINIBANDEVENTFS_MAGIC 0x49426576 /* "IBev" */
|
|
||||||
|
|
||||||
enum {
|
enum {
|
||||||
IB_UVERBS_MAJOR = 231,
|
IB_UVERBS_MAJOR = 231,
|
||||||
IB_UVERBS_BASE_MINOR = 192,
|
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,
|
[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_add_one(struct ib_device *device);
|
||||||
static void ib_uverbs_remove_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)
|
int is_async, int *fd)
|
||||||
{
|
{
|
||||||
struct ib_uverbs_event_file *ev_file;
|
struct ib_uverbs_event_file *ev_file;
|
||||||
struct path path;
|
|
||||||
struct file *filp;
|
struct file *filp;
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
@ -513,27 +509,16 @@ struct file *ib_uverbs_alloc_event_file(struct ib_uverbs_file *uverbs_file,
|
|||||||
goto err;
|
goto err;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
filp = anon_inode_getfile("[uverbs-event]", &uverbs_event_fops,
|
||||||
* fops_get() can't fail here, because we're coming from a
|
ev_file, O_RDONLY);
|
||||||
* 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));
|
|
||||||
if (!filp) {
|
if (!filp) {
|
||||||
ret = -ENFILE;
|
ret = -ENFILE;
|
||||||
goto err_fd;
|
goto err_fd;
|
||||||
}
|
}
|
||||||
|
|
||||||
filp->private_data = ev_file;
|
|
||||||
|
|
||||||
return filp;
|
return filp;
|
||||||
|
|
||||||
err_fd:
|
err_fd:
|
||||||
fops_put(&uverbs_event_fops);
|
|
||||||
path_put(&path);
|
|
||||||
put_unused_fd(*fd);
|
put_unused_fd(*fd);
|
||||||
|
|
||||||
err:
|
err:
|
||||||
@ -854,21 +839,6 @@ static void ib_uverbs_remove_one(struct ib_device *device)
|
|||||||
kfree(uverbs_dev);
|
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)
|
static int __init ib_uverbs_init(void)
|
||||||
{
|
{
|
||||||
int ret;
|
int ret;
|
||||||
@ -893,33 +863,14 @@ static int __init ib_uverbs_init(void)
|
|||||||
goto out_class;
|
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);
|
ret = ib_register_client(&uverbs_client);
|
||||||
if (ret) {
|
if (ret) {
|
||||||
printk(KERN_ERR "user_verbs: couldn't register client\n");
|
printk(KERN_ERR "user_verbs: couldn't register client\n");
|
||||||
goto out_mnt;
|
goto out_class;
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
out_mnt:
|
|
||||||
mntput(uverbs_event_mnt);
|
|
||||||
|
|
||||||
out_fs:
|
|
||||||
unregister_filesystem(&uverbs_event_fs);
|
|
||||||
|
|
||||||
out_class:
|
out_class:
|
||||||
class_destroy(uverbs_class);
|
class_destroy(uverbs_class);
|
||||||
|
|
||||||
@ -933,8 +884,6 @@ out:
|
|||||||
static void __exit ib_uverbs_cleanup(void)
|
static void __exit ib_uverbs_cleanup(void)
|
||||||
{
|
{
|
||||||
ib_unregister_client(&uverbs_client);
|
ib_unregister_client(&uverbs_client);
|
||||||
mntput(uverbs_event_mnt);
|
|
||||||
unregister_filesystem(&uverbs_event_fs);
|
|
||||||
class_destroy(uverbs_class);
|
class_destroy(uverbs_class);
|
||||||
unregister_chrdev_region(IB_UVERBS_BASE_DEV, IB_UVERBS_MAX_DEVICES);
|
unregister_chrdev_region(IB_UVERBS_BASE_DEV, IB_UVERBS_MAX_DEVICES);
|
||||||
if (overflow_maj)
|
if (overflow_maj)
|
||||||
|
@ -59,8 +59,7 @@ static int __get_user_pages(unsigned long start_page, size_t num_pages,
|
|||||||
size_t got;
|
size_t got;
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
lock_limit = current->signal->rlim[RLIMIT_MEMLOCK].rlim_cur >>
|
lock_limit = rlimit(RLIMIT_MEMLOCK) >> PAGE_SHIFT;
|
||||||
PAGE_SHIFT;
|
|
||||||
|
|
||||||
if (num_pages > lock_limit) {
|
if (num_pages > lock_limit) {
|
||||||
ret = -ENOMEM;
|
ret = -ENOMEM;
|
||||||
|
@ -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)
|
for (i = 0; i < wr->num_sge; ++i)
|
||||||
send_size += wr->sg_list[i].length;
|
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 =
|
sqp->ud_header.lrh.service_level =
|
||||||
be32_to_cpu(ah->av.sl_tclass_flowlabel) >> 28;
|
be32_to_cpu(ah->av.sl_tclass_flowlabel) >> 28;
|
||||||
|
@ -1494,7 +1494,7 @@ static int build_mlx_header(struct mthca_dev *dev, struct mthca_sqp *sqp,
|
|||||||
u16 pkey;
|
u16 pkey;
|
||||||
|
|
||||||
ib_ud_header_init(256, /* assume a MAD */
|
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);
|
&sqp->ud_header);
|
||||||
|
|
||||||
err = mthca_read_ah(dev, to_mah(wr->wr.ud.ah), &sqp->ud_header);
|
err = mthca_read_ah(dev, to_mah(wr->wr.ud.ah), &sqp->ud_header);
|
||||||
|
@ -232,6 +232,7 @@ void ib_unpack(const struct ib_field *desc,
|
|||||||
|
|
||||||
void ib_ud_header_init(int payload_bytes,
|
void ib_ud_header_init(int payload_bytes,
|
||||||
int grh_present,
|
int grh_present,
|
||||||
|
int immediate_present,
|
||||||
struct ib_ud_header *header);
|
struct ib_ud_header *header);
|
||||||
|
|
||||||
int ib_ud_header_pack(struct ib_ud_header *header,
|
int ib_ud_header_pack(struct ib_ud_header *header,
|
||||||
|
Loading…
Reference in New Issue
Block a user