From patchwork Thu May 14 14:42:40 2015 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Willem de Bruijn X-Patchwork-Id: 472362 X-Patchwork-Delegate: davem@davemloft.net Return-Path: X-Original-To: patchwork-incoming@ozlabs.org Delivered-To: patchwork-incoming@ozlabs.org Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id C412C14027F for ; Fri, 15 May 2015 00:42:55 +1000 (AEST) Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=google.com header.i=@google.com header.b=Ga7YgJlp; dkim-atps=neutral Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S932472AbbENOmu (ORCPT ); Thu, 14 May 2015 10:42:50 -0400 Received: from mail-yh0-f46.google.com ([209.85.213.46]:34455 "EHLO mail-yh0-f46.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S932428AbbENOmr (ORCPT ); Thu, 14 May 2015 10:42:47 -0400 Received: by yhom41 with SMTP id m41so22923467yho.1 for ; Thu, 14 May 2015 07:42:47 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20120113; h=from:to:cc:subject:date:message-id; bh=BTOxyFwgJXRnEe0Z7Q0CICUbEsXuDV8V028vAbugrQA=; b=Ga7YgJlpM1mRea16N+17d/YZUW2hgx/3h59LSZtWjn6rOLw6bICyWReF+PZZ+Og20C 5WfC1bcykB+DLeOEkoSm2/rD1CDBkWhpEwX/qHDIeGErDJhey7DMWBnJGDTfIt/3uJyF MGzLUmo+kCy/w2ohMlUXkMtZMqo/8gOvXhE9t0tsC8rPxrnptLK8XYQkDunMM7eR2hKj bscIJGATfJrLy5Xzz5iecNjbj1aN8+8f5TLjgDyL1KoomyDlI7us4jmXh8s/76HMTRjq CJHQ2hA0pkAWINGkeDslglf8tlfmt3rx9nXTHRzWAUDlPgzbC+5T9yd/vMzdbbpIkLVL 1/sw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:from:to:cc:subject:date:message-id; bh=BTOxyFwgJXRnEe0Z7Q0CICUbEsXuDV8V028vAbugrQA=; b=IG4xQE9IdqltxE97S4hSSubhSnJ42a3MuI0+aqIb+qdSIKz/9emmMt0mP6BLPhM0sL NaKyOKkKh5XVg2O3q5O8loMWJlDmU+XZz9WnvpYZ7alwQmoDxYS9Lpv5/dz5+q8jC89U 5iLioBzunSlrV8KwMie6osQeN7GtSS7cCZumFq2edJjNUBlTrsgbt/ulkI7JJglDUZur JfphxOq3mLl1ut8YDlqZPtQnzct1eT9ZPgcMgzp+3RhURmH3nMfT9sXMmidJutUqvInp wwx7nAGhYxpk+PKQ2WPdM4eaZyiT6Sufr0nIggOqqtZqqTtOWtOgWjDx2v/HLfQsK7qe m9NQ== X-Gm-Message-State: ALoCoQlJ4rqqDn29442dnGlGcggh2W60vQWtNKO49WiANadz5KYwLFCER+LiBYrcUY0jMGZowT8F X-Received: by 10.236.70.200 with SMTP id p48mr4600776yhd.178.1431614567239; Thu, 14 May 2015 07:42:47 -0700 (PDT) Received: from gopher.nyc.corp.google.com ([172.26.106.37]) by mx.google.com with ESMTPSA id x45sm20020202yhx.52.2015.05.14.07.42.46 (version=TLSv1.2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Thu, 14 May 2015 07:42:46 -0700 (PDT) From: Willem de Bruijn X-Google-Original-From: Willem de Bruijn To: netdev@vger.kernel.org Cc: davem@davemloft.net, Willem de Bruijn Subject: [PATCH net-next] packet: fix warnings in rollover lock contention Date: Thu, 14 May 2015 10:42:40 -0400 Message-Id: <1431614560-8866-1-git-send-email-willemb@google.com> X-Mailer: git-send-email 2.2.0.rc0.207.ga3a616c Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org From: Willem de Bruijn Avoid two xchg calls whose return values were unused, causing this warning on some architectures: warning: value computed is not used [-Wunused-value] #define xchg(ptr,x) ((__typeof__(*(ptr)))\ __xchg((unsigned long)(x),(ptr),sizeof(*(ptr)))) ^ net/packet/af_packet.c:1314:3: note: in expansion of macro 'xchg' xchg(&po->pressure, !has_room); The relevant variable is a hint to avoid lock contention. It is allowed to be imprecise (race). Still, when rewriting this, also convert to use explicit atomic ops and remove a race by switching to atomic_cmpxchg. A rerun of the experiment from the original patch did not show this to cause significant cache line contention. Another non-atomic conditional clear remains in packet_poll, and is safe. Fixes: 2ccdbaa6d55b ("packet: rollover lock contention avoidance") Signed-off-by: Willem de Bruijn --- net/packet/af_packet.c | 12 ++++++------ net/packet/internal.h | 2 +- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/net/packet/af_packet.c b/net/packet/af_packet.c index 31d5856..ac1a589 100644 --- a/net/packet/af_packet.c +++ b/net/packet/af_packet.c @@ -1310,8 +1310,7 @@ static int packet_rcv_has_room(struct packet_sock *po, struct sk_buff *skb) } has_room = ret == ROOM_NORMAL; - if (po->pressure == has_room) - xchg(&po->pressure, !has_room); + if (atomic_cmpxchg(&po->pressure, has_room, !has_room)) {} return ret; } @@ -1409,7 +1408,7 @@ static unsigned int fanout_demux_rollover(struct packet_fanout *f, i = j = min_t(int, po->rollover->sock, num - 1); do { po_next = pkt_sk(f->arr[i]); - if (po_next != po && !po_next->pressure && + if (po_next != po && !atomic_read(&po_next->pressure) && packet_rcv_has_room(po_next, skb) == ROOM_NORMAL) { if (i != j) po->rollover->sock = i; @@ -3045,7 +3044,7 @@ static int packet_recvmsg(struct socket *sock, struct msghdr *msg, size_t len, if (skb == NULL) goto out; - if (pkt_sk(sk)->pressure) + if (atomic_read(&pkt_sk(sk)->pressure)) packet_rcv_has_room(pkt_sk(sk), NULL); if (pkt_sk(sk)->has_vnet_hdr) { @@ -3813,8 +3812,9 @@ static unsigned int packet_poll(struct file *file, struct socket *sock, TP_STATUS_KERNEL)) mask |= POLLIN | POLLRDNORM; } - if (po->pressure && __packet_rcv_has_room(po, NULL) == ROOM_NORMAL) - xchg(&po->pressure, 0); + if (atomic_read(&po->pressure) && + __packet_rcv_has_room(po, NULL) == ROOM_NORMAL) + atomic_set(&po->pressure, 0); spin_unlock_bh(&sk->sk_receive_queue.lock); spin_lock_bh(&sk->sk_write_queue.lock); if (po->tx_ring.pg_vec) { diff --git a/net/packet/internal.h b/net/packet/internal.h index c035d26..f96cf54 100644 --- a/net/packet/internal.h +++ b/net/packet/internal.h @@ -110,7 +110,7 @@ struct packet_sock { auxdata:1, origdev:1, has_vnet_hdr:1; - int pressure; + atomic_t pressure; int ifindex; /* bound device */ __be16 num; struct packet_rollover *rollover;