From: Mat Martineau <mathewm@codeaurora.org>
To: Gustavo Padovan <padovan@profusion.mobi>
Cc: linux-bluetooth@vger.kernel.org
Subject: Re: [PATCH 2/3] Bluetooth: Handle fragmented skbs in bt_sock_stream_recvmsg()
Date: Fri, 22 Jul 2011 12:20:14 -0700 (PDT) [thread overview]
Message-ID: <alpine.DEB.2.02.1107221215570.7933@mathewm-linux> (raw)
In-Reply-To: <20110722164355.GB2650@joana>
Hi Gustavo -
On Fri, 22 Jul 2011, Gustavo Padovan wrote:
> * Mat Martineau <mathewm@codeaurora.org> [2011-07-13 10:58:38 -0700]:
>
>> ERTM reassembly will be more efficient when skbs are linked together
>> rather than copying every incoming data byte. The existing stream recv
>> function assumes skbs are linear, so it needs to know how to handle
>> fragments before reassembly is changed.
>>
>> bt_sock_recvmsg() already handles fragmented skbs.
>>
>> Signed-off-by: Mat Martineau <mathewm@codeaurora.org>
>> ---
>> net/bluetooth/af_bluetooth.c | 30 ++++++++++++++++++++++++++++--
>> 1 files changed, 28 insertions(+), 2 deletions(-)
>>
>> diff --git a/net/bluetooth/af_bluetooth.c b/net/bluetooth/af_bluetooth.c
>> index 8add9b4..9a43520 100644
>> --- a/net/bluetooth/af_bluetooth.c
>> +++ b/net/bluetooth/af_bluetooth.c
>> @@ -349,7 +349,7 @@ int bt_sock_stream_recvmsg(struct kiocb *iocb, struct socket *sock,
>> }
>>
>> chunk = min_t(unsigned int, skb->len, size);
>> - if (memcpy_toiovec(msg->msg_iov, skb->data, chunk)) {
>> + if (skb_copy_datagram_iovec(skb, 0, msg->msg_iov, chunk)) {
>> skb_queue_head(&sk->sk_receive_queue, skb);
>> if (!copied)
>> copied = -EFAULT;
>> @@ -361,7 +361,33 @@ int bt_sock_stream_recvmsg(struct kiocb *iocb, struct socket *sock,
>> sock_recv_ts_and_drops(msg, sk, skb);
>>
>> if (!(flags & MSG_PEEK)) {
>> - skb_pull(skb, chunk);
>> + int skb_len = skb_headlen(skb);
>> +
>> + if (chunk <= skb_len) {
>> + __skb_pull(skb, chunk);
>> + } else {
>> + struct sk_buff *frag;
>> +
>> + __skb_pull(skb, skb_len);
>> + chunk -= skb_len;
>> +
>> + skb_walk_frags(skb, frag) {
>> + if (chunk <= frag->len) {
>> + /* Pulling partial data */
>> + skb->len -= chunk;
>> + skb->data_len -= chunk;
>> + __skb_pull(frag, chunk);
>> + break;
>> + } else if (frag->len) {
>> + /* Pulling all frag data */
>> + chunk -= frag->len;
>> + skb->len -= frag->len;
>> + skb->data_len -= frag->len;
>> + __skb_pull(frag, frag->len);
>> + }
>> + }
>> + }
>> +
>
> ERTM and Streaming mode can also use SOCK_SEQPACKET, I think you also need to
> handle this for SOCK_SEQPACKET.
bt_sock_recvmsg() is used with SOCK_SEQPACKET, and it already handles
fragmented skbs without any changes. See skb_copy_datagram_iovec(),
which is called by bt_sock_recvmsg() to copy the data out of the skb.
--
Mat Martineau
Employee of Qualcomm Innovation Center, Inc.
Qualcomm Innovation Center, Inc. is a member of Code Aurora Forum
next prev parent reply other threads:[~2011-07-22 19:20 UTC|newest]
Thread overview: 11+ messages / expand[flat|nested] mbox.gz Atom feed top
2011-07-13 17:58 [PATCH 0/3] Zero-copy L2CAP ERTM & streaming reassembly Mat Martineau
2011-07-13 17:58 ` [PATCH 1/3] Bluetooth: Linearize skbs for use in BNEP, CMTP, HIDP, and RFCOMM Mat Martineau
2011-07-13 17:58 ` [PATCH 2/3] Bluetooth: Handle fragmented skbs in bt_sock_stream_recvmsg() Mat Martineau
2011-07-22 16:43 ` Gustavo Padovan
2011-07-22 19:20 ` Mat Martineau [this message]
2011-07-13 17:58 ` [PATCH 3/3] Bluetooth: Perform L2CAP SDU reassembly without copying data Mat Martineau
2011-07-22 16:46 ` Gustavo Padovan
2011-07-18 20:02 ` [PATCH 0/3] Zero-copy L2CAP ERTM & streaming reassembly Mat Martineau
2011-07-18 20:33 ` Marcel Holtmann
2011-07-18 22:18 ` Mat Martineau
2011-07-18 22:43 ` Marcel Holtmann
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=alpine.DEB.2.02.1107221215570.7933@mathewm-linux \
--to=mathewm@codeaurora.org \
--cc=linux-bluetooth@vger.kernel.org \
--cc=padovan@profusion.mobi \
/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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.