This is a note to let you know that I've just added the patch titled net: rps: fix cpu unplug to the 3.18-stable tree which can be found at: http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary The filename of the patch is: net-rps-fix-cpu-unplug.patch and it can be found in the queue-3.18 subdirectory. If you, or anyone else, feels it should not be added to the stable tree, please let <stable@xxxxxxxxxxxxxxx> know about it. >From foo@baz Thu Feb 12 09:25:54 HKT 2015 From: Eric Dumazet <edumazet@xxxxxxxxxx> Date: Thu, 15 Jan 2015 17:04:22 -0800 Subject: net: rps: fix cpu unplug From: Eric Dumazet <edumazet@xxxxxxxxxx> [ Upstream commit ac64da0b83d82abe62f78b3d0e21cca31aea24fa ] softnet_data.input_pkt_queue is protected by a spinlock that we must hold when transferring packets from victim queue to an active one. This is because other cpus could still be trying to enqueue packets into victim queue. A second problem is that when we transfert the NAPI poll_list from victim to current cpu, we absolutely need to special case the percpu backlog, because we do not want to add complex locking to protect process_queue : Only owner cpu is allowed to manipulate it, unless cpu is offline. Based on initial patch from Prasad Sodagudi & Subash Abhinov Kasiviswanathan. This version is better because we do not slow down packet processing, only make migration safer. Reported-by: Prasad Sodagudi <psodagud@xxxxxxxxxxxxxx> Reported-by: Subash Abhinov Kasiviswanathan <subashab@xxxxxxxxxxxxxx> Signed-off-by: Eric Dumazet <edumazet@xxxxxxxxxx> Cc: Tom Herbert <therbert@xxxxxxxxxx> Signed-off-by: David S. Miller <davem@xxxxxxxxxxxxx> Signed-off-by: Greg Kroah-Hartman <gregkh@xxxxxxxxxxxxxxxxxxx> --- net/core/dev.c | 20 +++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) --- a/net/core/dev.c +++ b/net/core/dev.c @@ -6990,10 +6990,20 @@ static int dev_cpu_callback(struct notif oldsd->output_queue = NULL; oldsd->output_queue_tailp = &oldsd->output_queue; } - /* Append NAPI poll list from offline CPU. */ - if (!list_empty(&oldsd->poll_list)) { - list_splice_init(&oldsd->poll_list, &sd->poll_list); - raise_softirq_irqoff(NET_RX_SOFTIRQ); + /* Append NAPI poll list from offline CPU, with one exception : + * process_backlog() must be called by cpu owning percpu backlog. + * We properly handle process_queue & input_pkt_queue later. + */ + while (!list_empty(&oldsd->poll_list)) { + struct napi_struct *napi = list_first_entry(&oldsd->poll_list, + struct napi_struct, + poll_list); + + list_del_init(&napi->poll_list); + if (napi->poll == process_backlog) + napi->state = 0; + else + ____napi_schedule(sd, napi); } raise_softirq_irqoff(NET_TX_SOFTIRQ); @@ -7004,7 +7014,7 @@ static int dev_cpu_callback(struct notif netif_rx_internal(skb); input_queue_head_incr(oldsd); } - while ((skb = __skb_dequeue(&oldsd->input_pkt_queue))) { + while ((skb = skb_dequeue(&oldsd->input_pkt_queue))) { netif_rx_internal(skb); input_queue_head_incr(oldsd); } Patches currently in stable-queue which might be from edumazet@xxxxxxxxxx are queue-3.18/tcp-ipv4-initialize-unicast_sock-sk_pacing_rate.patch queue-3.18/net-sched-fix-panic-in-rate-estimators.patch queue-3.18/ip-zero-sockaddr-returned-on-error-queue.patch queue-3.18/ping-fix-race-in-free-in-receive-path.patch queue-3.18/net-rps-fix-cpu-unplug.patch queue-3.18/netxen-fix-netxen_nic_poll-logic.patch queue-3.18/ipv4-tcp-get-rid-of-ugly-unicast_sock.patch queue-3.18/bnx2x-fix-napi-poll-return-value-for-repoll.patch -- To unsubscribe from this list: send the line "unsubscribe stable" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html