Re: [PATCH v3 1/4] Bluetooth: Add bt_skb_sendmsg helper

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hi Marcel,

On Fri, Sep 3, 2021 at 3:27 PM Luiz Augusto von Dentz
<luiz.dentz@xxxxxxxxx> wrote:
>
> From: Luiz Augusto von Dentz <luiz.von.dentz@xxxxxxxxx>
>
> bt_skb_sendmsg helps takes care of allocation the skb and copying the
> the contents of msg over to the skb while checking for possible errors
> so it should be safe to call it without holding lock_sock.
>
> Signed-off-by: Luiz Augusto von Dentz <luiz.von.dentz@xxxxxxxxx>
> ---
>  include/net/bluetooth/bluetooth.h | 28 ++++++++++++++++++++++++++++
>  1 file changed, 28 insertions(+)
>
> diff --git a/include/net/bluetooth/bluetooth.h b/include/net/bluetooth/bluetooth.h
> index 9125effbf448..aa6f8fe897ce 100644
> --- a/include/net/bluetooth/bluetooth.h
> +++ b/include/net/bluetooth/bluetooth.h
> @@ -420,6 +420,34 @@ static inline struct sk_buff *bt_skb_send_alloc(struct sock *sk,
>         return NULL;
>  }
>
> +/* Shall not be called with lock_sock held */
> +static inline struct sk_buff *bt_skb_sendmsg(struct sock *sk,
> +                                            struct msghdr *msg,
> +                                            size_t len, size_t mtu,
> +                                            size_t headroom, size_t tailroom)
> +{
> +       struct sk_buff *skb;
> +       size_t size = min_t(size_t, len, mtu);
> +       int err;
> +
> +       skb = bt_skb_send_alloc(sk, size + headroom + tailroom,
> +                               msg->msg_flags & MSG_DONTWAIT, &err);
> +       if (!skb)
> +               return ERR_PTR(err);
> +
> +       skb_reserve(skb, headroom);
> +       skb_tailroom_reserve(skb, mtu, tailroom);
> +
> +       if (!copy_from_iter_full(skb_put(skb, size), size, &msg->msg_iter)) {
> +               kfree_skb(skb);
> +               return ERR_PTR(-EFAULT);
> +       }
> +
> +       skb->priority = sk->sk_priority;
> +
> +       return skb;
> +}
> +
>  int bt_to_errno(u16 code);
>
>  void hci_sock_set_flag(struct sock *sk, int nr);
> --
> 2.31.1

Any comments on this set? I did incorporate the skb_tailroom_reserver as well.


-- 
Luiz Augusto von Dentz



[Index of Archives]     [Bluez Devel]     [Linux Wireless Networking]     [Linux Wireless Personal Area Networking]     [Linux ATH6KL]     [Linux USB Devel]     [Linux Media Drivers]     [Linux Audio Users]     [Linux Kernel]     [Linux SCSI]     [Big List of Linux Books]

  Powered by Linux