Received: with ECARTIS (v1.0.0; list netdev); Thu, 30 Dec 2004 15:29:52 -0800 (PST) Received: from fr.zoreil.com (electric-eye.fr.zoreil.com [213.41.134.224]) by oss.sgi.com (8.13.0/8.13.0) with ESMTP id iBUNTMF5003966 for ; Thu, 30 Dec 2004 15:29:43 -0800 Received: from electric-eye.fr.zoreil.com (localhost.localdomain [127.0.0.1]) by fr.zoreil.com (8.13.1/8.12.1) with ESMTP id iBUNYn5X007726; Fri, 31 Dec 2004 00:34:49 +0100 Received: (from romieu@localhost) by electric-eye.fr.zoreil.com (8.13.1/8.13.1/Submit) id iBUNYiOS007725; Fri, 31 Dec 2004 00:34:44 +0100 Date: Fri, 31 Dec 2004 00:34:43 +0100 From: Francois Romieu To: David Dillow Cc: netdev@oss.sgi.com, linux-kernel@vger.kernel.org Subject: Re: [RFC 2.6.10 5/22] xfrm: Attempt to offload bundled xfrm_states for outbound xfrms Message-ID: <20041230233443.GB5247@electric-eye.fr.zoreil.com> References: <20041230035000.13@ori.thedillows.org> <20041230035000.14@ori.thedillows.org> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20041230035000.14@ori.thedillows.org> User-Agent: Mutt/1.4.1i X-Organisation: Land of Sunshine Inc. X-Virus-Scanned: ClamAV 0.80/645/Mon Dec 27 14:56:20 2004 clamav-milter version 0.80j on 127.0.0.1 X-Virus-Status: Clean X-archive-position: 13260 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: romieu@fr.zoreil.com Precedence: bulk X-list: netdev David Dillow : [...] > diff -Nru a/net/xfrm/xfrm_policy.c b/net/xfrm/xfrm_policy.c > --- a/net/xfrm/xfrm_policy.c 2004-12-30 01:11:18 -05:00 > +++ b/net/xfrm/xfrm_policy.c 2004-12-30 01:11:18 -05:00 > @@ -705,6 +705,31 @@ > }; > } > > +static void xfrm_accel_bundle(struct dst_entry *dst) > +{ > + struct xfrm_bundle_list bundle, *xbl, *tmp; > + struct net_device *dev = dst->dev; > + INIT_LIST_HEAD(&bundle.node); > + > + if (dev && netif_running(dev) && (dev->features & NETIF_F_IPSEC)) { > + while (dst) { > + xbl = kmalloc(sizeof(*xbl), GFP_ATOMIC); > + if (!xbl) > + goto out; > + > + xbl->dst = dst; > + list_add_tail(&xbl->node, &bundle.node); > + dst = dst->child; > + } > + > + dev->xfrm_bundle_add(dev, &bundle); > + } > + > +out: > + list_for_each_entry_safe(xbl, tmp, &bundle.node, node) > + kfree(xbl); > +} If the driver knows the max depth which is allowed, why not have it allocate its own bundle-like struct during initialization one for once ? Instead of pushing the bundle list, dst is walked by the code of the device's own xyz_xfrm_bundle_add into the said circular list, entries get overwriten if the dst chain is longer and when the end of dst is reached, the bundle-like list is walked in reverse order. It avoids a few failure points imho. -- Ueimor