ethtool: don't drop the rtnl_lock half way thru the ioctl
devlink compat code needs to drop rtnl_lock to take devlink->lock to ensure correct lock ordering. This is problematic because we're not strictly guaranteed that the netdev will not disappear after we re-lock. It may open a possibility of nested ->begin / ->complete calls. Instead of calling into devlink under rtnl_lock take a ref on the devlink instance and make the call after we've dropped rtnl_lock. We (continue to) assume that netdevs have an implicit reference on the devlink returned from ndo_get_devlink_port Note that ndo_get_devlink_port will now get called under rtnl_lock. That should be fine since none of the drivers seem to be taking serious locks inside ndo_get_devlink_port. Signed-off-by: Jakub Kicinski <kuba@kernel.org> Reviewed-by: Leon Romanovsky <leonro@nvidia.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
committed by
David S. Miller
parent
46db1b77cd
commit
1af0a0948e
@@ -1729,9 +1729,9 @@ devlink_trap_policers_unregister(struct devlink *devlink,
|
||||
struct devlink *__must_check devlink_try_get(struct devlink *devlink);
|
||||
void devlink_put(struct devlink *devlink);
|
||||
|
||||
void devlink_compat_running_version(struct net_device *dev,
|
||||
void devlink_compat_running_version(struct devlink *devlink,
|
||||
char *buf, size_t len);
|
||||
int devlink_compat_flash_update(struct net_device *dev, const char *file_name);
|
||||
int devlink_compat_flash_update(struct devlink *devlink, const char *file_name);
|
||||
int devlink_compat_phys_port_name_get(struct net_device *dev,
|
||||
char *name, size_t len);
|
||||
int devlink_compat_switch_id_get(struct net_device *dev,
|
||||
@@ -1749,12 +1749,12 @@ static inline void devlink_put(struct devlink *devlink)
|
||||
}
|
||||
|
||||
static inline void
|
||||
devlink_compat_running_version(struct net_device *dev, char *buf, size_t len)
|
||||
devlink_compat_running_version(struct devlink *devlink, char *buf, size_t len)
|
||||
{
|
||||
}
|
||||
|
||||
static inline int
|
||||
devlink_compat_flash_update(struct net_device *dev, const char *file_name)
|
||||
devlink_compat_flash_update(struct devlink *devlink, const char *file_name)
|
||||
{
|
||||
return -EOPNOTSUPP;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user