Commit c4ed5253 authored by David S. Miller's avatar David S. Miller
Browse files

Merge branch 'drop_monitor-Various-improvements-and-cleanups'

Ido Schimmel says:

====================
drop_monitor: Various improvements and cleanups

This patchset performs various improvements and cleanups in drop monitor
with no functional changes intended. There are no changes in these
patches relative to the RFC I sent two weeks ago [1].

A followup patchset will extend drop monitor with a packet alert mode in
which the dropped packet is notified to user space instead of just a
summary of recent drops. Subsequent patchsets will add the ability to
monitor hardware originated drops via drop monitor.

[1] https://patchwork.ozlabs.org/cover/1135226/


====================

Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parents 267df70f b19d9550
Loading
Loading
Loading
Loading
+38 −20
Original line number Diff line number Diff line
@@ -43,10 +43,16 @@
 * netlink alerts
 */
static int trace_state = TRACE_OFF;
static DEFINE_MUTEX(trace_state_mutex);

/* net_dm_mutex
 *
 * An overall lock guarding every operation coming from userspace.
 * It also guards the global 'hw_stats_list' list.
 */
static DEFINE_MUTEX(net_dm_mutex);

struct per_cpu_dm_data {
	spinlock_t		lock;
	spinlock_t		lock;	/* Protects 'skb' and 'send_timer' */
	struct sk_buff		*skb;
	struct work_struct	dm_alert_work;
	struct timer_list	send_timer;
@@ -235,22 +241,21 @@ static void trace_napi_poll_hit(void *ignore, struct napi_struct *napi,
	rcu_read_unlock();
}

static int set_all_monitor_traces(int state)
static int set_all_monitor_traces(int state, struct netlink_ext_ack *extack)
{
	int rc = 0;
	struct dm_hw_stat_delta *new_stat = NULL;
	struct dm_hw_stat_delta *temp;

	mutex_lock(&trace_state_mutex);

	if (state == trace_state) {
		rc = -EAGAIN;
		goto out_unlock;
		NL_SET_ERR_MSG_MOD(extack, "Trace state already set to requested state");
		return -EAGAIN;
	}

	switch (state) {
	case TRACE_ON:
		if (!try_module_get(THIS_MODULE)) {
			NL_SET_ERR_MSG_MOD(extack, "Failed to take reference on module");
			rc = -ENODEV;
			break;
		}
@@ -288,17 +293,15 @@ static int set_all_monitor_traces(int state)
	else
		rc = -EINPROGRESS;

out_unlock:
	mutex_unlock(&trace_state_mutex);

	return rc;
}


static int net_dm_cmd_config(struct sk_buff *skb,
			struct genl_info *info)
{
	return -ENOTSUPP;
	NL_SET_ERR_MSG_MOD(info->extack, "Command not supported");

	return -EOPNOTSUPP;
}

static int net_dm_cmd_trace(struct sk_buff *skb,
@@ -306,12 +309,12 @@ static int net_dm_cmd_trace(struct sk_buff *skb,
{
	switch (info->genlhdr->cmd) {
	case NET_DM_CMD_START:
		return set_all_monitor_traces(TRACE_ON);
		return set_all_monitor_traces(TRACE_ON, info->extack);
	case NET_DM_CMD_STOP:
		return set_all_monitor_traces(TRACE_OFF);
		return set_all_monitor_traces(TRACE_OFF, info->extack);
	}

	return -ENOTSUPP;
	return -EOPNOTSUPP;
}

static int dropmon_net_event(struct notifier_block *ev_block,
@@ -330,12 +333,12 @@ static int dropmon_net_event(struct notifier_block *ev_block,

		new_stat->dev = dev;
		new_stat->last_rx = jiffies;
		mutex_lock(&trace_state_mutex);
		mutex_lock(&net_dm_mutex);
		list_add_rcu(&new_stat->list, &hw_stats_list);
		mutex_unlock(&trace_state_mutex);
		mutex_unlock(&net_dm_mutex);
		break;
	case NETDEV_UNREGISTER:
		mutex_lock(&trace_state_mutex);
		mutex_lock(&net_dm_mutex);
		list_for_each_entry_safe(new_stat, tmp, &hw_stats_list, list) {
			if (new_stat->dev == dev) {
				new_stat->dev = NULL;
@@ -346,7 +349,7 @@ static int dropmon_net_event(struct notifier_block *ev_block,
				}
			}
		}
		mutex_unlock(&trace_state_mutex);
		mutex_unlock(&net_dm_mutex);
		break;
	}
out:
@@ -371,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),
@@ -421,7 +440,6 @@ static int __init init_net_drop_monitor(void)
		reset_per_cpu_data(data);
	}


	goto out;

out_unreg: