|
@@ -4949,6 +4949,19 @@ __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);
|
|
|
+ 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.
|
|
@@ -4964,14 +4977,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);
|
|
|
- remsd = next;
|
|
|
- }
|
|
|
+ net_rps_send_ipi(remsd);
|
|
|
} else
|
|
|
#endif
|
|
|
local_irq_enable();
|
|
@@ -8197,7 +8203,7 @@ static int dev_cpu_dead(unsigned int oldcpu)
|
|
|
struct sk_buff **list_skb;
|
|
|
struct sk_buff *skb;
|
|
|
unsigned int cpu;
|
|
|
- struct softnet_data *sd, *oldsd;
|
|
|
+ struct softnet_data *sd, *oldsd, *remsd;
|
|
|
|
|
|
local_irq_disable();
|
|
|
cpu = smp_processor_id();
|
|
@@ -8238,6 +8244,13 @@ static int dev_cpu_dead(unsigned int oldcpu)
|
|
|
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_ni(skb);
|