[ovs-dev] [PATCH] datapath: Disable preemption updating per-CPU data in dp_dev_recv().
Ben Pfaff
blp at nicira.com
Wed Jan 13 10:44:58 PST 2010
Thanks, I pushed this to the "master" branch.
I dropped this hunk because it added a variable that was not used
(oops):
@@ -52,6 +53,7 @@ static struct net_device_stats *dp_dev_get_stats(struct net_device *netdev)
int dp_dev_recv(struct net_device *netdev, struct sk_buff *skb)
{
struct dp_dev *dp_dev = dp_dev_priv(netdev);
+ struct pcpu_lstats *lstats;
struct pcpu_lstats *lb_stats;
int len;
len = skb->len;
On Wed, Jan 13, 2010 at 10:39:20AM -0800, Justin Pettit wrote:
> Seems reasonable to me.
>
> --Justin
>
>
> On Jan 13, 2010, at 10:32 AM, Ben Pfaff wrote:
>
> > dp_dev_recv() is called from do_output(), which can be called from
> > execute_actions(), which can be called from process context with
> > preemption enabled, so it needs to disabled preemption before it can
> > access per-CPU data.
> >
> > Build tested on a few different kernels.
> >
> > Bug #2316.
> >
> > Reported-by: John Galgay <john at galgay.net>
> > CC: Dan Wendlandt <dan at nicira.com>
> > ---
> > datapath/dp_dev.c | 8 +++++++-
> > 1 files changed, 7 insertions(+), 1 deletions(-)
> >
> > diff --git a/datapath/dp_dev.c b/datapath/dp_dev.c
> > index 284a6b5..ee77971 100644
> > --- a/datapath/dp_dev.c
> > +++ b/datapath/dp_dev.c
> > @@ -1,5 +1,5 @@
> > /*
> > - * Copyright (c) 2009 Nicira Networks.
> > + * Copyright (c) 2009, 2010 Nicira Networks.
> > * Distributed under the terms of the GNU GPL version 2.
> > *
> > * Significant portions of this file may be copied from parts of the Linux
> > @@ -10,6 +10,7 @@
> > #include <linux/netdevice.h>
> > #include <linux/etherdevice.h>
> > #include <linux/ethtool.h>
> > +#include <linux/preempt.h>
> > #include <linux/rcupdate.h>
> > #include <linux/skbuff.h>
> > #include <linux/workqueue.h>
> > @@ -52,6 +53,7 @@ static struct net_device_stats *dp_dev_get_stats(struct net_device *netdev)
> > int dp_dev_recv(struct net_device *netdev, struct sk_buff *skb)
> > {
> > struct dp_dev *dp_dev = dp_dev_priv(netdev);
> > + struct pcpu_lstats *lstats;
> > struct pcpu_lstats *lb_stats;
> > int len;
> > len = skb->len;
> > @@ -62,9 +64,13 @@ int dp_dev_recv(struct net_device *netdev, struct sk_buff *skb)
> > else
> > netif_rx_ni(skb);
> > netdev->last_rx = jiffies;
> > +
> > + preempt_disable();
> > lb_stats = per_cpu_ptr(dp_dev->lstats, smp_processor_id());
> > lb_stats->rx_packets++;
> > lb_stats->rx_bytes += len;
> > + preempt_enable();
> > +
> > return len;
> > }
> >
> > --
> > 1.6.3.3
> >
> >
> > _______________________________________________
> > dev mailing list
> > dev at openvswitch.org
> > http://openvswitch.org/mailman/listinfo/dev_openvswitch.org
>
More information about the dev
mailing list