Commit e81f1e0d authored by David S. Miller's avatar David S. Miller

Merge branch 'wwan-debugfs'

M Chetan Kumar says:

====================
net: wwan: debugfs dev reference not dropped

This patch series contains WWAN subsystem & IOSM Driver changes to
drop dev reference obtained as part of wwan debugfs dir entry retrieval.

PATCH1: A new debugfs interface is introduced in wwan subsystem so
that wwan driver can drop the obtained dev reference post debugfs use.

PATCH2: IOSM Driver uses new debugfs interface to drop dev reference.

Please refer to commit messages for details.
====================
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parents 1e997d04 163f69ae
...@@ -12,10 +12,10 @@ ...@@ -12,10 +12,10 @@
void ipc_debugfs_init(struct iosm_imem *ipc_imem) void ipc_debugfs_init(struct iosm_imem *ipc_imem)
{ {
struct dentry *debugfs_pdev = wwan_get_debugfs_dir(ipc_imem->dev); ipc_imem->debugfs_wwan_dir = wwan_get_debugfs_dir(ipc_imem->dev);
ipc_imem->debugfs_dir = debugfs_create_dir(KBUILD_MODNAME, ipc_imem->debugfs_dir = debugfs_create_dir(KBUILD_MODNAME,
debugfs_pdev); ipc_imem->debugfs_wwan_dir);
ipc_imem->trace = ipc_trace_init(ipc_imem); ipc_imem->trace = ipc_trace_init(ipc_imem);
if (!ipc_imem->trace) if (!ipc_imem->trace)
...@@ -26,4 +26,5 @@ void ipc_debugfs_deinit(struct iosm_imem *ipc_imem) ...@@ -26,4 +26,5 @@ void ipc_debugfs_deinit(struct iosm_imem *ipc_imem)
{ {
ipc_trace_deinit(ipc_imem->trace); ipc_trace_deinit(ipc_imem->trace);
debugfs_remove_recursive(ipc_imem->debugfs_dir); debugfs_remove_recursive(ipc_imem->debugfs_dir);
wwan_put_debugfs_dir(ipc_imem->debugfs_wwan_dir);
} }
...@@ -341,6 +341,7 @@ enum ipc_phase { ...@@ -341,6 +341,7 @@ enum ipc_phase {
* @ev_mux_net_transmit_pending:0 means inform the IPC tasklet to pass * @ev_mux_net_transmit_pending:0 means inform the IPC tasklet to pass
* @reset_det_n: Reset detect flag * @reset_det_n: Reset detect flag
* @pcie_wake_n: Pcie wake flag * @pcie_wake_n: Pcie wake flag
* @debugfs_wwan_dir: WWAN Debug FS directory entry
* @debugfs_dir: Debug FS directory for driver-specific entries * @debugfs_dir: Debug FS directory for driver-specific entries
*/ */
struct iosm_imem { struct iosm_imem {
...@@ -384,6 +385,7 @@ struct iosm_imem { ...@@ -384,6 +385,7 @@ struct iosm_imem {
reset_det_n:1, reset_det_n:1,
pcie_wake_n:1; pcie_wake_n:1;
#ifdef CONFIG_WWAN_DEBUGFS #ifdef CONFIG_WWAN_DEBUGFS
struct dentry *debugfs_wwan_dir;
struct dentry *debugfs_dir; struct dentry *debugfs_dir;
#endif #endif
}; };
......
...@@ -160,6 +160,42 @@ struct dentry *wwan_get_debugfs_dir(struct device *parent) ...@@ -160,6 +160,42 @@ struct dentry *wwan_get_debugfs_dir(struct device *parent)
return wwandev->debugfs_dir; return wwandev->debugfs_dir;
} }
EXPORT_SYMBOL_GPL(wwan_get_debugfs_dir); EXPORT_SYMBOL_GPL(wwan_get_debugfs_dir);
static int wwan_dev_debugfs_match(struct device *dev, const void *dir)
{
struct wwan_device *wwandev;
if (dev->type != &wwan_dev_type)
return 0;
wwandev = to_wwan_dev(dev);
return wwandev->debugfs_dir == dir;
}
static struct wwan_device *wwan_dev_get_by_debugfs(struct dentry *dir)
{
struct device *dev;
dev = class_find_device(wwan_class, NULL, dir, wwan_dev_debugfs_match);
if (!dev)
return ERR_PTR(-ENODEV);
return to_wwan_dev(dev);
}
void wwan_put_debugfs_dir(struct dentry *dir)
{
struct wwan_device *wwandev = wwan_dev_get_by_debugfs(dir);
if (WARN_ON(IS_ERR(wwandev)))
return;
/* wwan_dev_get_by_debugfs() also got a reference */
put_device(&wwandev->dev);
put_device(&wwandev->dev);
}
EXPORT_SYMBOL_GPL(wwan_put_debugfs_dir);
#endif #endif
/* This function allocates and registers a new WWAN device OR if a WWAN device /* This function allocates and registers a new WWAN device OR if a WWAN device
......
...@@ -174,11 +174,13 @@ void wwan_unregister_ops(struct device *parent); ...@@ -174,11 +174,13 @@ void wwan_unregister_ops(struct device *parent);
#ifdef CONFIG_WWAN_DEBUGFS #ifdef CONFIG_WWAN_DEBUGFS
struct dentry *wwan_get_debugfs_dir(struct device *parent); struct dentry *wwan_get_debugfs_dir(struct device *parent);
void wwan_put_debugfs_dir(struct dentry *dir);
#else #else
static inline struct dentry *wwan_get_debugfs_dir(struct device *parent) static inline struct dentry *wwan_get_debugfs_dir(struct device *parent)
{ {
return ERR_PTR(-ENODEV); return ERR_PTR(-ENODEV);
} }
static inline void wwan_put_debugfs_dir(struct dentry *dir) {}
#endif #endif
#endif /* __WWAN_H */ #endif /* __WWAN_H */
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment