提交 37aebbde 编写于 作者: R Roland Dreier

IPoIB/cm: spin_lock_irqsave() -> spin_lock_irq() replacements

There are quite a few places in ipoib_cm.c where we know IRQs are
enabled because we do something that sleeps in the same function, so
we can convert several occurrences of spin_lock_irqsave() to a plain
spin_lock_irq().  This cleans up the source a little and makes the
code smaller too:

add/remove: 0/0 grow/shrink: 1/5 up/down: 3/-51 (-48)
function                                     old     new   delta
ipoib_cm_tx_reap                             403     406      +3
ipoib_cm_stale_task                          146     145      -1
ipoib_cm_dev_stop                            173     172      -1
ipoib_cm_tx_handler                          964     956      -8
ipoib_cm_rx_handler                          956     937     -19
ipoib_cm_skb_reap                            212     190     -22
Signed-off-by: NRoland Dreier <rolandd@cisco.com>
上级 de493d47
...@@ -228,7 +228,6 @@ static int ipoib_cm_req_handler(struct ib_cm_id *cm_id, struct ib_cm_event *even ...@@ -228,7 +228,6 @@ static int ipoib_cm_req_handler(struct ib_cm_id *cm_id, struct ib_cm_event *even
struct net_device *dev = cm_id->context; struct net_device *dev = cm_id->context;
struct ipoib_dev_priv *priv = netdev_priv(dev); struct ipoib_dev_priv *priv = netdev_priv(dev);
struct ipoib_cm_rx *p; struct ipoib_cm_rx *p;
unsigned long flags;
unsigned psn; unsigned psn;
int ret; int ret;
...@@ -257,9 +256,9 @@ static int ipoib_cm_req_handler(struct ib_cm_id *cm_id, struct ib_cm_event *even ...@@ -257,9 +256,9 @@ static int ipoib_cm_req_handler(struct ib_cm_id *cm_id, struct ib_cm_event *even
cm_id->context = p; cm_id->context = p;
p->jiffies = jiffies; p->jiffies = jiffies;
spin_lock_irqsave(&priv->lock, flags); spin_lock_irq(&priv->lock);
list_add(&p->list, &priv->cm.passive_ids); list_add(&p->list, &priv->cm.passive_ids);
spin_unlock_irqrestore(&priv->lock, flags); spin_unlock_irq(&priv->lock);
queue_delayed_work(ipoib_workqueue, queue_delayed_work(ipoib_workqueue,
&priv->cm.stale_task, IPOIB_CM_RX_DELAY); &priv->cm.stale_task, IPOIB_CM_RX_DELAY);
return 0; return 0;
...@@ -277,7 +276,6 @@ static int ipoib_cm_rx_handler(struct ib_cm_id *cm_id, ...@@ -277,7 +276,6 @@ static int ipoib_cm_rx_handler(struct ib_cm_id *cm_id,
{ {
struct ipoib_cm_rx *p; struct ipoib_cm_rx *p;
struct ipoib_dev_priv *priv; struct ipoib_dev_priv *priv;
unsigned long flags;
int ret; int ret;
switch (event->event) { switch (event->event) {
...@@ -290,14 +288,14 @@ static int ipoib_cm_rx_handler(struct ib_cm_id *cm_id, ...@@ -290,14 +288,14 @@ static int ipoib_cm_rx_handler(struct ib_cm_id *cm_id,
case IB_CM_REJ_RECEIVED: case IB_CM_REJ_RECEIVED:
p = cm_id->context; p = cm_id->context;
priv = netdev_priv(p->dev); priv = netdev_priv(p->dev);
spin_lock_irqsave(&priv->lock, flags); spin_lock_irq(&priv->lock);
if (list_empty(&p->list)) if (list_empty(&p->list))
ret = 0; /* Connection is going away already. */ ret = 0; /* Connection is going away already. */
else { else {
list_del_init(&p->list); list_del_init(&p->list);
ret = -ECONNRESET; ret = -ECONNRESET;
} }
spin_unlock_irqrestore(&priv->lock, flags); spin_unlock_irq(&priv->lock);
if (ret) { if (ret) {
ib_destroy_qp(p->qp); ib_destroy_qp(p->qp);
kfree(p); kfree(p);
...@@ -612,23 +610,22 @@ void ipoib_cm_dev_stop(struct net_device *dev) ...@@ -612,23 +610,22 @@ void ipoib_cm_dev_stop(struct net_device *dev)
{ {
struct ipoib_dev_priv *priv = netdev_priv(dev); struct ipoib_dev_priv *priv = netdev_priv(dev);
struct ipoib_cm_rx *p; struct ipoib_cm_rx *p;
unsigned long flags;
if (!IPOIB_CM_SUPPORTED(dev->dev_addr)) if (!IPOIB_CM_SUPPORTED(dev->dev_addr))
return; return;
ib_destroy_cm_id(priv->cm.id); ib_destroy_cm_id(priv->cm.id);
spin_lock_irqsave(&priv->lock, flags); spin_lock_irq(&priv->lock);
while (!list_empty(&priv->cm.passive_ids)) { while (!list_empty(&priv->cm.passive_ids)) {
p = list_entry(priv->cm.passive_ids.next, typeof(*p), list); p = list_entry(priv->cm.passive_ids.next, typeof(*p), list);
list_del_init(&p->list); list_del_init(&p->list);
spin_unlock_irqrestore(&priv->lock, flags); spin_unlock_irq(&priv->lock);
ib_destroy_cm_id(p->id); ib_destroy_cm_id(p->id);
ib_destroy_qp(p->qp); ib_destroy_qp(p->qp);
kfree(p); kfree(p);
spin_lock_irqsave(&priv->lock, flags); spin_lock_irq(&priv->lock);
} }
spin_unlock_irqrestore(&priv->lock, flags); spin_unlock_irq(&priv->lock);
cancel_delayed_work(&priv->cm.stale_task); cancel_delayed_work(&priv->cm.stale_task);
} }
...@@ -642,7 +639,6 @@ static int ipoib_cm_rep_handler(struct ib_cm_id *cm_id, struct ib_cm_event *even ...@@ -642,7 +639,6 @@ static int ipoib_cm_rep_handler(struct ib_cm_id *cm_id, struct ib_cm_event *even
struct ib_qp_attr qp_attr; struct ib_qp_attr qp_attr;
int qp_attr_mask, ret; int qp_attr_mask, ret;
struct sk_buff *skb; struct sk_buff *skb;
unsigned long flags;
p->mtu = be32_to_cpu(data->mtu); p->mtu = be32_to_cpu(data->mtu);
...@@ -680,12 +676,12 @@ static int ipoib_cm_rep_handler(struct ib_cm_id *cm_id, struct ib_cm_event *even ...@@ -680,12 +676,12 @@ static int ipoib_cm_rep_handler(struct ib_cm_id *cm_id, struct ib_cm_event *even
skb_queue_head_init(&skqueue); skb_queue_head_init(&skqueue);
spin_lock_irqsave(&priv->lock, flags); spin_lock_irq(&priv->lock);
set_bit(IPOIB_FLAG_OPER_UP, &p->flags); set_bit(IPOIB_FLAG_OPER_UP, &p->flags);
if (p->neigh) if (p->neigh)
while ((skb = __skb_dequeue(&p->neigh->queue))) while ((skb = __skb_dequeue(&p->neigh->queue)))
__skb_queue_tail(&skqueue, skb); __skb_queue_tail(&skqueue, skb);
spin_unlock_irqrestore(&priv->lock, flags); spin_unlock_irq(&priv->lock);
while ((skb = __skb_dequeue(&skqueue))) { while ((skb = __skb_dequeue(&skqueue))) {
skb->dev = p->dev; skb->dev = p->dev;
...@@ -895,7 +891,6 @@ static int ipoib_cm_tx_handler(struct ib_cm_id *cm_id, ...@@ -895,7 +891,6 @@ static int ipoib_cm_tx_handler(struct ib_cm_id *cm_id,
struct ipoib_dev_priv *priv = netdev_priv(tx->dev); struct ipoib_dev_priv *priv = netdev_priv(tx->dev);
struct net_device *dev = priv->dev; struct net_device *dev = priv->dev;
struct ipoib_neigh *neigh; struct ipoib_neigh *neigh;
unsigned long flags;
int ret; int ret;
switch (event->event) { switch (event->event) {
...@@ -914,7 +909,7 @@ static int ipoib_cm_tx_handler(struct ib_cm_id *cm_id, ...@@ -914,7 +909,7 @@ static int ipoib_cm_tx_handler(struct ib_cm_id *cm_id,
case IB_CM_REJ_RECEIVED: case IB_CM_REJ_RECEIVED:
case IB_CM_TIMEWAIT_EXIT: case IB_CM_TIMEWAIT_EXIT:
ipoib_dbg(priv, "CM error %d.\n", event->event); ipoib_dbg(priv, "CM error %d.\n", event->event);
spin_lock_irqsave(&priv->tx_lock, flags); spin_lock_irq(&priv->tx_lock);
spin_lock(&priv->lock); spin_lock(&priv->lock);
neigh = tx->neigh; neigh = tx->neigh;
...@@ -934,7 +929,7 @@ static int ipoib_cm_tx_handler(struct ib_cm_id *cm_id, ...@@ -934,7 +929,7 @@ static int ipoib_cm_tx_handler(struct ib_cm_id *cm_id,
} }
spin_unlock(&priv->lock); spin_unlock(&priv->lock);
spin_unlock_irqrestore(&priv->tx_lock, flags); spin_unlock_irq(&priv->tx_lock);
break; break;
default: default:
break; break;
...@@ -1023,21 +1018,20 @@ static void ipoib_cm_tx_reap(struct work_struct *work) ...@@ -1023,21 +1018,20 @@ static void ipoib_cm_tx_reap(struct work_struct *work)
struct ipoib_dev_priv *priv = container_of(work, struct ipoib_dev_priv, struct ipoib_dev_priv *priv = container_of(work, struct ipoib_dev_priv,
cm.reap_task); cm.reap_task);
struct ipoib_cm_tx *p; struct ipoib_cm_tx *p;
unsigned long flags;
spin_lock_irqsave(&priv->tx_lock, flags); spin_lock_irq(&priv->tx_lock);
spin_lock(&priv->lock); spin_lock(&priv->lock);
while (!list_empty(&priv->cm.reap_list)) { while (!list_empty(&priv->cm.reap_list)) {
p = list_entry(priv->cm.reap_list.next, typeof(*p), list); p = list_entry(priv->cm.reap_list.next, typeof(*p), list);
list_del(&p->list); list_del(&p->list);
spin_unlock(&priv->lock); spin_unlock(&priv->lock);
spin_unlock_irqrestore(&priv->tx_lock, flags); spin_unlock_irq(&priv->tx_lock);
ipoib_cm_tx_destroy(p); ipoib_cm_tx_destroy(p);
spin_lock_irqsave(&priv->tx_lock, flags); spin_lock_irq(&priv->tx_lock);
spin_lock(&priv->lock); spin_lock(&priv->lock);
} }
spin_unlock(&priv->lock); spin_unlock(&priv->lock);
spin_unlock_irqrestore(&priv->tx_lock, flags); spin_unlock_irq(&priv->tx_lock);
} }
static void ipoib_cm_skb_reap(struct work_struct *work) static void ipoib_cm_skb_reap(struct work_struct *work)
...@@ -1046,15 +1040,14 @@ static void ipoib_cm_skb_reap(struct work_struct *work) ...@@ -1046,15 +1040,14 @@ static void ipoib_cm_skb_reap(struct work_struct *work)
cm.skb_task); cm.skb_task);
struct net_device *dev = priv->dev; struct net_device *dev = priv->dev;
struct sk_buff *skb; struct sk_buff *skb;
unsigned long flags;
unsigned mtu = priv->mcast_mtu; unsigned mtu = priv->mcast_mtu;
spin_lock_irqsave(&priv->tx_lock, flags); spin_lock_irq(&priv->tx_lock);
spin_lock(&priv->lock); spin_lock(&priv->lock);
while ((skb = skb_dequeue(&priv->cm.skb_queue))) { while ((skb = skb_dequeue(&priv->cm.skb_queue))) {
spin_unlock(&priv->lock); spin_unlock(&priv->lock);
spin_unlock_irqrestore(&priv->tx_lock, flags); spin_unlock_irq(&priv->tx_lock);
if (skb->protocol == htons(ETH_P_IP)) if (skb->protocol == htons(ETH_P_IP))
icmp_send(skb, ICMP_DEST_UNREACH, ICMP_FRAG_NEEDED, htonl(mtu)); icmp_send(skb, ICMP_DEST_UNREACH, ICMP_FRAG_NEEDED, htonl(mtu));
#if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE) #if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE)
...@@ -1062,11 +1055,11 @@ static void ipoib_cm_skb_reap(struct work_struct *work) ...@@ -1062,11 +1055,11 @@ static void ipoib_cm_skb_reap(struct work_struct *work)
icmpv6_send(skb, ICMPV6_PKT_TOOBIG, 0, mtu, dev); icmpv6_send(skb, ICMPV6_PKT_TOOBIG, 0, mtu, dev);
#endif #endif
dev_kfree_skb_any(skb); dev_kfree_skb_any(skb);
spin_lock_irqsave(&priv->tx_lock, flags); spin_lock_irq(&priv->tx_lock);
spin_lock(&priv->lock); spin_lock(&priv->lock);
} }
spin_unlock(&priv->lock); spin_unlock(&priv->lock);
spin_unlock_irqrestore(&priv->tx_lock, flags); spin_unlock_irq(&priv->tx_lock);
} }
void ipoib_cm_skb_too_long(struct net_device* dev, struct sk_buff *skb, void ipoib_cm_skb_too_long(struct net_device* dev, struct sk_buff *skb,
...@@ -1088,9 +1081,8 @@ static void ipoib_cm_stale_task(struct work_struct *work) ...@@ -1088,9 +1081,8 @@ static void ipoib_cm_stale_task(struct work_struct *work)
struct ipoib_dev_priv *priv = container_of(work, struct ipoib_dev_priv, struct ipoib_dev_priv *priv = container_of(work, struct ipoib_dev_priv,
cm.stale_task.work); cm.stale_task.work);
struct ipoib_cm_rx *p; struct ipoib_cm_rx *p;
unsigned long flags;
spin_lock_irqsave(&priv->lock, flags); spin_lock_irq(&priv->lock);
while (!list_empty(&priv->cm.passive_ids)) { while (!list_empty(&priv->cm.passive_ids)) {
/* List if sorted by LRU, start from tail, /* List if sorted by LRU, start from tail,
* stop when we see a recently used entry */ * stop when we see a recently used entry */
...@@ -1098,13 +1090,13 @@ static void ipoib_cm_stale_task(struct work_struct *work) ...@@ -1098,13 +1090,13 @@ static void ipoib_cm_stale_task(struct work_struct *work)
if (time_before_eq(jiffies, p->jiffies + IPOIB_CM_RX_TIMEOUT)) if (time_before_eq(jiffies, p->jiffies + IPOIB_CM_RX_TIMEOUT))
break; break;
list_del_init(&p->list); list_del_init(&p->list);
spin_unlock_irqrestore(&priv->lock, flags); spin_unlock_irq(&priv->lock);
ib_destroy_cm_id(p->id); ib_destroy_cm_id(p->id);
ib_destroy_qp(p->qp); ib_destroy_qp(p->qp);
kfree(p); kfree(p);
spin_lock_irqsave(&priv->lock, flags); spin_lock_irq(&priv->lock);
} }
spin_unlock_irqrestore(&priv->lock, flags); spin_unlock_irq(&priv->lock);
} }
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册