OSDN Git Service

drop_monitor: Use pre_doit / post_doit hooks
authorIdo Schimmel <idosch@mellanox.com>
Tue, 6 Aug 2019 13:19:56 +0000 (16:19 +0300)
committerDavid S. Miller <davem@davemloft.net>
Tue, 6 Aug 2019 19:37:56 +0000 (12:37 -0700)
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 <idosch@mellanox.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
net/core/drop_monitor.c

index 1d463c0..4deb86f 100644 (file)
@@ -247,12 +247,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 +293,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;
 }
 
@@ -380,10 +374,26 @@ static const struct genl_ops dropmon_ops[] = {
        },
 };
 
+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 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),