From: Ido Schimmel <ido...@mellanox.com>

Each operation from user space should be protected by the global drop
monitor mutex. Use the pre_doit / post_doit hooks to take / release the
lock instead of doing it explicitly in each function.

Signed-off-by: Ido Schimmel <ido...@mellanox.com>
---
 net/core/drop_monitor.c | 24 +++++++++++++++++-------
 1 file changed, 17 insertions(+), 7 deletions(-)

diff --git a/net/core/drop_monitor.c b/net/core/drop_monitor.c
index 1d463c0d4bc5..099000930736 100644
--- a/net/core/drop_monitor.c
+++ b/net/core/drop_monitor.c
@@ -75,6 +75,20 @@ static int dm_delay = 1;
 static unsigned long dm_hw_check_delta = 2*HZ;
 static LIST_HEAD(hw_stats_list);
 
+static int net_dm_nl_pre_doit(const struct genl_ops *ops,
+                             struct sk_buff *skb, struct genl_info *info)
+{
+       mutex_lock(&net_dm_mutex);
+
+       return 0;
+}
+
+static void net_dm_nl_post_doit(const struct genl_ops *ops,
+                               struct sk_buff *skb, struct genl_info *info)
+{
+       mutex_unlock(&net_dm_mutex);
+}
+
 static struct sk_buff *reset_per_cpu_data(struct per_cpu_dm_data *data)
 {
        size_t al;
@@ -247,12 +261,9 @@ static int set_all_monitor_traces(int state, struct 
netlink_ext_ack *extack)
        struct dm_hw_stat_delta *new_stat = NULL;
        struct dm_hw_stat_delta *temp;
 
-       mutex_lock(&net_dm_mutex);
-
        if (state == trace_state) {
                NL_SET_ERR_MSG_MOD(extack, "Trace state already set to 
requested state");
-               rc = -EAGAIN;
-               goto out_unlock;
+               return -EAGAIN;
        }
 
        switch (state) {
@@ -296,9 +307,6 @@ static int set_all_monitor_traces(int state, struct 
netlink_ext_ack *extack)
        else
                rc = -EINPROGRESS;
 
-out_unlock:
-       mutex_unlock(&net_dm_mutex);
-
        return rc;
 }
 
@@ -384,6 +392,8 @@ static struct genl_family net_drop_monitor_family 
__ro_after_init = {
        .hdrsize        = 0,
        .name           = "NET_DM",
        .version        = 2,
+       .pre_doit       = net_dm_nl_pre_doit,
+       .post_doit      = net_dm_nl_post_doit,
        .module         = THIS_MODULE,
        .ops            = dropmon_ops,
        .n_ops          = ARRAY_SIZE(dropmon_ops),
-- 
2.21.0

Reply via email to