lkml.org 
[lkml]   [2022]   [Jul]   [27]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 5.15 176/201] Bluetooth: SCO: Replace use of memcpy_from_msg with bt_skb_sendmsg
    Date
    From: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>

    commit 0771cbb3b97d3c1d68eecd7f00055f599954c34e upstream.

    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 <luiz.von.dentz@intel.com>
    Signed-off-by: Marcel Holtmann <marcel@holtmann.org>
    Cc: Harshit Mogalapalli <harshit.m.mogalapalli@oracle.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    ---
    net/bluetooth/sco.c | 34 +++++++++++-----------------------
    1 file changed, 11 insertions(+), 23 deletions(-)

    --- a/net/bluetooth/sco.c
    +++ b/net/bluetooth/sco.c
    @@ -280,27 +280,19 @@ static int sco_connect(struct hci_dev *h
    return err;
    }

    -static int sco_send_frame(struct sock *sk, void *buf, int len,
    - unsigned int msg_flags)
    +static int sco_send_frame(struct sock *sk, struct sk_buff *skb)
    {
    struct sco_conn *conn = sco_pi(sk)->conn;
    - struct sk_buff *skb;
    - int err;

    /* Check outgoing MTU */
    - if (len > conn->mtu)
    + if (skb->len > conn->mtu)
    return -EINVAL;

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

    - skb = bt_skb_send_alloc(sk, len, msg_flags & MSG_DONTWAIT, &err);
    - if (!skb)
    - return err;
    -
    - memcpy(skb_put(skb, len), buf, len);
    hci_send_sco(conn->hcon, skb);

    - return len;
    + return skb->len;
    }

    static void sco_recv_frame(struct sco_conn *conn, struct sk_buff *skb)
    @@ -727,7 +719,7 @@ static int sco_sock_sendmsg(struct socke
    size_t len)
    {
    struct sock *sk = sock->sk;
    - void *buf;
    + struct sk_buff *skb;
    int err;

    BT_DBG("sock %p, sk %p", sock, sk);
    @@ -739,24 +731,20 @@ static int sco_sock_sendmsg(struct socke
    if (msg->msg_flags & MSG_OOB)
    return -EOPNOTSUPP;

    - buf = kmalloc(len, GFP_KERNEL);
    - if (!buf)
    - return -ENOMEM;
    -
    - if (memcpy_from_msg(buf, msg, len)) {
    - kfree(buf);
    - return -EFAULT;
    - }
    + skb = bt_skb_sendmsg(sk, msg, len, len, 0, 0);
    + if (IS_ERR_OR_NULL(skb))
    + return PTR_ERR(skb);

    lock_sock(sk);

    if (sk->sk_state == BT_CONNECTED)
    - err = sco_send_frame(sk, buf, len, msg->msg_flags);
    + err = sco_send_frame(sk, skb);
    else
    err = -ENOTCONN;

    release_sock(sk);
    - kfree(buf);
    + if (err)
    + kfree_skb(skb);
    return err;
    }


    \
     
     \ /
      Last update: 2022-07-27 19:26    [W:2.905 / U:0.020 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site