diff options
author | David S. Miller <davem@davemloft.net> | 2016-05-25 12:35:09 -0700 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2016-05-25 12:35:09 -0700 |
commit | 217f97e85608c5878ccc7850d6f4ea332622f537 (patch) | |
tree | 2505b959841980d5794823c8a9fb4241a5be304a | |
parent | 297f7d2cce6a156c174334ee452f2f7a7ba405ca (diff) | |
parent | b388fc7405e901c7d6f7817d05193c054e761815 (diff) | |
download | linux-217f97e85608c5878ccc7850d6f4ea332622f537.tar.bz2 |
Merge branch 'hwbm-locking-fixes'
Gregory CLEMENT says:
====================
Fix spinlock usage in HWBM
these two patches fix spinlock related issues introduced in v4.6. They
have been reported by Russell King and Jean-Jacques Hiblot.
====================
Signed-off-by: David S. Miller <davem@davemloft.net>
-rw-r--r-- | drivers/net/ethernet/marvell/mvneta_bm.c | 1 | ||||
-rw-r--r-- | net/core/hwbm.c | 3 |
2 files changed, 4 insertions, 0 deletions
diff --git a/drivers/net/ethernet/marvell/mvneta_bm.c b/drivers/net/ethernet/marvell/mvneta_bm.c index 01fccec632ec..466939f8f0cf 100644 --- a/drivers/net/ethernet/marvell/mvneta_bm.c +++ b/drivers/net/ethernet/marvell/mvneta_bm.c @@ -189,6 +189,7 @@ struct mvneta_bm_pool *mvneta_bm_pool_use(struct mvneta_bm *priv, u8 pool_id, SKB_DATA_ALIGN(sizeof(struct skb_shared_info)); hwbm_pool->construct = mvneta_bm_construct; hwbm_pool->priv = new_pool; + spin_lock_init(&hwbm_pool->lock); /* Create new pool */ err = mvneta_bm_pool_create(priv, new_pool); diff --git a/net/core/hwbm.c b/net/core/hwbm.c index 941c28486896..2cab489ae62e 100644 --- a/net/core/hwbm.c +++ b/net/core/hwbm.c @@ -55,18 +55,21 @@ int hwbm_pool_add(struct hwbm_pool *bm_pool, unsigned int buf_num, gfp_t gfp) spin_lock_irqsave(&bm_pool->lock, flags); if (bm_pool->buf_num == bm_pool->size) { pr_warn("pool already filled\n"); + spin_unlock_irqrestore(&bm_pool->lock, flags); return bm_pool->buf_num; } if (buf_num + bm_pool->buf_num > bm_pool->size) { pr_warn("cannot allocate %d buffers for pool\n", buf_num); + spin_unlock_irqrestore(&bm_pool->lock, flags); return 0; } if ((buf_num + bm_pool->buf_num) < bm_pool->buf_num) { pr_warn("Adding %d buffers to the %d current buffers will overflow\n", buf_num, bm_pool->buf_num); + spin_unlock_irqrestore(&bm_pool->lock, flags); return 0; } |