]> www.infradead.org Git - users/dwmw2/linux.git/commitdiff
net: wwan: make debugfs optional
authorSergey Ryazanov <ryazanov.s.a@gmail.com>
Tue, 7 Dec 2021 09:21:40 +0000 (12:21 +0300)
committerJakub Kicinski <kuba@kernel.org>
Thu, 9 Dec 2021 01:58:59 +0000 (17:58 -0800)
Debugfs interface is optional for the regular modem use. Some distros
and users will want to disable this feature for security or kernel
size reasons. So add a configuration option that allows to completely
disable the debugfs interface of the WWAN devices.

A primary considered use case for this option was embedded firmwares.
For example, in OpenWrt, you can not completely disable debugfs, as a
lot of wireless stuff can only be configured and monitored with the
debugfs knobs. At the same time, reducing the size of a kernel and
modules is an essential task in the world of embedded software.
Disabling the WWAN and IOSM debugfs interfaces allows us to save 50K
(x86-64 build) of space for module storage. Not much, but already
considerable when you only have 16MB of storage.

So it is hard to just disable whole debugfs. Users need some fine
grained set of options to control which debugfs interface is important
and should be available and which is not.

The new configuration symbol is enabled by default and is hidden under
the EXPERT option. So a regular user would not be bothered by another
one configuration question. While an embedded distro maintainer will be
able to a little more reduce the final image size.

Signed-off-by: Sergey Ryazanov <ryazanov.s.a@gmail.com>
Reviewed-by: Leon Romanovsky <leonro@nvidia.com>
Reviewed-by: Loic Poulain <loic.poulain@linaro.org>
Acked-by: M Chetan Kumar <m.chetan.kumar@intel.com>
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
drivers/net/wwan/Kconfig
drivers/net/wwan/iosm/Makefile
drivers/net/wwan/iosm/iosm_ipc_debugfs.h
drivers/net/wwan/iosm/iosm_ipc_imem.c
drivers/net/wwan/iosm/iosm_ipc_imem.h
drivers/net/wwan/iosm/iosm_ipc_trace.c
drivers/net/wwan/iosm/iosm_ipc_trace.h
drivers/net/wwan/wwan_core.c
include/linux/wwan.h

index 9f5111a77da9f3b1e425c082e9cfd237c872fcf7..609fd4a2c865bba3b21022993c6d213d0e24802d 100644 (file)
@@ -16,6 +16,17 @@ config WWAN
 
 if WWAN
 
+config WWAN_DEBUGFS
+       bool "WWAN devices debugfs interface" if EXPERT
+       depends on DEBUG_FS
+       default y
+       help
+         Enables debugfs infrastructure for the WWAN core and device drivers.
+
+         If this option is selected, then you can find the debug interface
+         elements for each WWAN device in a directory that is corresponding to
+         the device name: debugfs/wwan/wwanX.
+
 config WWAN_HWSIM
        tristate "Simulated WWAN device"
        help
@@ -85,7 +96,7 @@ config IOSM
        tristate "IOSM Driver for Intel M.2 WWAN Device"
        depends on INTEL_IOMMU
        select NET_DEVLINK
-       select RELAY
+       select RELAY if WWAN_DEBUGFS
        help
          This driver enables Intel M.2 WWAN Device communication.
 
index 5091f664af0d0e0fbacf76166c6fe24c32f03fe7..fa8d6afd18e12c38898683deae7dc550de2e9d31 100644 (file)
@@ -21,7 +21,9 @@ iosm-y = \
        iosm_ipc_mux_codec.o            \
        iosm_ipc_devlink.o              \
        iosm_ipc_flash.o                \
-       iosm_ipc_coredump.o             \
+       iosm_ipc_coredump.o
+
+iosm-$(CONFIG_WWAN_DEBUGFS) += \
        iosm_ipc_debugfs.o              \
        iosm_ipc_trace.o
 
index 35788039f13fd5a4b93493b94771ea3a89f0172b..8a84bfa2c14a4140d97a4ae3b373b7d5c8d4868e 100644 (file)
@@ -6,7 +6,12 @@
 #ifndef IOSM_IPC_DEBUGFS_H
 #define IOSM_IPC_DEBUGFS_H
 
+#ifdef CONFIG_WWAN_DEBUGFS
 void ipc_debugfs_init(struct iosm_imem *ipc_imem);
 void ipc_debugfs_deinit(struct iosm_imem *ipc_imem);
+#else
+static inline void ipc_debugfs_init(struct iosm_imem *ipc_imem) {}
+static inline void ipc_debugfs_deinit(struct iosm_imem *ipc_imem) {}
+#endif
 
 #endif
index 25b889922912c44b904cd51d5c8a8bab1519c282..2a6ddd7c6c885071dee36fc61c0991f3807b87bf 100644 (file)
@@ -274,7 +274,7 @@ static void ipc_imem_dl_skb_process(struct iosm_imem *ipc_imem,
                        ipc_imem_sys_devlink_notify_rx(ipc_imem->ipc_devlink,
                                                       skb);
                else if (ipc_is_trace_channel(ipc_imem, port_id))
-                       ipc_trace_port_rx(ipc_imem->trace, skb);
+                       ipc_trace_port_rx(ipc_imem, skb);
                else
                        wwan_port_rx(ipc_imem->ipc_port[port_id]->iosm_port,
                                     skb);
index 1b8c7b8959c623cfcbd9fee9083aa78c3b7251b5..86a1ffe617290b7ea54f3df0f65ee6602a0ce4e9 100644 (file)
@@ -351,7 +351,9 @@ struct iosm_imem {
        struct iosm_mux *mux;
        struct iosm_cdev *ipc_port[IPC_MEM_MAX_CHANNELS];
        struct iosm_pcie *pcie;
+#ifdef CONFIG_WWAN_DEBUGFS
        struct iosm_trace *trace;
+#endif
        struct device *dev;
        enum ipc_mem_device_ipc_state ipc_requested_state;
        struct ipc_mem_channel channels[IPC_MEM_MAX_CHANNELS];
@@ -381,7 +383,9 @@ struct iosm_imem {
           ev_mux_net_transmit_pending:1,
           reset_det_n:1,
           pcie_wake_n:1;
+#ifdef CONFIG_WWAN_DEBUGFS
        struct dentry *debugfs_dir;
+#endif
 };
 
 /**
index 5243ead90b5f01847d8f94fd514a3464212172ed..eeecfa3d10c5abcaaea901280641fb2e39ec7f99 100644 (file)
 
 /**
  * ipc_trace_port_rx - Receive trace packet from cp and write to relay buffer
- * @ipc_trace:  Pointer to the ipc trace data-struct
+ * @ipc_imem:   Pointer to iosm_imem structure
  * @skb:        Pointer to struct sk_buff
  */
-void ipc_trace_port_rx(struct iosm_trace *ipc_trace, struct sk_buff *skb)
+void ipc_trace_port_rx(struct iosm_imem *ipc_imem, struct sk_buff *skb)
 {
+       struct iosm_trace *ipc_trace = ipc_imem->trace;
+
        if (ipc_trace->ipc_rchan)
                relay_write(ipc_trace->ipc_rchan, skb->data, skb->len);
 
index 419540c91219d442c017239517260a7fcd7498d8..5ebe7790585c206aff7f1c028d513748c0eca8ae 100644 (file)
@@ -45,6 +45,8 @@ struct iosm_trace {
        enum trace_ctrl_mode mode;
 };
 
+#ifdef CONFIG_WWAN_DEBUGFS
+
 static inline bool ipc_is_trace_channel(struct iosm_imem *ipc_mem, u16 chl_id)
 {
        return ipc_mem->trace && ipc_mem->trace->chl_id == chl_id;
@@ -52,5 +54,21 @@ static inline bool ipc_is_trace_channel(struct iosm_imem *ipc_mem, u16 chl_id)
 
 struct iosm_trace *ipc_trace_init(struct iosm_imem *ipc_imem);
 void ipc_trace_deinit(struct iosm_trace *ipc_trace);
-void ipc_trace_port_rx(struct iosm_trace *ipc_trace, struct sk_buff *skb);
+void ipc_trace_port_rx(struct iosm_imem *ipc_imem, struct sk_buff *skb);
+
+#else
+
+static inline bool ipc_is_trace_channel(struct iosm_imem *ipc_mem, u16 chl_id)
+{
+       return false;
+}
+
+static inline void ipc_trace_port_rx(struct iosm_imem *ipc_imem,
+                                    struct sk_buff *skb)
+{
+       dev_kfree_skb(skb);
+}
+
+#endif
+
 #endif
index 5bf62dc35ac7ef21bfccff83f02f9b9a6e941bba..1508dc2a497b2fcb7558b0b98b77d6a3169eccc7 100644 (file)
@@ -50,7 +50,9 @@ struct wwan_device {
        atomic_t port_id;
        const struct wwan_ops *ops;
        void *ops_ctxt;
+#ifdef CONFIG_WWAN_DEBUGFS
        struct dentry *debugfs_dir;
+#endif
 };
 
 /**
@@ -146,6 +148,7 @@ static struct wwan_device *wwan_dev_get_by_name(const char *name)
        return to_wwan_dev(dev);
 }
 
+#ifdef CONFIG_WWAN_DEBUGFS
 struct dentry *wwan_get_debugfs_dir(struct device *parent)
 {
        struct wwan_device *wwandev;
@@ -157,6 +160,7 @@ struct dentry *wwan_get_debugfs_dir(struct device *parent)
        return wwandev->debugfs_dir;
 }
 EXPORT_SYMBOL_GPL(wwan_get_debugfs_dir);
+#endif
 
 /* This function allocates and registers a new WWAN device OR if a WWAN device
  * already exist for the given parent, it gets a reference and return it.
@@ -166,7 +170,6 @@ EXPORT_SYMBOL_GPL(wwan_get_debugfs_dir);
 static struct wwan_device *wwan_create_dev(struct device *parent)
 {
        struct wwan_device *wwandev;
-       const char *wwandev_name;
        int err, id;
 
        /* The 'find-alloc-register' operation must be protected against
@@ -206,9 +209,11 @@ static struct wwan_device *wwan_create_dev(struct device *parent)
                goto done_unlock;
        }
 
-       wwandev_name = kobject_name(&wwandev->dev.kobj);
-       wwandev->debugfs_dir = debugfs_create_dir(wwandev_name,
-                                                 wwan_debugfs_dir);
+#ifdef CONFIG_WWAN_DEBUGFS
+       wwandev->debugfs_dir =
+                       debugfs_create_dir(kobject_name(&wwandev->dev.kobj),
+                                          wwan_debugfs_dir);
+#endif
 
 done_unlock:
        mutex_unlock(&wwan_register_lock);
@@ -240,7 +245,9 @@ static void wwan_remove_dev(struct wwan_device *wwandev)
                ret = device_for_each_child(&wwandev->dev, NULL, is_wwan_child);
 
        if (!ret) {
+#ifdef CONFIG_WWAN_DEBUGFS
                debugfs_remove_recursive(wwandev->debugfs_dir);
+#endif
                device_unregister(&wwandev->dev);
        } else {
                put_device(&wwandev->dev);
@@ -1140,7 +1147,9 @@ static int __init wwan_init(void)
                goto destroy;
        }
 
+#ifdef CONFIG_WWAN_DEBUGFS
        wwan_debugfs_dir = debugfs_create_dir("wwan", NULL);
+#endif
 
        return 0;
 
index 1646aa3e6779fa3e29e797ea0e80afa9d0858f90..e143c88bf4b0f0b60171f5c8b17275b0c8dc061d 100644 (file)
@@ -171,6 +171,13 @@ int wwan_register_ops(struct device *parent, const struct wwan_ops *ops,
 
 void wwan_unregister_ops(struct device *parent);
 
+#ifdef CONFIG_WWAN_DEBUGFS
 struct dentry *wwan_get_debugfs_dir(struct device *parent);
+#else
+static inline struct dentry *wwan_get_debugfs_dir(struct device *parent)
+{
+       return ERR_PTR(-ENODEV);
+}
+#endif
 
 #endif /* __WWAN_H */