Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
L
linux
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
Kirill Smelkov
linux
Commits
8dc4abdf
Commit
8dc4abdf
authored
May 25, 2011
by
Roland Dreier
Browse files
Options
Browse Files
Download
Plain Diff
Merge branches 'cma', 'cxgb3', 'cxgb4', 'misc', 'nes', 'netlink', 'srp' and 'uverbs' into for-next
parents
04ea2f81
80783868
c337374b
52f81dba
83e9502d
737b94eb
71c29bd5
Changes
31
Expand all
Show whitespace changes
Inline
Side-by-side
Showing
31 changed files
with
628 additions
and
156 deletions
+628
-156
drivers/infiniband/Kconfig
drivers/infiniband/Kconfig
+1
-0
drivers/infiniband/core/Makefile
drivers/infiniband/core/Makefile
+1
-1
drivers/infiniband/core/cm.c
drivers/infiniband/core/cm.c
+8
-0
drivers/infiniband/core/cma.c
drivers/infiniband/core/cma.c
+200
-108
drivers/infiniband/core/device.c
drivers/infiniband/core/device.c
+22
-3
drivers/infiniband/core/mad.c
drivers/infiniband/core/mad.c
+7
-0
drivers/infiniband/core/netlink.c
drivers/infiniband/core/netlink.c
+190
-0
drivers/infiniband/core/ucma.c
drivers/infiniband/core/ucma.c
+23
-4
drivers/infiniband/core/user_mad.c
drivers/infiniband/core/user_mad.c
+7
-0
drivers/infiniband/core/uverbs_main.c
drivers/infiniband/core/uverbs_main.c
+8
-0
drivers/infiniband/hw/cxgb3/iwch_cm.c
drivers/infiniband/hw/cxgb3/iwch_cm.c
+17
-9
drivers/infiniband/hw/cxgb3/iwch_provider.h
drivers/infiniband/hw/cxgb3/iwch_provider.h
+1
-1
drivers/infiniband/hw/cxgb3/iwch_qp.c
drivers/infiniband/hw/cxgb3/iwch_qp.c
+3
-3
drivers/infiniband/hw/cxgb4/iw_cxgb4.h
drivers/infiniband/hw/cxgb4/iw_cxgb4.h
+5
-13
drivers/infiniband/hw/nes/nes.c
drivers/infiniband/hw/nes/nes.c
+3
-1
drivers/infiniband/hw/qib/Kconfig
drivers/infiniband/hw/qib/Kconfig
+1
-1
drivers/infiniband/ulp/iser/iser_verbs.c
drivers/infiniband/ulp/iser/iser_verbs.c
+1
-1
drivers/infiniband/ulp/srp/ib_srp.c
drivers/infiniband/ulp/srp/ib_srp.c
+2
-2
include/linux/netlink.h
include/linux/netlink.h
+1
-0
include/rdma/Kbuild
include/rdma/Kbuild
+5
-0
include/rdma/ib_user_cm.h
include/rdma/ib_user_cm.h
+1
-0
include/rdma/rdma_cm.h
include/rdma/rdma_cm.h
+18
-1
include/rdma/rdma_netlink.h
include/rdma/rdma_netlink.h
+92
-0
net/9p/trans_rdma.c
net/9p/trans_rdma.c
+2
-1
net/rds/ib.c
net/rds/ib.c
+1
-1
net/rds/ib_cm.c
net/rds/ib_cm.c
+1
-1
net/rds/iw.c
net/rds/iw.c
+1
-1
net/rds/iw_cm.c
net/rds/iw_cm.c
+1
-1
net/rds/rdma_transport.c
net/rds/rdma_transport.c
+2
-1
net/sunrpc/xprtrdma/svc_rdma_transport.c
net/sunrpc/xprtrdma/svc_rdma_transport.c
+2
-1
net/sunrpc/xprtrdma/verbs.c
net/sunrpc/xprtrdma/verbs.c
+1
-1
No files found.
drivers/infiniband/Kconfig
View file @
8dc4abdf
...
...
@@ -2,6 +2,7 @@ menuconfig INFINIBAND
tristate "InfiniBand support"
depends on PCI || BROKEN
depends on HAS_IOMEM
depends on NET
---help---
Core support for InfiniBand (IB). Make sure to also select
any protocols you wish to use as well as drivers for your
...
...
drivers/infiniband/core/Makefile
View file @
8dc4abdf
...
...
@@ -8,7 +8,7 @@ obj-$(CONFIG_INFINIBAND_USER_ACCESS) += ib_uverbs.o ib_ucm.o \
$
(
user_access-y
)
ib_core-y
:=
packer.o ud_header.o verbs.o sysfs.o
\
device.o fmr_pool.o cache.o
device.o fmr_pool.o cache.o
netlink.o
ib_core-$(CONFIG_INFINIBAND_USER_MEM)
+=
umem.o
ib_mad-y
:=
mad.o smi.o agent.o mad_rmpp.o
...
...
drivers/infiniband/core/cm.c
View file @
8dc4abdf
...
...
@@ -3639,8 +3639,16 @@ static struct kobj_type cm_port_obj_type = {
.
release
=
cm_release_port_obj
};
static
char
*
cm_devnode
(
struct
device
*
dev
,
mode_t
*
mode
)
{
*
mode
=
0666
;
return
kasprintf
(
GFP_KERNEL
,
"infiniband/%s"
,
dev_name
(
dev
));
}
struct
class
cm_class
=
{
.
owner
=
THIS_MODULE
,
.
name
=
"infiniband_cm"
,
.
devnode
=
cm_devnode
,
};
EXPORT_SYMBOL
(
cm_class
);
...
...
drivers/infiniband/core/cma.c
View file @
8dc4abdf
This diff is collapsed.
Click to expand it.
drivers/infiniband/core/device.c
View file @
8dc4abdf
...
...
@@ -38,6 +38,7 @@
#include <linux/slab.h>
#include <linux/init.h>
#include <linux/mutex.h>
#include <rdma/rdma_netlink.h>
#include "core_priv.h"
...
...
@@ -725,22 +726,40 @@ static int __init ib_core_init(void)
return
-
ENOMEM
;
ret
=
ib_sysfs_setup
();
if
(
ret
)
if
(
ret
)
{
printk
(
KERN_WARNING
"Couldn't create InfiniBand device class
\n
"
);
goto
err
;
}
ret
=
ibnl_init
();
if
(
ret
)
{
printk
(
KERN_WARNING
"Couldn't init IB netlink interface
\n
"
);
goto
err_sysfs
;
}
ret
=
ib_cache_setup
();
if
(
ret
)
{
printk
(
KERN_WARNING
"Couldn't set up InfiniBand P_Key/GID cache
\n
"
);
ib_sysfs_cleanup
();
destroy_workqueue
(
ib_wq
);
goto
err_nl
;
}
return
0
;
err_nl:
ibnl_cleanup
();
err_sysfs:
ib_sysfs_cleanup
();
err:
destroy_workqueue
(
ib_wq
);
return
ret
;
}
static
void
__exit
ib_core_cleanup
(
void
)
{
ib_cache_cleanup
();
ibnl_cleanup
();
ib_sysfs_cleanup
();
/* Make sure that any pending umem accounting work is done. */
destroy_workqueue
(
ib_wq
);
...
...
drivers/infiniband/core/mad.c
View file @
8dc4abdf
...
...
@@ -276,6 +276,13 @@ struct ib_mad_agent *ib_register_mad_agent(struct ib_device *device,
goto
error1
;
}
/* Verify the QP requested is supported. For example, Ethernet devices
* will not have QP0 */
if
(
!
port_priv
->
qp_info
[
qpn
].
qp
)
{
ret
=
ERR_PTR
(
-
EPROTONOSUPPORT
);
goto
error1
;
}
/* Allocate structures */
mad_agent_priv
=
kzalloc
(
sizeof
*
mad_agent_priv
,
GFP_KERNEL
);
if
(
!
mad_agent_priv
)
{
...
...
drivers/infiniband/core/netlink.c
0 → 100644
View file @
8dc4abdf
/*
* Copyright (c) 2010 Voltaire Inc. All rights reserved.
*
* This software is available to you under a choice of one of two
* licenses. You may choose to be licensed under the terms of the GNU
* General Public License (GPL) Version 2, available from the file
* COPYING in the main directory of this source tree, or the
* OpenIB.org BSD license below:
*
* Redistribution and use in source and binary forms, with or
* without modification, are permitted provided that the following
* conditions are met:
*
* - Redistributions of source code must retain the above
* copyright notice, this list of conditions and the following
* disclaimer.
*
* - Redistributions in binary form must reproduce the above
* copyright notice, this list of conditions and the following
* disclaimer in the documentation and/or other materials
* provided with the distribution.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
* BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
* ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*/
#define pr_fmt(fmt) "%s:%s: " fmt, KBUILD_MODNAME, __func__
#include <net/netlink.h>
#include <net/net_namespace.h>
#include <net/sock.h>
#include <rdma/rdma_netlink.h>
struct
ibnl_client
{
struct
list_head
list
;
int
index
;
int
nops
;
const
struct
ibnl_client_cbs
*
cb_table
;
};
static
DEFINE_MUTEX
(
ibnl_mutex
);
static
struct
sock
*
nls
;
static
LIST_HEAD
(
client_list
);
int
ibnl_add_client
(
int
index
,
int
nops
,
const
struct
ibnl_client_cbs
cb_table
[])
{
struct
ibnl_client
*
cur
;
struct
ibnl_client
*
nl_client
;
nl_client
=
kmalloc
(
sizeof
*
nl_client
,
GFP_KERNEL
);
if
(
!
nl_client
)
return
-
ENOMEM
;
nl_client
->
index
=
index
;
nl_client
->
nops
=
nops
;
nl_client
->
cb_table
=
cb_table
;
mutex_lock
(
&
ibnl_mutex
);
list_for_each_entry
(
cur
,
&
client_list
,
list
)
{
if
(
cur
->
index
==
index
)
{
pr_warn
(
"Client for %d already exists
\n
"
,
index
);
mutex_unlock
(
&
ibnl_mutex
);
kfree
(
nl_client
);
return
-
EINVAL
;
}
}
list_add_tail
(
&
nl_client
->
list
,
&
client_list
);
mutex_unlock
(
&
ibnl_mutex
);
return
0
;
}
EXPORT_SYMBOL
(
ibnl_add_client
);
int
ibnl_remove_client
(
int
index
)
{
struct
ibnl_client
*
cur
,
*
next
;
mutex_lock
(
&
ibnl_mutex
);
list_for_each_entry_safe
(
cur
,
next
,
&
client_list
,
list
)
{
if
(
cur
->
index
==
index
)
{
list_del
(
&
(
cur
->
list
));
mutex_unlock
(
&
ibnl_mutex
);
kfree
(
cur
);
return
0
;
}
}
pr_warn
(
"Can't remove callback for client idx %d. Not found
\n
"
,
index
);
mutex_unlock
(
&
ibnl_mutex
);
return
-
EINVAL
;
}
EXPORT_SYMBOL
(
ibnl_remove_client
);
void
*
ibnl_put_msg
(
struct
sk_buff
*
skb
,
struct
nlmsghdr
**
nlh
,
int
seq
,
int
len
,
int
client
,
int
op
)
{
unsigned
char
*
prev_tail
;
prev_tail
=
skb_tail_pointer
(
skb
);
*
nlh
=
NLMSG_NEW
(
skb
,
0
,
seq
,
RDMA_NL_GET_TYPE
(
client
,
op
),
len
,
NLM_F_MULTI
);
(
*
nlh
)
->
nlmsg_len
=
skb_tail_pointer
(
skb
)
-
prev_tail
;
return
NLMSG_DATA
(
*
nlh
);
nlmsg_failure:
nlmsg_trim
(
skb
,
prev_tail
);
return
NULL
;
}
EXPORT_SYMBOL
(
ibnl_put_msg
);
int
ibnl_put_attr
(
struct
sk_buff
*
skb
,
struct
nlmsghdr
*
nlh
,
int
len
,
void
*
data
,
int
type
)
{
unsigned
char
*
prev_tail
;
prev_tail
=
skb_tail_pointer
(
skb
);
NLA_PUT
(
skb
,
type
,
len
,
data
);
nlh
->
nlmsg_len
+=
skb_tail_pointer
(
skb
)
-
prev_tail
;
return
0
;
nla_put_failure:
nlmsg_trim
(
skb
,
prev_tail
-
nlh
->
nlmsg_len
);
return
-
EMSGSIZE
;
}
EXPORT_SYMBOL
(
ibnl_put_attr
);
static
int
ibnl_rcv_msg
(
struct
sk_buff
*
skb
,
struct
nlmsghdr
*
nlh
)
{
struct
ibnl_client
*
client
;
int
type
=
nlh
->
nlmsg_type
;
int
index
=
RDMA_NL_GET_CLIENT
(
type
);
int
op
=
RDMA_NL_GET_OP
(
type
);
list_for_each_entry
(
client
,
&
client_list
,
list
)
{
if
(
client
->
index
==
index
)
{
if
(
op
<
0
||
op
>=
client
->
nops
||
!
client
->
cb_table
[
RDMA_NL_GET_OP
(
op
)].
dump
)
return
-
EINVAL
;
return
netlink_dump_start
(
nls
,
skb
,
nlh
,
client
->
cb_table
[
op
].
dump
,
NULL
);
}
}
pr_info
(
"Index %d wasn't found in client list
\n
"
,
index
);
return
-
EINVAL
;
}
static
void
ibnl_rcv
(
struct
sk_buff
*
skb
)
{
mutex_lock
(
&
ibnl_mutex
);
netlink_rcv_skb
(
skb
,
&
ibnl_rcv_msg
);
mutex_unlock
(
&
ibnl_mutex
);
}
int
__init
ibnl_init
(
void
)
{
nls
=
netlink_kernel_create
(
&
init_net
,
NETLINK_RDMA
,
0
,
ibnl_rcv
,
NULL
,
THIS_MODULE
);
if
(
!
nls
)
{
pr_warn
(
"Failed to create netlink socket
\n
"
);
return
-
ENOMEM
;
}
return
0
;
}
void
ibnl_cleanup
(
void
)
{
struct
ibnl_client
*
cur
,
*
next
;
mutex_lock
(
&
ibnl_mutex
);
list_for_each_entry_safe
(
cur
,
next
,
&
client_list
,
list
)
{
list_del
(
&
(
cur
->
list
));
kfree
(
cur
);
}
mutex_unlock
(
&
ibnl_mutex
);
netlink_kernel_release
(
nls
);
}
drivers/infiniband/core/ucma.c
View file @
8dc4abdf
...
...
@@ -367,13 +367,28 @@ static ssize_t ucma_get_event(struct ucma_file *file, const char __user *inbuf,
return
ret
;
}
static
ssize_t
ucma_create_id
(
struct
ucma_file
*
file
,
const
char
__user
*
inbuf
,
static
int
ucma_get_qp_type
(
struct
rdma_ucm_create_id
*
cmd
,
enum
ib_qp_type
*
qp_type
)
{
switch
(
cmd
->
ps
)
{
case
RDMA_PS_TCP
:
*
qp_type
=
IB_QPT_RC
;
return
0
;
case
RDMA_PS_UDP
:
case
RDMA_PS_IPOIB
:
*
qp_type
=
IB_QPT_UD
;
return
0
;
default:
return
-
EINVAL
;
}
}
static
ssize_t
ucma_create_id
(
struct
ucma_file
*
file
,
const
char
__user
*
inbuf
,
int
in_len
,
int
out_len
)
{
struct
rdma_ucm_create_id
cmd
;
struct
rdma_ucm_create_id_resp
resp
;
struct
ucma_context
*
ctx
;
enum
ib_qp_type
qp_type
;
int
ret
;
if
(
out_len
<
sizeof
(
resp
))
...
...
@@ -382,6 +397,10 @@ static ssize_t ucma_create_id(struct ucma_file *file,
if
(
copy_from_user
(
&
cmd
,
inbuf
,
sizeof
(
cmd
)))
return
-
EFAULT
;
ret
=
ucma_get_qp_type
(
&
cmd
,
&
qp_type
);
if
(
ret
)
return
ret
;
mutex_lock
(
&
file
->
mut
);
ctx
=
ucma_alloc_ctx
(
file
);
mutex_unlock
(
&
file
->
mut
);
...
...
@@ -389,7 +408,7 @@ static ssize_t ucma_create_id(struct ucma_file *file,
return
-
ENOMEM
;
ctx
->
uid
=
cmd
.
uid
;
ctx
->
cm_id
=
rdma_create_id
(
ucma_event_handler
,
ctx
,
cmd
.
ps
);
ctx
->
cm_id
=
rdma_create_id
(
ucma_event_handler
,
ctx
,
cmd
.
ps
,
qp_type
);
if
(
IS_ERR
(
ctx
->
cm_id
))
{
ret
=
PTR_ERR
(
ctx
->
cm_id
);
goto
err1
;
...
...
drivers/infiniband/core/user_mad.c
View file @
8dc4abdf
...
...
@@ -1176,6 +1176,11 @@ static void ib_umad_remove_one(struct ib_device *device)
kref_put
(
&
umad_dev
->
ref
,
ib_umad_release_dev
);
}
static
char
*
umad_devnode
(
struct
device
*
dev
,
mode_t
*
mode
)
{
return
kasprintf
(
GFP_KERNEL
,
"infiniband/%s"
,
dev_name
(
dev
));
}
static
int
__init
ib_umad_init
(
void
)
{
int
ret
;
...
...
@@ -1194,6 +1199,8 @@ static int __init ib_umad_init(void)
goto
out_chrdev
;
}
umad_class
->
devnode
=
umad_devnode
;
ret
=
class_create_file
(
umad_class
,
&
class_attr_abi_version
.
attr
);
if
(
ret
)
{
printk
(
KERN_ERR
"user_mad: couldn't create abi_version attribute
\n
"
);
...
...
drivers/infiniband/core/uverbs_main.c
View file @
8dc4abdf
...
...
@@ -824,6 +824,12 @@ static void ib_uverbs_remove_one(struct ib_device *device)
kfree
(
uverbs_dev
);
}
static
char
*
uverbs_devnode
(
struct
device
*
dev
,
mode_t
*
mode
)
{
*
mode
=
0666
;
return
kasprintf
(
GFP_KERNEL
,
"infiniband/%s"
,
dev_name
(
dev
));
}
static
int
__init
ib_uverbs_init
(
void
)
{
int
ret
;
...
...
@@ -842,6 +848,8 @@ static int __init ib_uverbs_init(void)
goto
out_chrdev
;
}
uverbs_class
->
devnode
=
uverbs_devnode
;
ret
=
class_create_file
(
uverbs_class
,
&
class_attr_abi_version
.
attr
);
if
(
ret
)
{
printk
(
KERN_ERR
"user_verbs: couldn't create abi_version attribute
\n
"
);
...
...
drivers/infiniband/hw/cxgb3/iwch_cm.c
View file @
8dc4abdf
...
...
@@ -913,7 +913,7 @@ static void process_mpa_reply(struct iwch_ep *ep, struct sk_buff *skb)
goto
err
;
if
(
peer2peer
&&
iwch_rqes_posted
(
ep
->
com
.
qp
)
==
0
)
{
iwch_post_zb_read
(
ep
->
com
.
qp
);
iwch_post_zb_read
(
ep
);
}
goto
out
;
...
...
@@ -1077,6 +1077,8 @@ static int tx_ack(struct t3cdev *tdev, struct sk_buff *skb, void *ctx)
struct
iwch_ep
*
ep
=
ctx
;
struct
cpl_wr_ack
*
hdr
=
cplhdr
(
skb
);
unsigned
int
credits
=
ntohs
(
hdr
->
credits
);
unsigned
long
flags
;
int
post_zb
=
0
;
PDBG
(
"%s ep %p credits %u
\n
"
,
__func__
,
ep
,
credits
);
...
...
@@ -1086,28 +1088,34 @@ static int tx_ack(struct t3cdev *tdev, struct sk_buff *skb, void *ctx)
return
CPL_RET_BUF_DONE
;
}
spin_lock_irqsave
(
&
ep
->
com
.
lock
,
flags
);
BUG_ON
(
credits
!=
1
);
dst_confirm
(
ep
->
dst
);
if
(
!
ep
->
mpa_skb
)
{
PDBG
(
"%s rdma_init wr_ack ep %p state %u
\n
"
,
__func__
,
ep
,
state_read
(
&
ep
->
com
)
);
__func__
,
ep
,
ep
->
com
.
state
);
if
(
ep
->
mpa_attr
.
initiator
)
{
PDBG
(
"%s initiator ep %p state %u
\n
"
,
__func__
,
ep
,
state_read
(
&
ep
->
com
)
);
if
(
peer2peer
)
iwch_post_zb_read
(
ep
->
com
.
qp
)
;
__func__
,
ep
,
ep
->
com
.
state
);
if
(
peer2peer
&&
ep
->
com
.
state
==
FPDU_MODE
)
post_zb
=
1
;
}
else
{
PDBG
(
"%s responder ep %p state %u
\n
"
,
__func__
,
ep
,
state_read
(
&
ep
->
com
));
__func__
,
ep
,
ep
->
com
.
state
);
if
(
ep
->
com
.
state
==
MPA_REQ_RCVD
)
{
ep
->
com
.
rpl_done
=
1
;
wake_up
(
&
ep
->
com
.
waitq
);
}
}
}
else
{
PDBG
(
"%s lsm ack ep %p state %u freeing skb
\n
"
,
__func__
,
ep
,
state_read
(
&
ep
->
com
)
);
__func__
,
ep
,
ep
->
com
.
state
);
kfree_skb
(
ep
->
mpa_skb
);
ep
->
mpa_skb
=
NULL
;
}
spin_unlock_irqrestore
(
&
ep
->
com
.
lock
,
flags
);
if
(
post_zb
)
iwch_post_zb_read
(
ep
);
return
CPL_RET_BUF_DONE
;
}
...
...
drivers/infiniband/hw/cxgb3/iwch_provider.h
View file @
8dc4abdf
...
...
@@ -332,7 +332,7 @@ int iwch_bind_mw(struct ib_qp *qp,
struct
ib_mw_bind
*
mw_bind
);
int
iwch_poll_cq
(
struct
ib_cq
*
ibcq
,
int
num_entries
,
struct
ib_wc
*
wc
);
int
iwch_post_terminate
(
struct
iwch_qp
*
qhp
,
struct
respQ_msg_t
*
rsp_msg
);
int
iwch_post_zb_read
(
struct
iwch_
qp
*
qh
p
);
int
iwch_post_zb_read
(
struct
iwch_
ep
*
e
p
);
int
iwch_register_device
(
struct
iwch_dev
*
dev
);
void
iwch_unregister_device
(
struct
iwch_dev
*
dev
);
void
stop_read_rep_timer
(
struct
iwch_qp
*
qhp
);
...
...
drivers/infiniband/hw/cxgb3/iwch_qp.c
View file @
8dc4abdf
...
...
@@ -738,7 +738,7 @@ static inline void build_term_codes(struct respQ_msg_t *rsp_msg,
}
}
int
iwch_post_zb_read
(
struct
iwch_
qp
*
qh
p
)
int
iwch_post_zb_read
(
struct
iwch_
ep
*
e
p
)
{
union
t3_wr
*
wqe
;
struct
sk_buff
*
skb
;
...
...
@@ -761,10 +761,10 @@ int iwch_post_zb_read(struct iwch_qp *qhp)
wqe
->
read
.
local_len
=
cpu_to_be32
(
0
);
wqe
->
read
.
local_to
=
cpu_to_be64
(
1
);
wqe
->
send
.
wrh
.
op_seop_flags
=
cpu_to_be32
(
V_FW_RIWR_OP
(
T3_WR_READ
));
wqe
->
send
.
wrh
.
gen_tid_len
=
cpu_to_be32
(
V_FW_RIWR_TID
(
qhp
->
ep
->
hwtid
)
|
wqe
->
send
.
wrh
.
gen_tid_len
=
cpu_to_be32
(
V_FW_RIWR_TID
(
ep
->
hwtid
)
|
V_FW_RIWR_LEN
(
flit_cnt
));
skb
->
priority
=
CPL_PRIORITY_DATA
;
return
iwch_cxgb3_ofld_send
(
qh
p
->
rhp
->
rdev
.
t3cdev_p
,
skb
);
return
iwch_cxgb3_ofld_send
(
ep
->
com
.
q
p
->
rhp
->
rdev
.
t3cdev_p
,
skb
);
}
/*
...
...
drivers/infiniband/hw/cxgb4/iw_cxgb4.h
View file @
8dc4abdf
...
...
@@ -35,7 +35,7 @@
#include <linux/list.h>
#include <linux/spinlock.h>
#include <linux/idr.h>
#include <linux/
workqueue
.h>
#include <linux/
completion
.h>
#include <linux/netdevice.h>
#include <linux/sched.h>
#include <linux/pci.h>
...
...
@@ -131,28 +131,21 @@ static inline int c4iw_num_stags(struct c4iw_rdev *rdev)
#define C4IW_WR_TO (10*HZ)
enum
{
REPLY_READY
=
0
,
};
struct
c4iw_wr_wait
{
wait_queue_head_t
wait
;
unsigned
long
status
;
struct
completion
completion
;
int
ret
;
};
static
inline
void
c4iw_init_wr_wait
(
struct
c4iw_wr_wait
*
wr_waitp
)
{
wr_waitp
->
ret
=
0
;
wr_waitp
->
status
=
0
;
init_waitqueue_head
(
&
wr_waitp
->
wait
);
init_completion
(
&
wr_waitp
->
completion
);
}
static
inline
void
c4iw_wake_up
(
struct
c4iw_wr_wait
*
wr_waitp
,
int
ret
)
{
wr_waitp
->
ret
=
ret
;
set_bit
(
REPLY_READY
,
&
wr_waitp
->
status
);
wake_up
(
&
wr_waitp
->
wait
);
complete
(
&
wr_waitp
->
completion
);
}
static
inline
int
c4iw_wait_for_reply
(
struct
c4iw_rdev
*
rdev
,
...
...
@@ -164,8 +157,7 @@ static inline int c4iw_wait_for_reply(struct c4iw_rdev *rdev,
int
ret
;
do
{
ret
=
wait_event_timeout
(
wr_waitp
->
wait
,
test_and_clear_bit
(
REPLY_READY
,
&
wr_waitp
->
status
),
to
);
ret
=
wait_for_completion_timeout
(
&
wr_waitp
->
completion
,
to
);
if
(
!
ret
)
{
printk
(
KERN_ERR
MOD
"%s - Device %s not responding - "
"tid %u qpid %u
\n
"
,
func
,
...
...
drivers/infiniband/hw/nes/nes.c
View file @
8dc4abdf
...
...
@@ -1138,7 +1138,9 @@ static ssize_t nes_store_wqm_quanta(struct device_driver *ddp,
u32
i
=
0
;
struct
nes_device
*
nesdev
;
strict_strtoul
(
buf
,
0
,
&
wqm_quanta_value
);
if
(
kstrtoul
(
buf
,
0
,
&
wqm_quanta_value
)
<
0
)
return
-
EINVAL
;
list_for_each_entry
(
nesdev
,
&
nes_dev_list
,
list
)
{
if
(
i
==
ee_flsh_adapter
)
{
nesdev
->
nesadapter
->
wqm_quanta
=
wqm_quanta_value
;
...
...
drivers/infiniband/hw/qib/Kconfig
View file @
8dc4abdf
config INFINIBAND_QIB
tristate "QLogic PCIe HCA support"
depends on 64BIT
&& NET
depends on 64BIT
---help---
This is a low-level driver for QLogic PCIe QLE InfiniBand host
channel adapters. This driver does not support the QLogic
...
...
drivers/infiniband/ulp/iser/iser_verbs.c
View file @
8dc4abdf
...
...
@@ -548,7 +548,7 @@ int iser_connect(struct iser_conn *ib_conn,
iser_conn_get
(
ib_conn
);
/* ref ib conn's cma id */
ib_conn
->
cma_id
=
rdma_create_id
(
iser_cma_handler
,
(
void
*
)
ib_conn
,
RDMA_PS_TCP
);
RDMA_PS_TCP
,
IB_QPT_RC
);
if
(
IS_ERR
(
ib_conn
->
cma_id
))
{
err
=
PTR_ERR
(
ib_conn
->
cma_id
);
iser_err
(
"rdma_create_id failed: %d
\n
"
,
err
);
...
...
drivers/infiniband/ulp/srp/ib_srp.c
View file @
8dc4abdf
...
...
@@ -1147,7 +1147,7 @@ static void srp_process_aer_req(struct srp_target_port *target,
static
void
srp_handle_recv
(
struct
srp_target_port
*
target
,
struct
ib_wc
*
wc
)
{
struct
ib_device
*
dev
=
target
->
srp_host
->
srp_dev
->
dev
;
struct
srp_iu
*
iu
=
(
struct
srp_iu
*
)
wc
->
wr_id
;
struct
srp_iu
*
iu
=
(
struct
srp_iu
*
)
(
uintptr_t
)
wc
->
wr_id
;
int
res
;
u8
opcode
;
...
...
@@ -1231,7 +1231,7 @@ static void srp_send_completion(struct ib_cq *cq, void *target_ptr)
break
;
}
iu
=
(
struct
srp_iu
*
)
wc
.
wr_id
;
iu
=
(
struct
srp_iu
*
)
(
uintptr_t
)
wc
.
wr_id
;
list_add
(
&
iu
->
list
,
&
target
->
free_tx
);
}
}
...
...
include/linux/netlink.h
View file @
8dc4abdf
...
...
@@ -24,6 +24,7 @@
/* leave room for NETLINK_DM (DM Events) */
#define NETLINK_SCSITRANSPORT 18
/* SCSI Transports */
#define NETLINK_ECRYPTFS 19
#define NETLINK_RDMA 20
#define MAX_LINKS 32
...
...
include/rdma/Kbuild
View file @
8dc4abdf
header-y += ib_user_cm.h
header-y += ib_user_mad.h
header-y += ib_user_sa.h
header-y += ib_user_verbs.h
header-y += rdma_netlink.h
header-y += rdma_user_cm.h
include/rdma/ib_user_cm.h
View file @
8dc4abdf
...
...
@@ -34,6 +34,7 @@
#ifndef IB_USER_CM_H
#define IB_USER_CM_H
#include <linux/types.h>
#include <rdma/ib_user_sa.h>
#define IB_USER_CM_ABI_VERSION 5
...
...
include/rdma/rdma_cm.h
View file @
8dc4abdf
...
...
@@ -111,6 +111,20 @@ struct rdma_cm_event {
}
param
;
};
enum
rdma_cm_state
{
RDMA_CM_IDLE
,
RDMA_CM_ADDR_QUERY
,
RDMA_CM_ADDR_RESOLVED
,
RDMA_CM_ROUTE_QUERY
,
RDMA_CM_ROUTE_RESOLVED
,
RDMA_CM_CONNECT
,
RDMA_CM_DISCONNECT
,
RDMA_CM_ADDR_BOUND
,
RDMA_CM_LISTEN
,
RDMA_CM_DEVICE_REMOVAL
,
RDMA_CM_DESTROYING
};
struct
rdma_cm_id
;
/**
...
...
@@ -130,6 +144,7 @@ struct rdma_cm_id {
rdma_cm_event_handler
event_handler
;
struct
rdma_route
route
;
enum
rdma_port_space
ps
;
enum
ib_qp_type
qp_type
;
u8
port_num
;
};
...
...
@@ -140,9 +155,11 @@ struct rdma_cm_id {
* returned rdma_id.
* @context: User specified context associated with the id.
* @ps: RDMA port space.
* @qp_type: type of queue pair associated with the id.
*/
struct
rdma_cm_id
*
rdma_create_id
(
rdma_cm_event_handler
event_handler
,
void
*
context
,
enum
rdma_port_space
ps
);
void
*
context
,
enum
rdma_port_space
ps
,
enum
ib_qp_type
qp_type
);
/**
* rdma_destroy_id - Destroys an RDMA identifier.
...
...
include/rdma/rdma_netlink.h
0 → 100644
View file @
8dc4abdf
#ifndef _RDMA_NETLINK_H
#define _RDMA_NETLINK_H
#include <linux/types.h>
enum
{
RDMA_NL_RDMA_CM
=
1
};
#define RDMA_NL_GET_CLIENT(type) ((type & (((1 << 6) - 1) << 10)) >> 10)
#define RDMA_NL_GET_OP(type) (type & ((1 << 10) - 1))
#define RDMA_NL_GET_TYPE(client, op) ((client << 10) + op)
enum
{
RDMA_NL_RDMA_CM_ID_STATS
=
0
,
RDMA_NL_RDMA_CM_NUM_OPS
};
enum
{
RDMA_NL_RDMA_CM_ATTR_SRC_ADDR
=
1
,
RDMA_NL_RDMA_CM_ATTR_DST_ADDR
,
RDMA_NL_RDMA_CM_NUM_ATTR
,
};
struct
rdma_cm_id_stats
{
__u32
qp_num
;
__u32
bound_dev_if
;
__u32
port_space
;
__s32
pid
;
__u8
cm_state
;
__u8
node_type
;
__u8
port_num
;
__u8
qp_type
;
};
#ifdef __KERNEL__
#include <linux/netlink.h>
struct
ibnl_client_cbs
{
int
(
*
dump
)(
struct
sk_buff
*
skb
,
struct
netlink_callback
*
nlcb
);
};
int
ibnl_init
(
void
);
void
ibnl_cleanup
(
void
);
/**
* Add a a client to the list of IB netlink exporters.
* @index: Index of the added client
* @nops: Number of supported ops by the added client.
* @cb_table: A table for op->callback
*
* Returns 0 on success or a negative error code.
*/
int
ibnl_add_client
(
int
index
,
int
nops
,
const
struct
ibnl_client_cbs
cb_table
[]);
/**
* Remove a client from IB netlink.
* @index: Index of the removed IB client.
*
* Returns 0 on success or a negative error code.
*/
int
ibnl_remove_client
(
int
index
);
/**
* Put a new message in a supplied skb.
* @skb: The netlink skb.
* @nlh: Pointer to put the header of the new netlink message.
* @seq: The message sequence number.
* @len: The requested message length to allocate.
* @client: Calling IB netlink client.
* @op: message content op.
* Returns the allocated buffer on success and NULL on failure.
*/
void
*
ibnl_put_msg
(
struct
sk_buff
*
skb
,
struct
nlmsghdr
**
nlh
,
int
seq
,
int
len
,
int
client
,
int
op
);
/**
* Put a new attribute in a supplied skb.
* @skb: The netlink skb.
* @nlh: Header of the netlink message to append the attribute to.
* @len: The length of the attribute data.
* @data: The attribute data to put.
* @type: The attribute type.
* Returns the 0 and a negative error code on failure.
*/
int
ibnl_put_attr
(
struct
sk_buff
*
skb
,
struct
nlmsghdr
*
nlh
,
int
len
,
void
*
data
,
int
type
);
#endif
/* __KERNEL__ */
#endif
/* _RDMA_NETLINK_H */
net/9p/trans_rdma.c
View file @
8dc4abdf
...
...
@@ -591,7 +591,8 @@ rdma_create_trans(struct p9_client *client, const char *addr, char *args)
return
-
ENOMEM
;
/* Create the RDMA CM ID */
rdma
->
cm_id
=
rdma_create_id
(
p9_cm_event_handler
,
client
,
RDMA_PS_TCP
);
rdma
->
cm_id
=
rdma_create_id
(
p9_cm_event_handler
,
client
,
RDMA_PS_TCP
,
IB_QPT_RC
);
if
(
IS_ERR
(
rdma
->
cm_id
))
goto
error
;
...
...
net/rds/ib.c
View file @
8dc4abdf
...
...
@@ -325,7 +325,7 @@ static int rds_ib_laddr_check(__be32 addr)
/* Create a CMA ID and try to bind it. This catches both
* IB and iWARP capable NICs.
*/
cm_id
=
rdma_create_id
(
NULL
,
NULL
,
RDMA_PS_TCP
);
cm_id
=
rdma_create_id
(
NULL
,
NULL
,
RDMA_PS_TCP
,
IB_QPT_RC
);
if
(
IS_ERR
(
cm_id
))
return
PTR_ERR
(
cm_id
);
...
...
net/rds/ib_cm.c
View file @
8dc4abdf
...
...
@@ -587,7 +587,7 @@ int rds_ib_conn_connect(struct rds_connection *conn)
/* XXX I wonder what affect the port space has */
/* delegate cm event handler to rdma_transport */
ic
->
i_cm_id
=
rdma_create_id
(
rds_rdma_cm_event_handler
,
conn
,
RDMA_PS_TCP
);
RDMA_PS_TCP
,
IB_QPT_RC
);
if
(
IS_ERR
(
ic
->
i_cm_id
))
{
ret
=
PTR_ERR
(
ic
->
i_cm_id
);
ic
->
i_cm_id
=
NULL
;
...
...
net/rds/iw.c
View file @
8dc4abdf
...
...
@@ -226,7 +226,7 @@ static int rds_iw_laddr_check(__be32 addr)
/* Create a CMA ID and try to bind it. This catches both
* IB and iWARP capable NICs.
*/
cm_id
=
rdma_create_id
(
NULL
,
NULL
,
RDMA_PS_TCP
);
cm_id
=
rdma_create_id
(
NULL
,
NULL
,
RDMA_PS_TCP
,
IB_QPT_RC
);
if
(
IS_ERR
(
cm_id
))
return
PTR_ERR
(
cm_id
);
...
...
net/rds/iw_cm.c
View file @
8dc4abdf
...
...
@@ -522,7 +522,7 @@ int rds_iw_conn_connect(struct rds_connection *conn)
/* XXX I wonder what affect the port space has */
/* delegate cm event handler to rdma_transport */
ic
->
i_cm_id
=
rdma_create_id
(
rds_rdma_cm_event_handler
,
conn
,
RDMA_PS_TCP
);
RDMA_PS_TCP
,
IB_QPT_RC
);
if
(
IS_ERR
(
ic
->
i_cm_id
))
{
ret
=
PTR_ERR
(
ic
->
i_cm_id
);
ic
->
i_cm_id
=
NULL
;
...
...
net/rds/rdma_transport.c
View file @
8dc4abdf
...
...
@@ -158,7 +158,8 @@ static int rds_rdma_listen_init(void)
struct
rdma_cm_id
*
cm_id
;
int
ret
;
cm_id
=
rdma_create_id
(
rds_rdma_cm_event_handler
,
NULL
,
RDMA_PS_TCP
);
cm_id
=
rdma_create_id
(
rds_rdma_cm_event_handler
,
NULL
,
RDMA_PS_TCP
,
IB_QPT_RC
);
if
(
IS_ERR
(
cm_id
))
{
ret
=
PTR_ERR
(
cm_id
);
printk
(
KERN_ERR
"RDS/RDMA: failed to setup listener, "
...
...
net/sunrpc/xprtrdma/svc_rdma_transport.c
View file @
8dc4abdf
...
...
@@ -695,7 +695,8 @@ static struct svc_xprt *svc_rdma_create(struct svc_serv *serv,
return
ERR_PTR
(
-
ENOMEM
);
xprt
=
&
cma_xprt
->
sc_xprt
;
listen_id
=
rdma_create_id
(
rdma_listen_handler
,
cma_xprt
,
RDMA_PS_TCP
);
listen_id
=
rdma_create_id
(
rdma_listen_handler
,
cma_xprt
,
RDMA_PS_TCP
,
IB_QPT_RC
);
if
(
IS_ERR
(
listen_id
))
{
ret
=
PTR_ERR
(
listen_id
);
dprintk
(
"svcrdma: rdma_create_id failed = %d
\n
"
,
ret
);
...
...
net/sunrpc/xprtrdma/verbs.c
View file @
8dc4abdf
...
...
@@ -387,7 +387,7 @@ rpcrdma_create_id(struct rpcrdma_xprt *xprt,
init_completion
(
&
ia
->
ri_done
);
id
=
rdma_create_id
(
rpcrdma_conn_upcall
,
xprt
,
RDMA_PS_TCP
);
id
=
rdma_create_id
(
rpcrdma_conn_upcall
,
xprt
,
RDMA_PS_TCP
,
IB_QPT_RC
);
if
(
IS_ERR
(
id
))
{
rc
=
PTR_ERR
(
id
);
dprintk
(
"RPC: %s: rdma_create_id() failed %i
\n
"
,
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment