From: Krzysztof Mazur <krzysiek@podlesie.net>
To: "Chas Williams (CONTRACTOR)" <chas@cmf.nrl.navy.mil>
Cc: davem@davemloft.net, dwmw2@infradead.org, netdev@vger.kernel.org,
linux-kernel@vger.kernel.org
Subject: Re: [PATCH v2 2/3] pppoatm: fix race condition with destroying of vcc
Date: Wed, 31 Oct 2012 11:22:10 +0100 [thread overview]
Message-ID: <20121031102210.GA15077@shrek.podlesie.net> (raw)
In-Reply-To: <20121031094147.GA1004@shrek.podlesie.net>
On Wed, Oct 31, 2012 at 10:41:47AM +0100, Krzysztof Mazur wrote:
>
> I think that we should add a wrapper to vcc->send(), based on
> fixed pppoatm_send(), that performs required checks and takes the ATM socket
> lock.
>
I'm sending initial version of such wrapper and update to pppoatm.
Untested but the code is just copied from pppoatm_send.
In final series I will fix some old &sk_atm(ATM_SKB(skb)->vcc)-like
code from original version, before moving to vcc_send_bh(), but
it's just an initial idea for some comments.
Krzysiek
diff --git a/net/atm/common.c b/net/atm/common.c
index 0c0ad93..e0602d2 100644
--- a/net/atm/common.c
+++ b/net/atm/common.c
@@ -558,6 +558,32 @@ int vcc_recvmsg(struct kiocb *iocb, struct socket *sock, struct msghdr *msg,
return copied;
}
+int vcc_send_bh(struct atm_vcc *vcc, struct sk_buff *skb)
+{
+ int ret;
+
+ bh_lock_sock(sk_atm(vcc));
+ ret = -EAGAIN;
+ if (sock_owned_by_user(sk_atm(vcc)))
+ goto out;
+ if (test_bit(ATM_VF_RELEASED, &vcc->flags)
+ || test_bit(ATM_VF_CLOSE, &vcc->flags)
+ || !test_bit(ATM_VF_READY, &vcc->flags))
+ goto out;
+
+ if (sk_wmem_alloc_get(sk_atm(vcc)) && !atm_may_send(vcc, skb->truesize))
+ goto out;
+
+ atomic_add(skb->truesize, &sk_atm(ATM_SKB(skb)->vcc)->sk_wmem_alloc);
+ ATM_SKB(skb)->atm_options = ATM_SKB(skb)->vcc->atm_options;
+ pr_debug("atm_skb(%p)->vcc(%p)->dev(%p)\n",
+ skb, ATM_SKB(skb)->vcc, ATM_SKB(skb)->vcc->dev);
+ ret = ATM_SKB(skb)->vcc->send(ATM_SKB(skb)->vcc, skb);
+out:
+ bh_unlock_sock(sk_atm(vcc));
+ return ret;
+}
+
int vcc_sendmsg(struct kiocb *iocb, struct socket *sock, struct msghdr *m,
size_t total_len)
{
diff --git a/net/atm/common.h b/net/atm/common.h
index cc3c2da..3a1c340 100644
--- a/net/atm/common.h
+++ b/net/atm/common.h
@@ -15,6 +15,7 @@ int vcc_release(struct socket *sock);
int vcc_connect(struct socket *sock, int itf, short vpi, int vci);
int vcc_recvmsg(struct kiocb *iocb, struct socket *sock, struct msghdr *msg,
size_t size, int flags);
+int vcc_send_bh(struct atm_vcc *vcc, struct sk_buff *skb);
int vcc_sendmsg(struct kiocb *iocb, struct socket *sock, struct msghdr *m,
size_t total_len);
unsigned int vcc_poll(struct file *file, struct socket *sock, poll_table *wait);
diff --git a/net/atm/pppoatm.c b/net/atm/pppoatm.c
index 5fc335a..7612f18 100644
--- a/net/atm/pppoatm.c
+++ b/net/atm/pppoatm.c
@@ -296,31 +296,10 @@ static int pppoatm_send(struct ppp_channel *chan, struct sk_buff *skb)
}
vcc = ATM_SKB(skb)->vcc;
- bh_lock_sock(sk_atm(vcc));
- if (sock_owned_by_user(sk_atm(vcc)))
- goto nospace_unlock_sock;
- if (test_bit(ATM_VF_RELEASED, &vcc->flags)
- || test_bit(ATM_VF_CLOSE, &vcc->flags)
- || !test_bit(ATM_VF_READY, &vcc->flags))
- goto nospace_unlock_sock;
-
- /*
- * It's not clear that we need to bother with using atm_may_send()
- * to check we don't exceed sk->sk_sndbuf.
- */
- if (sk_wmem_alloc_get(sk_atm(vcc)) && !atm_may_send(vcc, skb->truesize))
- goto nospace_unlock_sock;
-
- atomic_add(skb->truesize, &sk_atm(ATM_SKB(skb)->vcc)->sk_wmem_alloc);
- ATM_SKB(skb)->atm_options = ATM_SKB(skb)->vcc->atm_options;
- pr_debug("atm_skb(%p)->vcc(%p)->dev(%p)\n",
- skb, ATM_SKB(skb)->vcc, ATM_SKB(skb)->vcc->dev);
- ret = ATM_SKB(skb)->vcc->send(ATM_SKB(skb)->vcc, skb)
- ? DROP_PACKET : 1;
- bh_unlock_sock(sk_atm(vcc));
- return ret;
-nospace_unlock_sock:
- bh_unlock_sock(sk_atm(vcc));
+ ret = vcc_send_bh(vcc, skb);
+ if (ret == -EAGAIN)
+ goto nospace;
+ return ret ? DROP_PACKET : 1;
nospace:
/*
* We don't have space to send this SKB now, but we might have
next prev parent reply other threads:[~2012-10-31 10:22 UTC|newest]
Thread overview: 89+ messages / expand[flat|nested] mbox.gz Atom feed top
2012-10-22 17:14 [PATCH v2 1/3] pppoatm: don't send frames to destroyed vcc Krzysztof Mazur
2012-10-22 17:14 ` [PATCH v2 2/3] pppoatm: fix race condition with destroying of vcc Krzysztof Mazur
2012-10-30 9:37 ` David Woodhouse
2012-10-30 19:07 ` Krzysztof Mazur
2012-10-30 19:52 ` Krzysztof Mazur
2012-10-31 10:16 ` David Woodhouse
2012-10-31 11:30 ` Krzysztof Mazur
2012-10-31 11:52 ` David Woodhouse
2012-10-30 14:26 ` Chas Williams (CONTRACTOR)
2012-10-30 18:20 ` Krzysztof Mazur
2012-10-31 9:41 ` Krzysztof Mazur
2012-10-31 10:22 ` Krzysztof Mazur [this message]
2012-10-31 20:03 ` chas williams - CONTRACTOR
2012-10-31 22:04 ` Krzysztof Mazur
2012-11-01 14:26 ` chas williams - CONTRACTOR
2012-11-02 9:40 ` Krzysztof Mazur
2012-11-02 10:54 ` Krzysztof Mazur
2012-10-22 17:14 ` [PATCH v2 3/3] pppoatm: protect against freeing " Krzysztof Mazur
2012-10-30 9:39 ` David Woodhouse
2012-10-30 19:26 ` Krzysztof Mazur
2012-11-27 17:16 ` David Woodhouse
2012-11-27 17:39 ` Krzysztof Mazur
2012-11-27 18:02 ` David Woodhouse
2012-11-27 18:28 ` Krzysztof Mazur
2012-11-28 20:18 ` Krzysztof Mazur
2012-11-28 20:44 ` David Woodhouse
2012-11-28 21:24 ` Krzysztof Mazur
2012-11-28 21:20 ` chas williams - CONTRACTOR
2012-11-28 21:45 ` [PATCH] atm: introduce vcc_pop() Krzysztof Mazur
2012-11-28 21:59 ` chas williams - CONTRACTOR
2012-11-28 22:10 ` Krzysztof Mazur
2012-11-28 22:33 ` [PATCH] atm: introduce vcc_pop_skb() Krzysztof Mazur
2012-12-03 13:22 ` David Woodhouse
2012-12-03 20:11 ` Krzysztof Mazur
2012-11-27 18:39 ` [PATCH v2 3/3] pppoatm: protect against freeing of vcc Krzysztof Mazur
2012-11-27 18:54 ` chas williams - CONTRACTOR
2012-11-27 22:36 ` [PATCH] solos-pci: Wait for pending TX to complete when releasing vcc David Woodhouse
2012-11-27 23:28 ` [PATCH] br2684: don't send frames on not-ready vcc David Woodhouse
2012-11-27 23:51 ` Krzysztof Mazur
2012-11-28 0:54 ` David Woodhouse
2012-11-28 8:08 ` Krzysztof Mazur
2012-11-28 9:58 ` David Woodhouse
2012-11-28 16:41 ` David Miller
2012-11-28 17:01 ` David Woodhouse
2012-11-28 17:04 ` David Miller
2012-11-28 17:09 ` David Woodhouse
2012-11-28 17:11 ` David Miller
2012-11-30 1:18 ` Nathan Williams
2012-11-30 1:34 ` David Woodhouse
2012-11-28 9:21 ` [PATCH v2 3/3] pppoatm: protect against freeing of vcc David Laight
2012-11-28 10:04 ` Krzysztof Mazur
2012-11-28 10:24 ` David Woodhouse
2012-11-28 15:18 ` chas williams - CONTRACTOR
2012-11-28 22:18 ` David Woodhouse
2012-11-29 10:57 ` Krzysztof Mazur
2012-11-29 11:55 ` David Woodhouse
2012-11-29 12:43 ` [PATCH] solos-pci: don't call vcc->pop() after pclose() Krzysztof Mazur
2012-11-29 12:57 ` David Woodhouse
2012-11-29 13:20 ` Krzysztof Mazur
2012-11-29 14:42 ` David Woodhouse
2012-11-29 14:55 ` Krzysztof Mazur
2012-11-29 14:41 ` chas williams - CONTRACTOR
2012-11-29 14:29 ` [PATCH v2 3/3] pppoatm: protect against freeing of vcc chas williams - CONTRACTOR
2012-11-29 15:09 ` Krzysztof Mazur
2012-11-29 15:47 ` David Woodhouse
2012-11-29 15:59 ` chas williams - CONTRACTOR
2012-11-29 16:24 ` David Woodhouse
2012-11-29 17:17 ` chas williams - CONTRACTOR
2012-11-29 18:11 ` David Woodhouse
2012-11-29 18:29 ` chas williams - CONTRACTOR
2012-11-29 22:17 ` David Woodhouse
2012-11-30 1:38 ` Chas Williams (CONTRACTOR)
2012-11-30 1:57 ` David Woodhouse
2012-11-30 8:25 ` David Woodhouse
2012-11-30 9:53 ` Krzysztof Mazur
2012-11-30 12:10 ` David Woodhouse
2012-11-30 16:23 ` David Woodhouse
2012-11-30 17:00 ` Krzysztof Mazur
2012-11-30 18:33 ` David Woodhouse
2012-11-30 17:12 ` chas williams - CONTRACTOR
2012-11-30 17:39 ` Krzysztof Mazur
2012-11-29 16:28 ` Krzysztof Mazur
2012-11-29 15:37 ` chas williams - CONTRACTOR
2012-11-29 15:59 ` David Woodhouse
2012-11-29 16:11 ` chas williams - CONTRACTOR
2012-10-23 6:52 ` [PATCH v2 1/3] pppoatm: don't send frames to destroyed vcc David Miller
2012-10-23 8:12 ` David Woodhouse
2012-10-30 9:35 ` David Woodhouse
2012-10-30 20:19 ` Krzysztof Mazur
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20121031102210.GA15077@shrek.podlesie.net \
--to=krzysiek@podlesie.net \
--cc=chas@cmf.nrl.navy.mil \
--cc=davem@davemloft.net \
--cc=dwmw2@infradead.org \
--cc=linux-kernel@vger.kernel.org \
--cc=netdev@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
all inboxes | Powered by JetHome®