Commit dd9bdb04 authored by Jiri Pirko's avatar Jiri Pirko Committed by David S. Miller

mlxsw: core: Add mlxsw specific workqueue and use it for FDB notif. processing

Follow-up patch is going to need to use delayed work as well and
frequently. The FDB notification processing is already using that and
also quite frequently. It makes sense to create separate workqueue just
for mlxsw driver in this case and do not pollute system_wq.
Signed-off-by: default avatarJiri Pirko <jiri@mellanox.com>
Reviewed-by: default avatarIdo Schimmel <idosch@mellanox.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 42a7f1d7
...@@ -55,6 +55,7 @@ ...@@ -55,6 +55,7 @@
#include <linux/mutex.h> #include <linux/mutex.h>
#include <linux/rcupdate.h> #include <linux/rcupdate.h>
#include <linux/slab.h> #include <linux/slab.h>
#include <linux/workqueue.h>
#include <asm/byteorder.h> #include <asm/byteorder.h>
#include <net/devlink.h> #include <net/devlink.h>
...@@ -73,6 +74,8 @@ static const char mlxsw_core_driver_name[] = "mlxsw_core"; ...@@ -73,6 +74,8 @@ static const char mlxsw_core_driver_name[] = "mlxsw_core";
static struct dentry *mlxsw_core_dbg_root; static struct dentry *mlxsw_core_dbg_root;
static struct workqueue_struct *mlxsw_wq;
struct mlxsw_core_pcpu_stats { struct mlxsw_core_pcpu_stats {
u64 trap_rx_packets[MLXSW_TRAP_ID_MAX]; u64 trap_rx_packets[MLXSW_TRAP_ID_MAX];
u64 trap_rx_bytes[MLXSW_TRAP_ID_MAX]; u64 trap_rx_bytes[MLXSW_TRAP_ID_MAX];
...@@ -1575,17 +1578,35 @@ int mlxsw_cmd_exec(struct mlxsw_core *mlxsw_core, u16 opcode, u8 opcode_mod, ...@@ -1575,17 +1578,35 @@ int mlxsw_cmd_exec(struct mlxsw_core *mlxsw_core, u16 opcode, u8 opcode_mod,
} }
EXPORT_SYMBOL(mlxsw_cmd_exec); EXPORT_SYMBOL(mlxsw_cmd_exec);
int mlxsw_core_schedule_dw(struct delayed_work *dwork, unsigned long delay)
{
return queue_delayed_work(mlxsw_wq, dwork, delay);
}
EXPORT_SYMBOL(mlxsw_core_schedule_dw);
static int __init mlxsw_core_module_init(void) static int __init mlxsw_core_module_init(void)
{ {
mlxsw_core_dbg_root = debugfs_create_dir(mlxsw_core_driver_name, NULL); int err;
if (!mlxsw_core_dbg_root)
mlxsw_wq = create_workqueue(mlxsw_core_driver_name);
if (!mlxsw_wq)
return -ENOMEM; return -ENOMEM;
mlxsw_core_dbg_root = debugfs_create_dir(mlxsw_core_driver_name, NULL);
if (!mlxsw_core_dbg_root) {
err = -ENOMEM;
goto err_debugfs_create_dir;
}
return 0; return 0;
err_debugfs_create_dir:
destroy_workqueue(mlxsw_wq);
return err;
} }
static void __exit mlxsw_core_module_exit(void) static void __exit mlxsw_core_module_exit(void)
{ {
debugfs_remove_recursive(mlxsw_core_dbg_root); debugfs_remove_recursive(mlxsw_core_dbg_root);
destroy_workqueue(mlxsw_wq);
} }
module_init(mlxsw_core_module_init); module_init(mlxsw_core_module_init);
......
...@@ -43,6 +43,7 @@ ...@@ -43,6 +43,7 @@
#include <linux/gfp.h> #include <linux/gfp.h>
#include <linux/types.h> #include <linux/types.h>
#include <linux/skbuff.h> #include <linux/skbuff.h>
#include <linux/workqueue.h>
#include <net/devlink.h> #include <net/devlink.h>
#include "trap.h" #include "trap.h"
...@@ -151,6 +152,8 @@ int mlxsw_core_port_init(struct mlxsw_core *mlxsw_core, ...@@ -151,6 +152,8 @@ int mlxsw_core_port_init(struct mlxsw_core *mlxsw_core,
struct net_device *dev, bool split, u32 split_group); struct net_device *dev, bool split, u32 split_group);
void mlxsw_core_port_fini(struct mlxsw_core_port *mlxsw_core_port); void mlxsw_core_port_fini(struct mlxsw_core_port *mlxsw_core_port);
int mlxsw_core_schedule_dw(struct delayed_work *dwork, unsigned long delay);
#define MLXSW_CONFIG_PROFILE_SWID_COUNT 8 #define MLXSW_CONFIG_PROFILE_SWID_COUNT 8
struct mlxsw_swid_config { struct mlxsw_swid_config {
......
...@@ -1430,8 +1430,8 @@ static void mlxsw_sp_fdb_notify_rec_process(struct mlxsw_sp *mlxsw_sp, ...@@ -1430,8 +1430,8 @@ static void mlxsw_sp_fdb_notify_rec_process(struct mlxsw_sp *mlxsw_sp,
static void mlxsw_sp_fdb_notify_work_schedule(struct mlxsw_sp *mlxsw_sp) static void mlxsw_sp_fdb_notify_work_schedule(struct mlxsw_sp *mlxsw_sp)
{ {
schedule_delayed_work(&mlxsw_sp->fdb_notify.dw, mlxsw_core_schedule_dw(&mlxsw_sp->fdb_notify.dw,
msecs_to_jiffies(mlxsw_sp->fdb_notify.interval)); msecs_to_jiffies(mlxsw_sp->fdb_notify.interval));
} }
static void mlxsw_sp_fdb_notify_work(struct work_struct *work) static void mlxsw_sp_fdb_notify_work(struct work_struct *work)
......
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