From patchwork Mon Sep 27 16:07:30 2010 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Eric Dumazet X-Patchwork-Id: 65879 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 D397FB70F3 for ; Tue, 28 Sep 2010 02:08:46 +1000 (EST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S932912Ab0I0QId (ORCPT ); Mon, 27 Sep 2010 12:08:33 -0400 Received: from mail-ey0-f174.google.com ([209.85.215.174]:37877 "EHLO mail-ey0-f174.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1756812Ab0I0QIc (ORCPT ); Mon, 27 Sep 2010 12:08:32 -0400 Received: by eyb6 with SMTP id 6so1419711eyb.19 for ; Mon, 27 Sep 2010 09:08:31 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma; h=domainkey-signature:received:received:subject:from:to:cc :in-reply-to:references:content-type:date:message-id:mime-version :x-mailer:content-transfer-encoding; bh=MDNAXyhYdO+YJAAvweI2+x8fUS8Zb7bq3xndza9wwts=; b=GwdApGMGAXpuXxMTgqqwC7h9tQdtMquSj4zvWb74m2uDPA+r/V5kfYu/OKZvYjG5ZL sSfYAK9TIXQGtic8rqUxvd7kHO7+VJL68+4IF7bbIoAXKG4XN7I6g8yYGPexXCsYsjRu FUQCeZIrczR/2s4f7ioXqdT62JNuusUKKW4Ng= DomainKey-Signature: a=rsa-sha1; c=nofws; d=gmail.com; s=gamma; h=subject:from:to:cc:in-reply-to:references:content-type:date :message-id:mime-version:x-mailer:content-transfer-encoding; b=HagEf+wxNqk/v/oot1/okr9lv15UgOQdC5hgDVbqNecYDu3MEy7Ph9Ge1YxEJ2petE LzNsbm9IRazhtPsX1bDlY/kYB6+iKRV4pKx/1dDZASpAswpIQVNq799m9EER2oxOv3ad ZpTUxA41KaqTmwO6mcgLm0+CI3U3MCBS/kUF0= Received: by 10.103.5.10 with SMTP id h10mr1061473mui.54.1285603705173; Mon, 27 Sep 2010 09:08:25 -0700 (PDT) Received: from [10.150.51.212] (gw0.net.jmsp.net [212.23.165.14]) by mx.google.com with ESMTPS id u8sm2504651fah.36.2010.09.27.09.07.41 (version=SSLv3 cipher=RC4-MD5); Mon, 27 Sep 2010 09:08:01 -0700 (PDT) Subject: [PATCH net-next-2.6 v2] net: sk_{detach|attach}_filter() rcu fixes From: Eric Dumazet To: David Miller Cc: netdev , "Paul E. McKenney" In-Reply-To: <1285603064.3017.42.camel@edumazet-laptop> References: <1285603064.3017.42.camel@edumazet-laptop> Date: Mon, 27 Sep 2010 18:07:30 +0200 Message-ID: <1285603650.3017.57.camel@edumazet-laptop> Mime-Version: 1.0 X-Mailer: Evolution 2.30.3 Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org Le lundi 27 septembre 2010 à 17:57 +0200, Eric Dumazet a écrit : > sk_attach_filter() is run with socket locked. > > Use the appropriate rcu_dereference_protected() instead of blocking BH, > and rcu_dereference_bh(). > There is no point adding BH prevention and memory barrier. Hmm, same thing can be done in sk_detach_filter, here is a v2. Thanks [PATCH net-next-2.6 v2] net: sk_{detach|attach}_filter() rcu fixes sk_attach_filter() and sk_detach_filter() are run with socket locked. Use the appropriate rcu_dereference_protected() instead of blocking BH, and rcu_dereference_bh(). There is no point adding BH prevention and memory barrier. Signed-off-by: Eric Dumazet --- net/core/filter.c | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) -- To unsubscribe from this list: send the line "unsubscribe netdev" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html diff --git a/net/core/filter.c b/net/core/filter.c index 52b051f..7adf503 100644 --- a/net/core/filter.c +++ b/net/core/filter.c @@ -638,10 +638,9 @@ int sk_attach_filter(struct sock_fprog *fprog, struct sock *sk) return err; } - rcu_read_lock_bh(); - old_fp = rcu_dereference_bh(sk->sk_filter); + old_fp = rcu_dereference_protected(sk->sk_filter, + sock_owned_by_user(sk)); rcu_assign_pointer(sk->sk_filter, fp); - rcu_read_unlock_bh(); if (old_fp) sk_filter_delayed_uncharge(sk, old_fp); @@ -654,14 +653,13 @@ int sk_detach_filter(struct sock *sk) int ret = -ENOENT; struct sk_filter *filter; - rcu_read_lock_bh(); - filter = rcu_dereference_bh(sk->sk_filter); + filter = rcu_dereference_protected(sk->sk_filter, + sock_owned_by_user(sk)); if (filter) { rcu_assign_pointer(sk->sk_filter, NULL); sk_filter_delayed_uncharge(sk, filter); ret = 0; } - rcu_read_unlock_bh(); return ret; } EXPORT_SYMBOL_GPL(sk_detach_filter);