summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJérémy Dufour2011-02-04 12:46:40 +0100
committerJérémy Dufour2011-02-08 15:11:05 +0100
commite5bfec0e5e8dbbd71259b4efba0446f314573d56 (patch)
tree9e57e341464b1c082a4cadef5a0fea68156181a7
parenta7f383e1716317c82bd8b7e972787c69926285ec (diff)
cleo/devkit/plcdrv: lock IRQ when doing a spin_lock, closes #2287
-rw-r--r--cleopatre/devkit/plcdrv/arm/src/linux_drv.c12
1 files changed, 7 insertions, 5 deletions
diff --git a/cleopatre/devkit/plcdrv/arm/src/linux_drv.c b/cleopatre/devkit/plcdrv/arm/src/linux_drv.c
index 3b8e658c20..ef45760059 100644
--- a/cleopatre/devkit/plcdrv/arm/src/linux_drv.c
+++ b/cleopatre/devkit/plcdrv/arm/src/linux_drv.c
@@ -820,8 +820,9 @@ static struct sk_buff* get_skb_addr(uint32_t data_addr)
struct skb_addr_list *entry;
struct sk_buff *skb = NULL;
struct net_priv *priv = plcdrv_device->priv;
+ unsigned long flags;
- spin_lock(&priv->lock);
+ spin_lock_irqsave(&priv->lock, flags);
//Check in the list to find the sk_buff corresponding to our data_addr
//No need to use the _safe version as we stop as soon we have deleted the
//element.
@@ -841,7 +842,7 @@ static struct sk_buff* get_skb_addr(uint32_t data_addr)
break;
}
}
- spin_unlock(&priv->lock);
+ spin_unlock_irqrestore(&priv->lock, flags);
return skb;
}// get_skb_addr
@@ -856,13 +857,14 @@ static uint32_t put_skb_addr(struct sk_buff *skb)
{
struct skb_addr_list *entry;
struct net_priv *priv = plcdrv_device->priv;
+ unsigned long flags;
- spin_lock(&priv->lock);
+ spin_lock_irqsave(&priv->lock, flags);
//Create a new entry for the list of sk_buffs in used
entry = (struct skb_addr_list*)kmalloc(sizeof(struct skb_addr_list), GFP_ATOMIC);
if(entry == NULL)
{
- spin_unlock(&priv->lock);
+ spin_unlock_irqrestore(&priv->lock, flags);
return -ENOMEM;
}
@@ -872,7 +874,7 @@ static uint32_t put_skb_addr(struct sk_buff *skb)
//Add the new entry in the list
list_add_tail(&entry->list, &priv->list_head_skbs);
- spin_unlock(&priv->lock);
+ spin_unlock_irqrestore(&priv->lock, flags);
return 0;
}// put_skb_addr