@@ -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)
3748struct 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+
13681410static 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+
17221790static 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+
17411815DECLARE_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+
19061998static 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};
0 commit comments