From patchwork Tue Nov 22 16:46:02 2011 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Alexey Dobriyan X-Patchwork-Id: 127128 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 67BBB1007D1 for ; Wed, 23 Nov 2011 03:46:14 +1100 (EST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1756253Ab1KVQqI (ORCPT ); Tue, 22 Nov 2011 11:46:08 -0500 Received: from mail-bw0-f46.google.com ([209.85.214.46]:60172 "EHLO mail-bw0-f46.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1753701Ab1KVQqH (ORCPT ); Tue, 22 Nov 2011 11:46:07 -0500 Received: by bke11 with SMTP id 11so416265bke.19 for ; Tue, 22 Nov 2011 08:46:06 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma; h=date:from:to:cc:subject:message-id:references:mime-version :content-type:content-disposition:in-reply-to:user-agent; bh=of1ID3kcZRSRGQ0Hzopekt6+01XsT0o2Xa8GQpecCIs=; b=Dmwa0/nndjbFae/BopuWzLpotayoz/9xfw+wadQFgWztQ/mVM7+5H8hx4B24QSxDjC 9Y9mMYfLOEOlm44Pf4/ns3PkW+xAXUBESjXhCf8v14mwiTf/1opcVF+CStODCtNfMeJQ UNiz3bW11i8oGJmZL7XVIdbo8uPtkp8PzvcRA= Received: by 10.204.145.89 with SMTP id c25mr19918768bkv.35.1321980366233; Tue, 22 Nov 2011 08:46:06 -0800 (PST) Received: from p183.telecom.by (vulture-nat-38.telecom.by. [213.184.224.38]) by mx.google.com with ESMTPS id hy13sm10588578bkc.0.2011.11.22.08.46.04 (version=TLSv1/SSLv3 cipher=OTHER); Tue, 22 Nov 2011 08:46:05 -0800 (PST) Date: Tue, 22 Nov 2011 19:46:02 +0300 From: Alexey Dobriyan To: David Laight Cc: Eric Dumazet , davem@davemloft.net, netdev@vger.kernel.org Subject: [PATCH v2] xfrm: optimize ipv4 selector matching Message-ID: <20111122164602.GC25127@p183.telecom.by> References: <1321974652.2474.27.camel@edumazet-HP-Compaq-6005-Pro-SFF-PC> MIME-Version: 1.0 Content-Disposition: inline In-Reply-To: User-Agent: Mutt/1.5.21 (2010-09-15) Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org Current addr_match() is errh, under-optimized. Compiler doesn't know that memcmp() branch doesn't trigger for IPv4. Also, pass addresses by value -- they fit into register. Signed-off-by: Alexey Dobriyan --- include/net/xfrm.h | 8 ++++++++ net/xfrm/xfrm_policy.c | 4 ++-- 2 files changed, 10 insertions(+), 2 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 --- a/include/net/xfrm.h +++ b/include/net/xfrm.h @@ -827,6 +827,14 @@ static inline bool addr_match(const void *token1, const void *token2, return true; } +static inline bool addr4_match(__be32 a1, __be32 a2, u8 prefixlen) +{ + /* C99 6.5.7 (3): u32 << 32 is undefined behaviour */ + if (prefixlen == 0) + return true; + return !((a1 ^ a2) & htonl(0xFFFFFFFFu << (32 - prefixlen))); +} + static __inline__ __be16 xfrm_flowi_sport(const struct flowi *fl, const union flowi_uli *uli) { --- a/net/xfrm/xfrm_policy.c +++ b/net/xfrm/xfrm_policy.c @@ -61,8 +61,8 @@ __xfrm4_selector_match(const struct xfrm_selector *sel, const struct flowi *fl) { const struct flowi4 *fl4 = &fl->u.ip4; - return addr_match(&fl4->daddr, &sel->daddr, sel->prefixlen_d) && - addr_match(&fl4->saddr, &sel->saddr, sel->prefixlen_s) && + return addr4_match(fl4->daddr, sel->daddr.a4, sel->prefixlen_d) && + addr4_match(fl4->saddr, sel->saddr.a4, sel->prefixlen_s) && !((xfrm_flowi_dport(fl, &fl4->uli) ^ sel->dport) & sel->dport_mask) && !((xfrm_flowi_sport(fl, &fl4->uli) ^ sel->sport) & sel->sport_mask) && (fl4->flowi4_proto == sel->proto || !sel->proto) &&