Skip to content

Commit 0771cbb

Browse files
Vudentzholtmann
authored andcommitted
Bluetooth: SCO: Replace use of memcpy_from_msg with bt_skb_sendmsg
This makes use of bt_skb_sendmsg instead of allocating a different buffer to be used with memcpy_from_msg which cause one extra copy. Signed-off-by: Luiz Augusto von Dentz <[email protected]> Signed-off-by: Marcel Holtmann <[email protected]>
1 parent 97e4e80 commit 0771cbb

File tree

1 file changed

+11
-23
lines changed

1 file changed

+11
-23
lines changed

net/bluetooth/sco.c

Lines changed: 11 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -281,27 +281,19 @@ static int sco_connect(struct hci_dev *hdev, struct sock *sk)
281281
return err;
282282
}
283283

284-
static int sco_send_frame(struct sock *sk, void *buf, int len,
285-
unsigned int msg_flags)
284+
static int sco_send_frame(struct sock *sk, struct sk_buff *skb)
286285
{
287286
struct sco_conn *conn = sco_pi(sk)->conn;
288-
struct sk_buff *skb;
289-
int err;
290287

291288
/* Check outgoing MTU */
292-
if (len > conn->mtu)
289+
if (skb->len > conn->mtu)
293290
return -EINVAL;
294291

295-
BT_DBG("sk %p len %d", sk, len);
292+
BT_DBG("sk %p len %d", sk, skb->len);
296293

297-
skb = bt_skb_send_alloc(sk, len, msg_flags & MSG_DONTWAIT, &err);
298-
if (!skb)
299-
return err;
300-
301-
memcpy(skb_put(skb, len), buf, len);
302294
hci_send_sco(conn->hcon, skb);
303295

304-
return len;
296+
return skb->len;
305297
}
306298

307299
static void sco_recv_frame(struct sco_conn *conn, struct sk_buff *skb)
@@ -728,7 +720,7 @@ static int sco_sock_sendmsg(struct socket *sock, struct msghdr *msg,
728720
size_t len)
729721
{
730722
struct sock *sk = sock->sk;
731-
void *buf;
723+
struct sk_buff *skb;
732724
int err;
733725

734726
BT_DBG("sock %p, sk %p", sock, sk);
@@ -740,24 +732,20 @@ static int sco_sock_sendmsg(struct socket *sock, struct msghdr *msg,
740732
if (msg->msg_flags & MSG_OOB)
741733
return -EOPNOTSUPP;
742734

743-
buf = kmalloc(len, GFP_KERNEL);
744-
if (!buf)
745-
return -ENOMEM;
746-
747-
if (memcpy_from_msg(buf, msg, len)) {
748-
kfree(buf);
749-
return -EFAULT;
750-
}
735+
skb = bt_skb_sendmsg(sk, msg, len, len, 0, 0);
736+
if (IS_ERR_OR_NULL(skb))
737+
return PTR_ERR(skb);
751738

752739
lock_sock(sk);
753740

754741
if (sk->sk_state == BT_CONNECTED)
755-
err = sco_send_frame(sk, buf, len, msg->msg_flags);
742+
err = sco_send_frame(sk, skb);
756743
else
757744
err = -ENOTCONN;
758745

759746
release_sock(sk);
760-
kfree(buf);
747+
if (err)
748+
kfree_skb(skb);
761749
return err;
762750
}
763751

0 commit comments

Comments
 (0)