mirror of https://gitee.com/openkylin/linux.git
RDMA/core: Add and expose static device index
This patch adds static device index in similar fashion to already available in netdev world (struct net->ifindex). In downstream patches, the RDMA nelink will use this idx-to-ib_device conversion, so as part of this commit, we are exposing the translation function to be visible for IB/core users. Signed-off-by: Leon Romanovsky <leonro@mellanox.com>
This commit is contained in:
parent
8030c8357a
commit
ecc82c53f9
|
@ -309,4 +309,9 @@ static inline int ib_mad_enforce_security(struct ib_mad_agent_private *map,
|
|||
return 0;
|
||||
}
|
||||
#endif
|
||||
|
||||
struct ib_device *__ib_device_get_by_index(u32 ifindex);
|
||||
/* RDMA device netlink */
|
||||
void nldev_init(void);
|
||||
void nldev_exit(void);
|
||||
#endif /* _CORE_PRIV_H */
|
||||
|
|
|
@ -134,6 +134,17 @@ static int ib_device_check_mandatory(struct ib_device *device)
|
|||
return 0;
|
||||
}
|
||||
|
||||
struct ib_device *__ib_device_get_by_index(u32 index)
|
||||
{
|
||||
struct ib_device *device;
|
||||
|
||||
list_for_each_entry(device, &device_list, core_list)
|
||||
if (device->index == index)
|
||||
return device;
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static struct ib_device *__ib_device_get_by_name(const char *name)
|
||||
{
|
||||
struct ib_device *device;
|
||||
|
@ -145,7 +156,6 @@ static struct ib_device *__ib_device_get_by_name(const char *name)
|
|||
return NULL;
|
||||
}
|
||||
|
||||
|
||||
static int alloc_name(char *name)
|
||||
{
|
||||
unsigned long *inuse;
|
||||
|
@ -394,6 +404,30 @@ static int ib_security_change(struct notifier_block *nb, unsigned long event,
|
|||
return NOTIFY_OK;
|
||||
}
|
||||
|
||||
/**
|
||||
* __dev_new_index - allocate an device index
|
||||
*
|
||||
* Returns a suitable unique value for a new device interface
|
||||
* number. It assumes that there are less than 2^32-1 ib devices
|
||||
* will be present in the system.
|
||||
*/
|
||||
static u32 __dev_new_index(void)
|
||||
{
|
||||
/*
|
||||
* The device index to allow stable naming.
|
||||
* Similar to struct net -> ifindex.
|
||||
*/
|
||||
static u32 index;
|
||||
|
||||
for (;;) {
|
||||
if (!(++index))
|
||||
index = 1;
|
||||
|
||||
if (!__ib_device_get_by_index(index))
|
||||
return index;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* ib_register_device - Register an IB device with IB core
|
||||
* @device:Device to register
|
||||
|
@ -492,6 +526,7 @@ int ib_register_device(struct ib_device *device,
|
|||
if (client->add && !add_client_context(device, client))
|
||||
client->add(device);
|
||||
|
||||
device->index = __dev_new_index();
|
||||
down_write(&lists_rwsem);
|
||||
list_add_tail(&device->core_list, &device_list);
|
||||
up_write(&lists_rwsem);
|
||||
|
|
|
@ -2298,6 +2298,8 @@ struct ib_device {
|
|||
struct rdmacg_device cg_device;
|
||||
#endif
|
||||
|
||||
u32 index;
|
||||
|
||||
/**
|
||||
* The following mandatory functions are used only at device
|
||||
* registration. Keep functions such as these at the end of this
|
||||
|
|
Loading…
Reference in New Issue