2007-09-28 15:43:43

by Jeff Dike

[permalink] [raw]
Subject: [PATCH] UML - Fix locking in skb alloction failure fix

Add _irqsave/_irqrestore to the locking in update_drop_skb to keep
uml_net_rx out while the drop skb is being messed with.

Signed-off-by: Jeff Dike <[email protected]>
---
arch/um/drivers/net_kern.c | 5 +++--
1 file changed, 3 insertions(+), 2 deletions(-)

Index: linux-2.6.22/arch/um/drivers/net_kern.c
===================================================================
--- linux-2.6.22.orig/arch/um/drivers/net_kern.c 2007-09-28 11:10:19.000000000 -0400
+++ linux-2.6.22/arch/um/drivers/net_kern.c 2007-09-28 11:13:58.000000000 -0400
@@ -49,9 +49,10 @@ static int drop_max;
static int update_drop_skb(int max)
{
struct sk_buff *new;
+ unsigned long flags;
int err = 0;

- spin_lock(&drop_lock);
+ spin_lock_irqsave(&drop_lock, flags);

if (max <= drop_max)
goto out;
@@ -68,7 +69,7 @@ static int update_drop_skb(int max)
drop_max = max;
err = 0;
out:
- spin_unlock(&drop_lock);
+ spin_unlock_irqrestore(&drop_lock, flags);

return err;
}


2007-09-28 18:27:26

by Andrew Morton

[permalink] [raw]
Subject: Re: [PATCH] UML - Fix locking in skb alloction failure fix

On Fri, 28 Sep 2007 11:43:14 -0400 Jeff Dike <[email protected]> wrote:

> Add _irqsave/_irqrestore to the locking in update_drop_skb to keep
> uml_net_rx out while the drop skb is being messed with.
>
> Signed-off-by: Jeff Dike <[email protected]>
> ---
> arch/um/drivers/net_kern.c | 5 +++--
> 1 file changed, 3 insertions(+), 2 deletions(-)
>
> Index: linux-2.6.22/arch/um/drivers/net_kern.c
> ===================================================================
> --- linux-2.6.22.orig/arch/um/drivers/net_kern.c 2007-09-28 11:10:19.000000000 -0400
> +++ linux-2.6.22/arch/um/drivers/net_kern.c 2007-09-28 11:13:58.000000000 -0400
> @@ -49,9 +49,10 @@ static int drop_max;
> static int update_drop_skb(int max)
> {
> struct sk_buff *new;
> + unsigned long flags;
> int err = 0;
>
> - spin_lock(&drop_lock);
> + spin_lock_irqsave(&drop_lock, flags);
>
> if (max <= drop_max)
> goto out;
> @@ -68,7 +69,7 @@ static int update_drop_skb(int max)
> drop_max = max;
> err = 0;
> out:
> - spin_unlock(&drop_lock);
> + spin_unlock_irqrestore(&drop_lock, flags);
>
> return err;
> }

Doesn't this assume that the arch is only ever uniprocessor, which I don't think is
true on i386 UML??

2007-09-28 19:04:18

by Jeff Dike

[permalink] [raw]
Subject: Re: [PATCH] UML - Fix locking in skb alloction failure fix

On Fri, Sep 28, 2007 at 11:26:34AM -0700, Andrew Morton wrote:
> Doesn't this assume that the arch is only ever uniprocessor, which I
> don't think is true on i386 UML??

It is for now, and when that changes, I haven't decided if and when
interrupts will be received on multiple CPUs.

Jeff

--
Work email - jdike at linux dot intel dot com