Skip to content

Commit 2afc5e1

Browse files
yishaihjgunthorpe
authored andcommitted
IB/mlx5: Introduce MLX5_IB_OBJECT_DEVX_ASYNC_EVENT_FD
Introduce MLX5_IB_OBJECT_DEVX_ASYNC_EVENT_FD and its initial implementation. This object is from type class FD and will be used to read DEVX async events. Signed-off-by: Yishai Hadas <yishaih@mellanox.com> Signed-off-by: Leon Romanovsky <leonro@mellanox.com> Reviewed-by: Jason Gunthorpe <jgg@mellanox.com> Signed-off-by: Jason Gunthorpe <jgg@mellanox.com>
1 parent 69ea058 commit 2afc5e1

File tree

3 files changed

+109
-0
lines changed

3 files changed

+109
-0
lines changed

drivers/infiniband/hw/mlx5/devx.c

Lines changed: 95 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,17 @@ struct devx_async_data {
3333
struct mlx5_ib_uapi_devx_async_cmd_hdr hdr;
3434
};
3535

36+
struct devx_async_event_file {
37+
struct ib_uobject uobj;
38+
/* Head of events that are subscribed to this FD */
39+
struct list_head subscribed_events_list;
40+
spinlock_t lock;
41+
wait_queue_head_t poll_wait;
42+
struct list_head event_list;
43+
struct mlx5_ib_dev *dev;
44+
u8 omit_data:1;
45+
};
46+
3647
#define MLX5_MAX_DESTROY_INBOX_SIZE_DW MLX5_ST_SZ_DW(delete_fte_in)
3748
struct devx_obj {
3849
struct mlx5_core_dev *mdev;
@@ -1365,6 +1376,37 @@ static int UVERBS_HANDLER(MLX5_IB_METHOD_DEVX_ASYNC_CMD_FD_ALLOC)(
13651376
return 0;
13661377
}
13671378

1379+
static int UVERBS_HANDLER(MLX5_IB_METHOD_DEVX_ASYNC_EVENT_FD_ALLOC)(
1380+
struct uverbs_attr_bundle *attrs)
1381+
{
1382+
struct ib_uobject *uobj = uverbs_attr_get_uobject(
1383+
attrs, MLX5_IB_ATTR_DEVX_ASYNC_EVENT_FD_ALLOC_HANDLE);
1384+
struct devx_async_event_file *ev_file;
1385+
struct mlx5_ib_ucontext *c = rdma_udata_to_drv_context(
1386+
&attrs->driver_udata, struct mlx5_ib_ucontext, ibucontext);
1387+
struct mlx5_ib_dev *dev = to_mdev(c->ibucontext.device);
1388+
u32 flags;
1389+
int err;
1390+
1391+
err = uverbs_get_flags32(&flags, attrs,
1392+
MLX5_IB_ATTR_DEVX_ASYNC_EVENT_FD_ALLOC_FLAGS,
1393+
MLX5_IB_UAPI_DEVX_CR_EV_CH_FLAGS_OMIT_DATA);
1394+
1395+
if (err)
1396+
return err;
1397+
1398+
ev_file = container_of(uobj, struct devx_async_event_file,
1399+
uobj);
1400+
spin_lock_init(&ev_file->lock);
1401+
INIT_LIST_HEAD(&ev_file->event_list);
1402+
init_waitqueue_head(&ev_file->poll_wait);
1403+
if (flags & MLX5_IB_UAPI_DEVX_CR_EV_CH_FLAGS_OMIT_DATA)
1404+
ev_file->omit_data = 1;
1405+
INIT_LIST_HEAD(&ev_file->subscribed_events_list);
1406+
ev_file->dev = dev;
1407+
return 0;
1408+
}
1409+
13681410
static void devx_query_callback(int status, struct mlx5_async_work *context)
13691411
{
13701412
struct devx_async_data *async_data =
@@ -1719,6 +1761,32 @@ static const struct file_operations devx_async_cmd_event_fops = {
17191761
.llseek = no_llseek,
17201762
};
17211763

1764+
static ssize_t devx_async_event_read(struct file *filp, char __user *buf,
1765+
size_t count, loff_t *pos)
1766+
{
1767+
return -EINVAL;
1768+
}
1769+
1770+
static __poll_t devx_async_event_poll(struct file *filp,
1771+
struct poll_table_struct *wait)
1772+
{
1773+
return 0;
1774+
}
1775+
1776+
static int devx_async_event_close(struct inode *inode, struct file *filp)
1777+
{
1778+
uverbs_close_fd(filp);
1779+
return 0;
1780+
}
1781+
1782+
static const struct file_operations devx_async_event_fops = {
1783+
.owner = THIS_MODULE,
1784+
.read = devx_async_event_read,
1785+
.poll = devx_async_event_poll,
1786+
.release = devx_async_event_close,
1787+
.llseek = no_llseek,
1788+
};
1789+
17221790
static int devx_hot_unplug_async_cmd_event_file(struct ib_uobject *uobj,
17231791
enum rdma_remove_reason why)
17241792
{
@@ -1738,6 +1806,12 @@ static int devx_hot_unplug_async_cmd_event_file(struct ib_uobject *uobj,
17381806
return 0;
17391807
};
17401808

1809+
static int devx_hot_unplug_async_event_file(struct ib_uobject *uobj,
1810+
enum rdma_remove_reason why)
1811+
{
1812+
return 0;
1813+
};
1814+
17411815
DECLARE_UVERBS_NAMED_METHOD(
17421816
MLX5_IB_METHOD_DEVX_UMEM_REG,
17431817
UVERBS_ATTR_IDR(MLX5_IB_ATTR_DEVX_UMEM_REG_HANDLE,
@@ -1903,6 +1977,24 @@ DECLARE_UVERBS_NAMED_OBJECT(
19031977
O_RDONLY),
19041978
&UVERBS_METHOD(MLX5_IB_METHOD_DEVX_ASYNC_CMD_FD_ALLOC));
19051979

1980+
DECLARE_UVERBS_NAMED_METHOD(
1981+
MLX5_IB_METHOD_DEVX_ASYNC_EVENT_FD_ALLOC,
1982+
UVERBS_ATTR_FD(MLX5_IB_ATTR_DEVX_ASYNC_EVENT_FD_ALLOC_HANDLE,
1983+
MLX5_IB_OBJECT_DEVX_ASYNC_EVENT_FD,
1984+
UVERBS_ACCESS_NEW,
1985+
UA_MANDATORY),
1986+
UVERBS_ATTR_FLAGS_IN(MLX5_IB_ATTR_DEVX_ASYNC_EVENT_FD_ALLOC_FLAGS,
1987+
enum mlx5_ib_uapi_devx_create_event_channel_flags,
1988+
UA_MANDATORY));
1989+
1990+
DECLARE_UVERBS_NAMED_OBJECT(
1991+
MLX5_IB_OBJECT_DEVX_ASYNC_EVENT_FD,
1992+
UVERBS_TYPE_ALLOC_FD(sizeof(struct devx_async_event_file),
1993+
devx_hot_unplug_async_event_file,
1994+
&devx_async_event_fops, "[devx_async_event]",
1995+
O_RDONLY),
1996+
&UVERBS_METHOD(MLX5_IB_METHOD_DEVX_ASYNC_EVENT_FD_ALLOC));
1997+
19061998
static bool devx_is_supported(struct ib_device *device)
19071999
{
19082000
struct mlx5_ib_dev *dev = to_mdev(device);
@@ -1923,5 +2015,8 @@ const struct uapi_definition mlx5_ib_devx_defs[] = {
19232015
UAPI_DEF_CHAIN_OBJ_TREE_NAMED(
19242016
MLX5_IB_OBJECT_DEVX_ASYNC_CMD_FD,
19252017
UAPI_DEF_IS_OBJ_SUPPORTED(devx_is_supported)),
2018+
UAPI_DEF_CHAIN_OBJ_TREE_NAMED(
2019+
MLX5_IB_OBJECT_DEVX_ASYNC_EVENT_FD,
2020+
UAPI_DEF_IS_OBJ_SUPPORTED(devx_is_supported)),
19262021
{},
19272022
};

include/uapi/rdma/mlx5_user_ioctl_cmds.h

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -127,16 +127,26 @@ enum mlx5_ib_devx_async_cmd_fd_alloc_attrs {
127127
MLX5_IB_ATTR_DEVX_ASYNC_CMD_FD_ALLOC_HANDLE = (1U << UVERBS_ID_NS_SHIFT),
128128
};
129129

130+
enum mlx5_ib_devx_async_event_fd_alloc_attrs {
131+
MLX5_IB_ATTR_DEVX_ASYNC_EVENT_FD_ALLOC_HANDLE = (1U << UVERBS_ID_NS_SHIFT),
132+
MLX5_IB_ATTR_DEVX_ASYNC_EVENT_FD_ALLOC_FLAGS,
133+
};
134+
130135
enum mlx5_ib_devx_async_cmd_fd_methods {
131136
MLX5_IB_METHOD_DEVX_ASYNC_CMD_FD_ALLOC = (1U << UVERBS_ID_NS_SHIFT),
132137
};
133138

139+
enum mlx5_ib_devx_async_event_fd_methods {
140+
MLX5_IB_METHOD_DEVX_ASYNC_EVENT_FD_ALLOC = (1U << UVERBS_ID_NS_SHIFT),
141+
};
142+
134143
enum mlx5_ib_objects {
135144
MLX5_IB_OBJECT_DEVX = (1U << UVERBS_ID_NS_SHIFT),
136145
MLX5_IB_OBJECT_DEVX_OBJ,
137146
MLX5_IB_OBJECT_DEVX_UMEM,
138147
MLX5_IB_OBJECT_FLOW_MATCHER,
139148
MLX5_IB_OBJECT_DEVX_ASYNC_CMD_FD,
149+
MLX5_IB_OBJECT_DEVX_ASYNC_EVENT_FD,
140150
};
141151

142152
enum mlx5_ib_flow_matcher_create_attrs {

include/uapi/rdma/mlx5_user_ioctl_verbs.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,5 +63,9 @@ enum mlx5_ib_uapi_dm_type {
6363
MLX5_IB_UAPI_DM_TYPE_HEADER_MODIFY_SW_ICM,
6464
};
6565

66+
enum mlx5_ib_uapi_devx_create_event_channel_flags {
67+
MLX5_IB_UAPI_DEVX_CR_EV_CH_FLAGS_OMIT_DATA = 1 << 0,
68+
};
69+
6670
#endif
6771

0 commit comments

Comments
 (0)