login
Login
/
Register
Search
Search this site:
Forums
News
Blogs
Features
Site
Home
»
Mailing list archives
»
linux-netdev
»
2009
»
May
»
12
Re: [PATCH] net: release dst entry in dev_hard_start_xmit()
view
thread
Previous message: [
thread
] [
date
] [
author
]
Next message: [
thread
] [
date
] [
author
]
[view in full thread]
From: Eric Dumazet
Subject:
Re: [PATCH] net: release dst entry in dev_hard_start_xmit()
Date: Tuesday, May 12, 2009 - 1:21 am
Eric Dumazet a écrit :
quoted text
> One point of contention in high network loads is the dst_release() performed > when a transmited skb is freed. This is because NIC tx completion calls > dev_kree_skb() long after original call to dev_queue_xmit(skb). > > CPU cache is cold and the atomic op in dst_release() stalls. On SMP, this is > quite visible if one CPU is 100% handling softirqs for a network device, > since dst_clone() is done by other cpus, involving cache line ping pongs. > > It seems right place to release dst is in dev_hard_start_xmit(), for most > devices but ones that are virtual, and some exceptions. > > David Miller suggested to define a new device flag, set in alloc_netdev_mq() > (so that most devices set it at init time), and carefuly unset in devices > which dont want a NULL skb->dst in their ndo_start_xmit(). > > List of devices that must clear this flag is : > > - loopback device, because it calls netif_rx() and quoting Patrick : > "ip_route_input() doesn't accept loopback addresses, so loopback packets > already need to have a dst_entry attached." > - appletalk/ipddp.c : needs skb->dst in its xmit function > > - And all devices that call again dev_queue_xmit() from their xmit function > (as some classifiers need skb->dst) : bonding, macvlan, eql, ifb, hdlc_fr > > Signed-off-by: Eric Dumazet <dada1@cosmosbay.com> > --- > drivers/net/appletalk/ipddp.c | 1 + > drivers/net/bonding/bond_main.c | 1 + > drivers/net/eql.c | 1 + > drivers/net/ifb.c | 1 + > drivers/net/loopback.c | 1 + > drivers/net/macvlan.c | 1 + > drivers/net/wan/hdlc_fr.c | 1 + > include/linux/if.h | 3 +++ > net/core/dev.c | 9 +++++++++ > 9 files changed, 19 insertions(+) > > diff --git a/drivers/net/appletalk/ipddp.c b/drivers/net/appletalk/ipddp.c > index da64ba8..0268561 100644 > --- a/drivers/net/appletalk/ipddp.c > +++ b/drivers/net/appletalk/ipddp.c > @@ -71,6 +71,7 @@ static struct net_device * __init ipddp_init(void) > if (!dev) > return ERR_PTR(-ENOMEM); > > + dev->priv_flags &= IFF_XMIT_DST_RELEASE;
Oops, I forgot the ~ here, sorry
quoted text
> strcpy(dev->name, "ipddp%d"); > > if (version_printed++ == 0) > diff --git a/drivers/net/bonding/bond_main.c b/drivers/net/bonding/bond_main.c > index 815191d..a29f421 100644 > --- a/drivers/net/bonding/bond_main.c > +++ b/drivers/net/bonding/bond_main.c > @@ -5148,6 +5148,7 @@ int bond_create(char *name, struct bond_params *params) > goto out_rtnl; > } > > + bond_dev->priv_flags &= ~IFF_XMIT_DST_RELEASE; > if (!name) { > res = dev_alloc_name(bond_dev, "bond%d"); > if (res < 0) > diff --git a/drivers/net/eql.c b/drivers/net/eql.c > index 5210bb1..19b7dd9 100644 > --- a/drivers/net/eql.c > +++ b/drivers/net/eql.c > @@ -194,6 +194,7 @@ static void __init eql_setup(struct net_device *dev) > > dev->type = ARPHRD_SLIP; > dev->tx_queue_len = 5; /* Hands them off fast */ > + dev->priv_flags &= ~IFF_XMIT_DST_RELEASE; > } > > static int eql_open(struct net_device *dev) > diff --git a/drivers/net/ifb.c b/drivers/net/ifb.c > index 60a2630..96713ef 100644 > --- a/drivers/net/ifb.c > +++ b/drivers/net/ifb.c > @@ -156,6 +156,7 @@ static void ifb_setup(struct net_device *dev) > > dev->flags |= IFF_NOARP; > dev->flags &= ~IFF_MULTICAST; > + dev->priv_flags &= ~IFF_XMIT_DST_RELEASE; > random_ether_addr(dev->dev_addr); > } > > diff --git a/drivers/net/loopback.c b/drivers/net/loopback.c > index 6f71157..da472c6 100644 > --- a/drivers/net/loopback.c > +++ b/drivers/net/loopback.c > @@ -170,6 +170,7 @@ static void loopback_setup(struct net_device *dev) > dev->tx_queue_len = 0; > dev->type = ARPHRD_LOOPBACK; /* 0x0001*/ > dev->flags = IFF_LOOPBACK; > + dev->priv_flags &= ~IFF_XMIT_DST_RELEASE; > dev->features = NETIF_F_SG | NETIF_F_FRAGLIST > | NETIF_F_TSO > | NETIF_F_NO_CSUM > diff --git a/drivers/net/macvlan.c b/drivers/net/macvlan.c > index 329cd50..d5334b4 100644 > --- a/drivers/net/macvlan.c > +++ b/drivers/net/macvlan.c > @@ -414,6 +414,7 @@ static void macvlan_setup(struct net_device *dev) > { > ether_setup(dev); > > + dev->priv_flags &= ~IFF_XMIT_DST_RELEASE; > dev->netdev_ops = &macvlan_netdev_ops; > dev->destructor = free_netdev; > dev->header_ops = &macvlan_hard_header_ops, > diff --git a/drivers/net/wan/hdlc_fr.c b/drivers/net/wan/hdlc_fr.c > index 8005301..bfa0161 100644 > --- a/drivers/net/wan/hdlc_fr.c > +++ b/drivers/net/wan/hdlc_fr.c > @@ -1054,6 +1054,7 @@ static void pvc_setup(struct net_device *dev) > dev->flags = IFF_POINTOPOINT; > dev->hard_header_len = 10; > dev->addr_len = 2; > + dev->priv_flags &= ~IFF_XMIT_DST_RELEASE; > } > > static const struct net_device_ops pvc_ops = { > diff --git a/include/linux/if.h b/include/linux/if.h > index 1108f3e..b9a6229 100644 > --- a/include/linux/if.h > +++ b/include/linux/if.h > @@ -67,6 +67,9 @@ > #define IFF_ISATAP 0x80 /* ISATAP interface (RFC4214) */ > #define IFF_MASTER_ARPMON 0x100 /* bonding master, ARP mon in use */ > #define IFF_WAN_HDLC 0x200 /* WAN HDLC device */ > +#define IFF_XMIT_DST_RELEASE 0x400 /* dev_hard_start_xmit() is allowed to > + * release skb->dst > + */ > > #define IF_GET_IFACE 0x0001 /* for querying only */ > #define IF_GET_PROTO 0x0002 > diff --git a/net/core/dev.c b/net/core/dev.c > index 14dd725..b9aef53 100644 > --- a/net/core/dev.c > +++ b/net/core/dev.c > @@ -1688,6 +1688,14 @@ int dev_hard_start_xmit(struct sk_buff *skb, struct net_device *dev, > goto gso; > } > > + /* > + * If device doesnt need skb->dst, release it right now while > + * its hot in this cpu cache > + */ > + if ((dev->priv_flags & IFF_XMIT_DST_RELEASE) && skb->dst) { > + dst_release(skb->dst); > + skb->dst = NULL; > + } > rc = ops->ndo_start_xmit(skb, dev); > /* > * TODO: if skb_orphan() was called by > @@ -5028,6 +5036,7 @@ struct net_device *alloc_netdev_mq(int sizeof_priv, const char *name, > netdev_init_queues(dev); > > INIT_LIST_HEAD(&dev->napi_list); > + dev->priv_flags = IFF_XMIT_DST_RELEASE; > setup(dev); > strcpy(dev->name, name); > return dev; >
-- 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
Previous message: [
thread
] [
date
] [
author
]
Next message: [
thread
] [
date
] [
author
]
Messages in current thread:
[RFC] net: release dst entry in dev_queue_xmit()
, Eric Dumazet
, (Fri Mar 20, 4:40 am)
Re: [RFC] net: release dst entry in dev_queue_xmit()
, Neil Horman
, (Fri Mar 20, 7:10 am)
Re: [RFC] net: release dst entry in dev_queue_xmit()
, David Miller
, (Tue Mar 24, 11:43 pm)
Re: [RFC] net: release dst entry in dev_queue_xmit()
, Eric Dumazet
, (Wed Mar 25, 12:13 am)
Re: [RFC] net: release dst entry in dev_queue_xmit()
, David Miller
, (Wed Mar 25, 12:17 am)
Re: [RFC] net: release dst entry in dev_queue_xmit()
, Jarek Poplawski
, (Wed Mar 25, 11:22 am)
Re: [RFC] net: release dst entry in dev_queue_xmit()
, Eric Dumazet
, (Wed Mar 25, 11:41 am)
Re: [RFC] net: release dst entry in dev_queue_xmit()
, Jarek Poplawski
, (Wed Mar 25, 12:18 pm)
Re: [RFC] net: release dst entry in dev_queue_xmit()
, Eric Dumazet
, (Wed Mar 25, 12:40 pm)
Re: [RFC] net: release dst entry in dev_queue_xmit()
, Jarek Poplawski
, (Wed Mar 25, 12:54 pm)
Re: [RFC] net: release dst entry in dev_queue_xmit()
, Eric Dumazet
, (Wed Mar 25, 1:28 pm)
Re: [RFC] net: release dst entry in dev_queue_xmit()
, Jarek Poplawski
, (Wed Mar 25, 2:12 pm)
Re: [RFC] net: release dst entry in dev_queue_xmit()
, Patrick McHardy
, (Wed Mar 25, 2:20 pm)
[PATCH] net: release dst entry in dev_hard_start_xmit()
, Eric Dumazet
, (Tue May 12, 1:12 am)
Re: [PATCH] net: release dst entry in dev_hard_start_xmit()
, Eric Dumazet
, (Tue May 12, 1:21 am)
[PATCH, v2] net: release dst entry in dev_hard_start_xmit()
, Eric Dumazet
, (Tue May 12, 12:26 pm)
Re: [PATCH] net: release dst entry in dev_hard_start_xmit()
, Jarek Poplawski
, (Tue May 12, 12:27 pm)
Re: [PATCH] net: release dst entry in dev_hard_start_xmit()
, Eric Dumazet
, (Tue May 12, 12:44 pm)
Re: [PATCH] net: release dst entry in dev_hard_start_xmit()
, Jarek Poplawski
, (Tue May 12, 1:05 pm)
Re: [PATCH] net: release dst entry in dev_hard_start_xmit()
, Jarek Poplawski
, (Tue May 12, 1:24 pm)
Re: [PATCH] net: release dst entry in dev_hard_start_xmit()
, Eric Dumazet
, (Tue May 12, 1:52 pm)
Re: [PATCH] net: release dst entry in dev_hard_start_xmit()
, Jarek Poplawski
, (Tue May 12, 1:59 pm)
Re: [PATCH, v2] net: release dst entry in dev_hard_start_x ...
, David Miller
, (Mon May 18, 10:19 pm)
Re: [PATCH, v2] net: release dst entry in dev_hard_start_x ...
, Eric Dumazet
, (Mon May 18, 10:44 pm)
Re: [PATCH, v2] net: release dst entry in dev_hard_start_x ...
, Eric Dumazet
, (Tue May 19, 12:44 pm)
Re: [PATCH, v2] net: release dst entry in dev_hard_start_x ...
, Jarek Poplawski
, (Tue May 19, 2:09 pm)
Re: [PATCH, v2] net: release dst entry in dev_hard_start_x ...
, Eric Dumazet
, (Tue May 19, 2:21 pm)
Re: [PATCH, v2] net: release dst entry in dev_hard_start_x ...
, David Miller
, (Tue May 19, 2:24 pm)
Navigation
Mailing list archives
Recent posts
Popular discussions
linux-kernel
:
monstr
[PATCH 46/56] microblaze_v2: headers files entry.h current.h mman.h registers.h se...
Jan Engelhardt
Re: Linux Security *Module* Framework (Was: LSM conversion to static interface)
Dave Jones
Re: Why do so many machines need "noapic"?
Michael Moore
Re: underage models, pre teen models, lolita porn, young preteens, little lolitas
Lars-Peter Clausen
[PATCH v4] MMC: Add JZ4740 mmc driver
git
:
Andy Parkins
git-fetch fails with error code 128
Eli Zaretskii
Re: Switching from CVS to GIT
Jan Harkes
Re: git-svn and huge data and modifying the git-svn-HEAD branch directly
Dan Chokola
Re: how do you "force a pull"?
Johan Herland
Re: Comment on weak refs
git-commits-head
:
Linux Kernel Mailing List
No need to do lock_super() for exclusion in generic_shutdown_super()
Linux Kernel Mailing List
x86, msr: Export the register-setting MSR functions via /dev/*/msr
Linux Kernel Mailing List
MIPS: SMTC: Fix lockup in smtc_distribute_timer
Linux Kernel Mailing List
Input: gpio-keys - add support for disabling gpios through sysfs
Linux Kernel Mailing List
sh-sci: update receive error handling for muxed irqs
linux-netdev
:
Patrick McHardy
Re: no reassembly for outgoing packets on RAW socket
Ilpo Järvinen
net-next/unix: BUG: using smp_processor_id() in preemptible
Herbert Xu
Re: [PATCH] pkt_sched: Destroy gen estimators under rtnl_lock().
Evgeniy Polyakov
Re: virt-manager broken by bind(0) in net-next.
Eric Dumazet
Re: [PATCH] conntrack: use SLAB_DESTROY_BY_RCU for nf_conn structs
openbsd-misc
:
elitdostlar
Seks partneri arayan bayanlar bu adreste - 8878xs706x6438
Marcus Andree
Re: This is what Linus Torvalds calls openBSD crowd
Lars D. Noodén
Re: sshd.config and AllowUsers
Henning Brauer
Re: Sun Blade 1000?
Laurens Vets
Re: OT: opinions on IDS / IPS solutions
Colocation donated by:
Syndicate