Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 15f415fa authored by Linux Build Service Account's avatar Linux Build Service Account Committed by Gerrit - the friendly Code Review server
Browse files

Merge "net: rps: reset backlog state when IPI fails."

parents d1f5cbb4 8fc0ef30
Loading
Loading
Loading
Loading
+27 −15
Original line number Diff line number Diff line
@@ -4410,6 +4410,24 @@ __sum16 __skb_gro_checksum_complete(struct sk_buff *skb)
}
EXPORT_SYMBOL(__skb_gro_checksum_complete);

static void net_rps_send_ipi(struct softnet_data *remsd)
{
#ifdef CONFIG_RPS
	while (remsd) {
		struct softnet_data *next = remsd->rps_ipi_next;

		if (cpu_online(remsd->cpu)) {
			smp_call_function_single_async(remsd->cpu, &remsd->csd);
		} else {
			rps_lock(remsd);
			remsd->backlog.state = 0;
			rps_unlock(remsd);
		}
		remsd = next;
	}
#endif
}

/*
 * net_rps_action_and_irq_enable sends any pending IPI's for rps.
 * Note: called with local irq disabled, but exits with local irq enabled.
@@ -4425,20 +4443,7 @@ static void net_rps_action_and_irq_enable(struct softnet_data *sd)
		local_irq_enable();

		/* Send pending IPI's to kick RPS processing on remote cpus. */
		while (remsd) {
			struct softnet_data *next = remsd->rps_ipi_next;

			if (cpu_online(remsd->cpu)) {
				smp_call_function_single_async(remsd->cpu,
							   &remsd->csd);
			} else {
				pr_err("%s() cpu offline\n", __func__);
				rps_lock(remsd);
				remsd->backlog.state = 0;
				rps_unlock(remsd);
			}
			remsd = next;
		}
		net_rps_send_ipi(remsd);
	} else
#endif
		local_irq_enable();
@@ -7106,7 +7111,7 @@ static int dev_cpu_callback(struct notifier_block *nfb,
	struct sk_buff **list_skb;
	struct sk_buff *skb;
	unsigned int cpu, oldcpu = (unsigned long)ocpu;
	struct softnet_data *sd, *oldsd;
	struct softnet_data *sd, *oldsd, *remsd;

	if (action != CPU_DEAD && action != CPU_DEAD_FROZEN)
		return NOTIFY_OK;
@@ -7150,6 +7155,13 @@ static int dev_cpu_callback(struct notifier_block *nfb,
	raise_softirq_irqoff(NET_TX_SOFTIRQ);
	local_irq_enable();

#ifdef CONFIG_RPS
	remsd = oldsd->rps_ipi_list;
	oldsd->rps_ipi_list = NULL;
#endif
	/* send out pending IPI's on offline CPU */
	net_rps_send_ipi(remsd);

	/* Process offline CPU's input_pkt_queue */
	while ((skb = __skb_dequeue(&oldsd->process_queue))) {
		netif_rx_internal(skb);