Commit 9b63f57d authored by Ido Schimmel's avatar Ido Schimmel Committed by David S. Miller
Browse files

drop_monitor: Move per-CPU data init/fini to separate functions



Currently drop monitor only reports software drops to user space, but
subsequent patches are going to add support for hardware drops.

Like software drops, the per-CPU data of hardware drops needs to be
initialized and de-initialized upon module initialization and exit. To
avoid code duplication, break this code into separate functions, so that
these could be re-used for hardware drops.

No functional changes intended.

Signed-off-by: default avatarIdo Schimmel <idosch@mellanox.com>
Acked-by: default avatarJiri Pirko <jiri@mellanox.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent f7750830
Loading
Loading
Loading
Loading
+36 −17
Original line number Diff line number Diff line
@@ -934,9 +934,40 @@ static struct notifier_block dropmon_net_notifier = {
	.notifier_call = dropmon_net_event
};

static int __init init_net_drop_monitor(void)
static void __net_dm_cpu_data_init(struct per_cpu_dm_data *data)
{
	spin_lock_init(&data->lock);
	skb_queue_head_init(&data->drop_queue);
	u64_stats_init(&data->stats.syncp);
}

static void __net_dm_cpu_data_fini(struct per_cpu_dm_data *data)
{
	WARN_ON(!skb_queue_empty(&data->drop_queue));
}

static void net_dm_cpu_data_init(int cpu)
{
	struct per_cpu_dm_data *data;

	data = &per_cpu(dm_cpu_data, cpu);
	__net_dm_cpu_data_init(data);
}

static void net_dm_cpu_data_fini(int cpu)
{
	struct per_cpu_dm_data *data;

	data = &per_cpu(dm_cpu_data, cpu);
	/* At this point, we should have exclusive access
	 * to this struct and can free the skb inside it.
	 */
	consume_skb(data->skb);
	__net_dm_cpu_data_fini(data);
}

static int __init init_net_drop_monitor(void)
{
	int cpu, rc;

	pr_info("Initializing network drop monitor service\n");
@@ -961,12 +992,8 @@ static int __init init_net_drop_monitor(void)

	rc = 0;

	for_each_possible_cpu(cpu) {
		data = &per_cpu(dm_cpu_data, cpu);
		spin_lock_init(&data->lock);
		skb_queue_head_init(&data->drop_queue);
		u64_stats_init(&data->stats.syncp);
	}
	for_each_possible_cpu(cpu)
		net_dm_cpu_data_init(cpu);

	goto out;

@@ -978,7 +1005,6 @@ out:

static void exit_net_drop_monitor(void)
{
	struct per_cpu_dm_data *data;
	int cpu;

	BUG_ON(unregister_netdevice_notifier(&dropmon_net_notifier));
@@ -988,15 +1014,8 @@ static void exit_net_drop_monitor(void)
	 * we are guarnateed not to have any current users when we get here
	 */

	for_each_possible_cpu(cpu) {
		data = &per_cpu(dm_cpu_data, cpu);
		/*
		 * At this point, we should have exclusive access
		 * to this struct and can free the skb inside it
		 */
		kfree_skb(data->skb);
		WARN_ON(!skb_queue_empty(&data->drop_queue));
	}
	for_each_possible_cpu(cpu)
		net_dm_cpu_data_fini(cpu);

	BUG_ON(genl_unregister_family(&net_drop_monitor_family));
}