diff options
Diffstat (limited to 'drivers/infiniband/core')
-rw-r--r-- | drivers/infiniband/core/cma.c | 74 | ||||
-rw-r--r-- | drivers/infiniband/core/mad.c | 4 | ||||
-rw-r--r-- | drivers/infiniband/core/ucm.c | 3 | ||||
-rw-r--r-- | drivers/infiniband/core/ucma.c | 4 | ||||
-rw-r--r-- | drivers/infiniband/core/user_mad.c | 12 | ||||
-rw-r--r-- | drivers/infiniband/core/uverbs_main.c | 11 |
6 files changed, 48 insertions, 60 deletions
diff --git a/drivers/infiniband/core/cma.c b/drivers/infiniband/core/cma.c index 6d777069d86d..b930b8110a63 100644 --- a/drivers/infiniband/core/cma.c +++ b/drivers/infiniband/core/cma.c | |||
@@ -79,7 +79,6 @@ static DEFINE_IDR(sdp_ps); | |||
79 | static DEFINE_IDR(tcp_ps); | 79 | static DEFINE_IDR(tcp_ps); |
80 | static DEFINE_IDR(udp_ps); | 80 | static DEFINE_IDR(udp_ps); |
81 | static DEFINE_IDR(ipoib_ps); | 81 | static DEFINE_IDR(ipoib_ps); |
82 | static int next_port; | ||
83 | 82 | ||
84 | struct cma_device { | 83 | struct cma_device { |
85 | struct list_head list; | 84 | struct list_head list; |
@@ -1677,13 +1676,13 @@ int rdma_set_ib_paths(struct rdma_cm_id *id, | |||
1677 | if (!cma_comp_exch(id_priv, CMA_ADDR_RESOLVED, CMA_ROUTE_RESOLVED)) | 1676 | if (!cma_comp_exch(id_priv, CMA_ADDR_RESOLVED, CMA_ROUTE_RESOLVED)) |
1678 | return -EINVAL; | 1677 | return -EINVAL; |
1679 | 1678 | ||
1680 | id->route.path_rec = kmalloc(sizeof *path_rec * num_paths, GFP_KERNEL); | 1679 | id->route.path_rec = kmemdup(path_rec, sizeof *path_rec * num_paths, |
1680 | GFP_KERNEL); | ||
1681 | if (!id->route.path_rec) { | 1681 | if (!id->route.path_rec) { |
1682 | ret = -ENOMEM; | 1682 | ret = -ENOMEM; |
1683 | goto err; | 1683 | goto err; |
1684 | } | 1684 | } |
1685 | 1685 | ||
1686 | memcpy(id->route.path_rec, path_rec, sizeof *path_rec * num_paths); | ||
1687 | id->route.num_paths = num_paths; | 1686 | id->route.num_paths = num_paths; |
1688 | return 0; | 1687 | return 0; |
1689 | err: | 1688 | err: |
@@ -1970,47 +1969,33 @@ err1: | |||
1970 | 1969 | ||
1971 | static int cma_alloc_any_port(struct idr *ps, struct rdma_id_private *id_priv) | 1970 | static int cma_alloc_any_port(struct idr *ps, struct rdma_id_private *id_priv) |
1972 | { | 1971 | { |
1973 | struct rdma_bind_list *bind_list; | 1972 | static unsigned int last_used_port; |
1974 | int port, ret, low, high; | 1973 | int low, high, remaining; |
1975 | 1974 | unsigned int rover; | |
1976 | bind_list = kzalloc(sizeof *bind_list, GFP_KERNEL); | ||
1977 | if (!bind_list) | ||
1978 | return -ENOMEM; | ||
1979 | |||
1980 | retry: | ||
1981 | /* FIXME: add proper port randomization per like inet_csk_get_port */ | ||
1982 | do { | ||
1983 | ret = idr_get_new_above(ps, bind_list, next_port, &port); | ||
1984 | } while ((ret == -EAGAIN) && idr_pre_get(ps, GFP_KERNEL)); | ||
1985 | |||
1986 | if (ret) | ||
1987 | goto err1; | ||
1988 | 1975 | ||
1989 | inet_get_local_port_range(&low, &high); | 1976 | inet_get_local_port_range(&low, &high); |
1990 | if (port > high) { | 1977 | remaining = (high - low) + 1; |
1991 | if (next_port != low) { | 1978 | rover = net_random() % remaining + low; |
1992 | idr_remove(ps, port); | 1979 | retry: |
1993 | next_port = low; | 1980 | if (last_used_port != rover && |
1994 | goto retry; | 1981 | !idr_find(ps, (unsigned short) rover)) { |
1995 | } | 1982 | int ret = cma_alloc_port(ps, id_priv, rover); |
1996 | ret = -EADDRNOTAVAIL; | 1983 | /* |
1997 | goto err2; | 1984 | * Remember previously used port number in order to avoid |
1985 | * re-using same port immediately after it is closed. | ||
1986 | */ | ||
1987 | if (!ret) | ||
1988 | last_used_port = rover; | ||
1989 | if (ret != -EADDRNOTAVAIL) | ||
1990 | return ret; | ||
1998 | } | 1991 | } |
1999 | 1992 | if (--remaining) { | |
2000 | if (port == high) | 1993 | rover++; |
2001 | next_port = low; | 1994 | if ((rover < low) || (rover > high)) |
2002 | else | 1995 | rover = low; |
2003 | next_port = port + 1; | 1996 | goto retry; |
2004 | 1997 | } | |
2005 | bind_list->ps = ps; | 1998 | return -EADDRNOTAVAIL; |
2006 | bind_list->port = (unsigned short) port; | ||
2007 | cma_bind_port(bind_list, id_priv); | ||
2008 | return 0; | ||
2009 | err2: | ||
2010 | idr_remove(ps, port); | ||
2011 | err1: | ||
2012 | kfree(bind_list); | ||
2013 | return ret; | ||
2014 | } | 1999 | } |
2015 | 2000 | ||
2016 | static int cma_use_port(struct idr *ps, struct rdma_id_private *id_priv) | 2001 | static int cma_use_port(struct idr *ps, struct rdma_id_private *id_priv) |
@@ -2995,12 +2980,7 @@ static void cma_remove_one(struct ib_device *device) | |||
2995 | 2980 | ||
2996 | static int __init cma_init(void) | 2981 | static int __init cma_init(void) |
2997 | { | 2982 | { |
2998 | int ret, low, high, remaining; | 2983 | int ret; |
2999 | |||
3000 | get_random_bytes(&next_port, sizeof next_port); | ||
3001 | inet_get_local_port_range(&low, &high); | ||
3002 | remaining = (high - low) + 1; | ||
3003 | next_port = ((unsigned int) next_port % remaining) + low; | ||
3004 | 2984 | ||
3005 | cma_wq = create_singlethread_workqueue("rdma_cm"); | 2985 | cma_wq = create_singlethread_workqueue("rdma_cm"); |
3006 | if (!cma_wq) | 2986 | if (!cma_wq) |
diff --git a/drivers/infiniband/core/mad.c b/drivers/infiniband/core/mad.c index 1df1194aeba4..6dc7b77d5d29 100644 --- a/drivers/infiniband/core/mad.c +++ b/drivers/infiniband/core/mad.c | |||
@@ -291,13 +291,11 @@ struct ib_mad_agent *ib_register_mad_agent(struct ib_device *device, | |||
291 | } | 291 | } |
292 | 292 | ||
293 | if (mad_reg_req) { | 293 | if (mad_reg_req) { |
294 | reg_req = kmalloc(sizeof *reg_req, GFP_KERNEL); | 294 | reg_req = kmemdup(mad_reg_req, sizeof *reg_req, GFP_KERNEL); |
295 | if (!reg_req) { | 295 | if (!reg_req) { |
296 | ret = ERR_PTR(-ENOMEM); | 296 | ret = ERR_PTR(-ENOMEM); |
297 | goto error3; | 297 | goto error3; |
298 | } | 298 | } |
299 | /* Make a copy of the MAD registration request */ | ||
300 | memcpy(reg_req, mad_reg_req, sizeof *reg_req); | ||
301 | } | 299 | } |
302 | 300 | ||
303 | /* Now, fill in the various structures */ | 301 | /* Now, fill in the various structures */ |
diff --git a/drivers/infiniband/core/ucm.c b/drivers/infiniband/core/ucm.c index 512b1c43460c..46474842cfe9 100644 --- a/drivers/infiniband/core/ucm.c +++ b/drivers/infiniband/core/ucm.c | |||
@@ -1181,7 +1181,7 @@ static int ib_ucm_open(struct inode *inode, struct file *filp) | |||
1181 | file->filp = filp; | 1181 | file->filp = filp; |
1182 | file->device = container_of(inode->i_cdev, struct ib_ucm_device, cdev); | 1182 | file->device = container_of(inode->i_cdev, struct ib_ucm_device, cdev); |
1183 | 1183 | ||
1184 | return 0; | 1184 | return nonseekable_open(inode, filp); |
1185 | } | 1185 | } |
1186 | 1186 | ||
1187 | static int ib_ucm_close(struct inode *inode, struct file *filp) | 1187 | static int ib_ucm_close(struct inode *inode, struct file *filp) |
@@ -1229,6 +1229,7 @@ static const struct file_operations ucm_fops = { | |||
1229 | .release = ib_ucm_close, | 1229 | .release = ib_ucm_close, |
1230 | .write = ib_ucm_write, | 1230 | .write = ib_ucm_write, |
1231 | .poll = ib_ucm_poll, | 1231 | .poll = ib_ucm_poll, |
1232 | .llseek = no_llseek, | ||
1232 | }; | 1233 | }; |
1233 | 1234 | ||
1234 | static ssize_t show_ibdev(struct device *dev, struct device_attribute *attr, | 1235 | static ssize_t show_ibdev(struct device *dev, struct device_attribute *attr, |
diff --git a/drivers/infiniband/core/ucma.c b/drivers/infiniband/core/ucma.c index 46185084121e..ac7edc24165c 100644 --- a/drivers/infiniband/core/ucma.c +++ b/drivers/infiniband/core/ucma.c | |||
@@ -1220,7 +1220,8 @@ static int ucma_open(struct inode *inode, struct file *filp) | |||
1220 | 1220 | ||
1221 | filp->private_data = file; | 1221 | filp->private_data = file; |
1222 | file->filp = filp; | 1222 | file->filp = filp; |
1223 | return 0; | 1223 | |
1224 | return nonseekable_open(inode, filp); | ||
1224 | } | 1225 | } |
1225 | 1226 | ||
1226 | static int ucma_close(struct inode *inode, struct file *filp) | 1227 | static int ucma_close(struct inode *inode, struct file *filp) |
@@ -1250,6 +1251,7 @@ static const struct file_operations ucma_fops = { | |||
1250 | .release = ucma_close, | 1251 | .release = ucma_close, |
1251 | .write = ucma_write, | 1252 | .write = ucma_write, |
1252 | .poll = ucma_poll, | 1253 | .poll = ucma_poll, |
1254 | .llseek = no_llseek, | ||
1253 | }; | 1255 | }; |
1254 | 1256 | ||
1255 | static struct miscdevice ucma_misc = { | 1257 | static struct miscdevice ucma_misc = { |
diff --git a/drivers/infiniband/core/user_mad.c b/drivers/infiniband/core/user_mad.c index e7db054fb1c8..6babb72b39fc 100644 --- a/drivers/infiniband/core/user_mad.c +++ b/drivers/infiniband/core/user_mad.c | |||
@@ -781,7 +781,7 @@ static int ib_umad_open(struct inode *inode, struct file *filp) | |||
781 | { | 781 | { |
782 | struct ib_umad_port *port; | 782 | struct ib_umad_port *port; |
783 | struct ib_umad_file *file; | 783 | struct ib_umad_file *file; |
784 | int ret = 0; | 784 | int ret; |
785 | 785 | ||
786 | port = container_of(inode->i_cdev, struct ib_umad_port, cdev); | 786 | port = container_of(inode->i_cdev, struct ib_umad_port, cdev); |
787 | if (port) | 787 | if (port) |
@@ -814,6 +814,8 @@ static int ib_umad_open(struct inode *inode, struct file *filp) | |||
814 | 814 | ||
815 | list_add_tail(&file->port_list, &port->file_list); | 815 | list_add_tail(&file->port_list, &port->file_list); |
816 | 816 | ||
817 | ret = nonseekable_open(inode, filp); | ||
818 | |||
817 | out: | 819 | out: |
818 | mutex_unlock(&port->file_mutex); | 820 | mutex_unlock(&port->file_mutex); |
819 | return ret; | 821 | return ret; |
@@ -866,7 +868,8 @@ static const struct file_operations umad_fops = { | |||
866 | .compat_ioctl = ib_umad_compat_ioctl, | 868 | .compat_ioctl = ib_umad_compat_ioctl, |
867 | #endif | 869 | #endif |
868 | .open = ib_umad_open, | 870 | .open = ib_umad_open, |
869 | .release = ib_umad_close | 871 | .release = ib_umad_close, |
872 | .llseek = no_llseek, | ||
870 | }; | 873 | }; |
871 | 874 | ||
872 | static int ib_umad_sm_open(struct inode *inode, struct file *filp) | 875 | static int ib_umad_sm_open(struct inode *inode, struct file *filp) |
@@ -903,7 +906,7 @@ static int ib_umad_sm_open(struct inode *inode, struct file *filp) | |||
903 | 906 | ||
904 | filp->private_data = port; | 907 | filp->private_data = port; |
905 | 908 | ||
906 | return 0; | 909 | return nonseekable_open(inode, filp); |
907 | 910 | ||
908 | fail: | 911 | fail: |
909 | kref_put(&port->umad_dev->ref, ib_umad_release_dev); | 912 | kref_put(&port->umad_dev->ref, ib_umad_release_dev); |
@@ -933,7 +936,8 @@ static int ib_umad_sm_close(struct inode *inode, struct file *filp) | |||
933 | static const struct file_operations umad_sm_fops = { | 936 | static const struct file_operations umad_sm_fops = { |
934 | .owner = THIS_MODULE, | 937 | .owner = THIS_MODULE, |
935 | .open = ib_umad_sm_open, | 938 | .open = ib_umad_sm_open, |
936 | .release = ib_umad_sm_close | 939 | .release = ib_umad_sm_close, |
940 | .llseek = no_llseek, | ||
937 | }; | 941 | }; |
938 | 942 | ||
939 | static struct ib_client umad_client = { | 943 | static struct ib_client umad_client = { |
diff --git a/drivers/infiniband/core/uverbs_main.c b/drivers/infiniband/core/uverbs_main.c index fb3526254426..ec83e9fe387b 100644 --- a/drivers/infiniband/core/uverbs_main.c +++ b/drivers/infiniband/core/uverbs_main.c | |||
@@ -369,7 +369,8 @@ static const struct file_operations uverbs_event_fops = { | |||
369 | .read = ib_uverbs_event_read, | 369 | .read = ib_uverbs_event_read, |
370 | .poll = ib_uverbs_event_poll, | 370 | .poll = ib_uverbs_event_poll, |
371 | .release = ib_uverbs_event_close, | 371 | .release = ib_uverbs_event_close, |
372 | .fasync = ib_uverbs_event_fasync | 372 | .fasync = ib_uverbs_event_fasync, |
373 | .llseek = no_llseek, | ||
373 | }; | 374 | }; |
374 | 375 | ||
375 | void ib_uverbs_comp_handler(struct ib_cq *cq, void *cq_context) | 376 | void ib_uverbs_comp_handler(struct ib_cq *cq, void *cq_context) |
@@ -623,7 +624,7 @@ static int ib_uverbs_open(struct inode *inode, struct file *filp) | |||
623 | 624 | ||
624 | filp->private_data = file; | 625 | filp->private_data = file; |
625 | 626 | ||
626 | return 0; | 627 | return nonseekable_open(inode, filp); |
627 | 628 | ||
628 | err_module: | 629 | err_module: |
629 | module_put(dev->ib_dev->owner); | 630 | module_put(dev->ib_dev->owner); |
@@ -651,7 +652,8 @@ static const struct file_operations uverbs_fops = { | |||
651 | .owner = THIS_MODULE, | 652 | .owner = THIS_MODULE, |
652 | .write = ib_uverbs_write, | 653 | .write = ib_uverbs_write, |
653 | .open = ib_uverbs_open, | 654 | .open = ib_uverbs_open, |
654 | .release = ib_uverbs_close | 655 | .release = ib_uverbs_close, |
656 | .llseek = no_llseek, | ||
655 | }; | 657 | }; |
656 | 658 | ||
657 | static const struct file_operations uverbs_mmap_fops = { | 659 | static const struct file_operations uverbs_mmap_fops = { |
@@ -659,7 +661,8 @@ static const struct file_operations uverbs_mmap_fops = { | |||
659 | .write = ib_uverbs_write, | 661 | .write = ib_uverbs_write, |
660 | .mmap = ib_uverbs_mmap, | 662 | .mmap = ib_uverbs_mmap, |
661 | .open = ib_uverbs_open, | 663 | .open = ib_uverbs_open, |
662 | .release = ib_uverbs_close | 664 | .release = ib_uverbs_close, |
665 | .llseek = no_llseek, | ||
663 | }; | 666 | }; |
664 | 667 | ||
665 | static struct ib_client uverbs_client = { | 668 | static struct ib_client uverbs_client = { |