[PATCH net-next 2/2] net: add skb_memcpy_to[from]_msg() to optimize skb code
From: yuan linyu <hidden>
Date: 2017-10-14 02:27:42
Subsystem:
bluetooth subsystem, can network layer, ieee 802.15.4 subsystem, llc (802.2), networking [general], networking [ipsec], nfc subsystem, packet sockets, phonet protocol, ppp over l2tp, staging subsystem, the rest · Maintainers:
Marcel Holtmann, Luiz Augusto von Dentz, Oliver Hartkopp, Marc Kleine-Budde, Alexander Aring, Stefan Schmidt, Miquel Raynal, "David S. Miller", Eric Dumazet, Jakub Kicinski, Paolo Abeni, Steffen Klassert, Herbert Xu, David Heidelberg, Willem de Bruijn, Remi Denis-Courmont, James Chapman, Greg Kroah-Hartman, Linus Torvalds
From: yuan linyu <redacted> add these two wrappers in skbuff.h which is better named than previous and only used for skb. Signed-off-by: yuan linyu <redacted> --- drivers/isdn/mISDN/socket.c | 2 +- drivers/staging/irda/net/af_irda.c | 2 +- include/linux/skbuff.h | 10 ++++++++++ net/appletalk/ddp.c | 2 +- net/ax25/af_ax25.c | 2 +- net/bluetooth/hci_sock.c | 4 ++-- net/bluetooth/rfcomm/sock.c | 2 +- net/bluetooth/sco.c | 2 +- net/caif/caif_socket.c | 6 +++--- net/can/bcm.c | 4 ++-- net/can/raw.c | 4 ++-- net/dccp/proto.c | 2 +- net/decnet/af_decnet.c | 4 ++-- net/ieee802154/socket.c | 4 ++-- net/ipx/ipx_route.c | 2 +- net/key/af_key.c | 2 +- net/l2tp/l2tp_ip.c | 2 +- net/l2tp/l2tp_ppp.c | 2 +- net/llc/af_llc.c | 2 +- net/netlink/af_netlink.c | 2 +- net/nfc/rawsock.c | 2 +- net/packet/af_packet.c | 2 +- net/phonet/datagram.c | 2 +- net/phonet/pep.c | 2 +- 24 files changed, 40 insertions(+), 30 deletions(-)
diff --git a/drivers/isdn/mISDN/socket.c b/drivers/isdn/mISDN/socket.c
index c5603d1..19ecf62 100644
--- a/drivers/isdn/mISDN/socket.c
+++ b/drivers/isdn/mISDN/socket.c@@ -202,7 +202,7 @@ mISDN_sock_sendmsg(struct socket *sock, struct msghdr *msg, size_t len) if (!skb) goto done; - if (memcpy_from_msg(skb_put(skb, len), msg, len)) { + if (skb_memcpy_from_msg(skb, msg, len)) { err = -EFAULT; goto done; }
diff --git a/drivers/staging/irda/net/af_irda.c b/drivers/staging/irda/net/af_irda.c
index 23fa7c8..159fc1a 100644
--- a/drivers/staging/irda/net/af_irda.c
+++ b/drivers/staging/irda/net/af_irda.c@@ -1469,7 +1469,7 @@ static int irda_recvmsg_stream(struct socket *sock, struct msghdr *msg, } chunk = min_t(unsigned int, skb->len, size); - if (memcpy_to_msg(msg, skb->data, chunk)) { + if (skb_memcpy_to_msg(msg, skb, chunk)) { skb_queue_head(&sk->sk_receive_queue, skb); if (copied == 0) copied = -EFAULT;
diff --git a/include/linux/skbuff.h b/include/linux/skbuff.h
index 90868d1..901fa60 100644
--- a/include/linux/skbuff.h
+++ b/include/linux/skbuff.h@@ -3294,6 +3294,16 @@ int skb_vlan_push(struct sk_buff *skb, __be16 vlan_proto, u16 vlan_tci); struct sk_buff *pskb_extract(struct sk_buff *skb, int off, int to_copy, gfp_t gfp); +static inline int skb_memcpy_from_msg(struct sk_buff *skb, struct msghdr *msg, int len) +{ + return memcpy_from_msg(skb_put(skb, len), msg, len); +} + +static inline int skb_memcpy_to_msg(struct msghdr *msg, struct sk_buff *skb, int len) +{ + return memcpy_to_msg(msg, skb->data, len); +} + struct skb_checksum_ops { __wsum (*update)(const void *mem, int len, __wsum wsum); __wsum (*combine)(__wsum csum, __wsum csum2, int offset, int len);
diff --git a/net/appletalk/ddp.c b/net/appletalk/ddp.c
index 5d035c1..c7846c3 100644
--- a/net/appletalk/ddp.c
+++ b/net/appletalk/ddp.c@@ -1658,7 +1658,7 @@ static int atalk_sendmsg(struct socket *sock, struct msghdr *msg, size_t len) SOCK_DEBUG(sk, "SK %p: Copy user data (%zd bytes).\n", sk, len); - err = memcpy_from_msg(skb_put(skb, len), msg, len); + err = skb_memcpy_from_msg(skb, msg, len); if (err) { kfree_skb(skb); err = -EFAULT;
diff --git a/net/ax25/af_ax25.c b/net/ax25/af_ax25.c
index f3f9d18..442763e 100644
--- a/net/ax25/af_ax25.c
+++ b/net/ax25/af_ax25.c@@ -1552,7 +1552,7 @@ static int ax25_sendmsg(struct socket *sock, struct msghdr *msg, size_t len) skb_reserve(skb, size - len); /* User data follows immediately after the AX.25 data */ - if (memcpy_from_msg(skb_put(skb, len), msg, len)) { + if (skb_memcpy_from_msg(skb, msg, len)) { err = -EFAULT; kfree_skb(skb); goto out;
diff --git a/net/bluetooth/hci_sock.c b/net/bluetooth/hci_sock.c
index 65d734c..349c79a 100644
--- a/net/bluetooth/hci_sock.c
+++ b/net/bluetooth/hci_sock.c@@ -1601,7 +1601,7 @@ static int hci_logging_frame(struct sock *sk, struct msghdr *msg, int len) if (!skb) return err; - if (memcpy_from_msg(skb_put(skb, len), msg, len)) { + if (skb_memcpy_from_msg(skb, msg, len)) { err = -EFAULT; goto drop; }
@@ -1726,7 +1726,7 @@ static int hci_sock_sendmsg(struct socket *sock, struct msghdr *msg, if (!skb) goto done; - if (memcpy_from_msg(skb_put(skb, len), msg, len)) { + if (skb_memcpy_from_msg(skb, msg, len)) { err = -EFAULT; goto drop; }
diff --git a/net/bluetooth/rfcomm/sock.c b/net/bluetooth/rfcomm/sock.c
index 1aaccf6..41d19dc 100644
--- a/net/bluetooth/rfcomm/sock.c
+++ b/net/bluetooth/rfcomm/sock.c@@ -594,7 +594,7 @@ static int rfcomm_sock_sendmsg(struct socket *sock, struct msghdr *msg, } skb_reserve(skb, RFCOMM_SKB_HEAD_RESERVE); - err = memcpy_from_msg(skb_put(skb, size), msg, size); + err = skb_memcpy_from_msg(skb, msg, size); if (err) { kfree_skb(skb); if (sent == 0)
diff --git a/net/bluetooth/sco.c b/net/bluetooth/sco.c
index 795e920..01958d2 100644
--- a/net/bluetooth/sco.c
+++ b/net/bluetooth/sco.c@@ -288,7 +288,7 @@ static int sco_send_frame(struct sock *sk, struct msghdr *msg, int len) if (!skb) return err; - if (memcpy_from_msg(skb_put(skb, len), msg, len)) { + if (skb_memcpy_from_msg(skb, msg, len)) { kfree_skb(skb); return -EFAULT; }
diff --git a/net/caif/caif_socket.c b/net/caif/caif_socket.c
index 632d5a4..6b49e5a 100644
--- a/net/caif/caif_socket.c
+++ b/net/caif/caif_socket.c@@ -422,7 +422,7 @@ static int caif_stream_recvmsg(struct socket *sock, struct msghdr *msg, } release_sock(sk); chunk = min_t(unsigned int, skb->len, size); - if (memcpy_to_msg(msg, skb->data, chunk)) { + if (skb_memcpy_to_msg(msg, skb, chunk)) { skb_queue_head(&sk->sk_receive_queue, skb); if (copied == 0) copied = -EFAULT;
@@ -570,7 +570,7 @@ static int caif_seqpkt_sendmsg(struct socket *sock, struct msghdr *msg, skb_reserve(skb, cf_sk->headroom); - ret = memcpy_from_msg(skb_put(skb, len), msg, len); + ret = skb_memcpy_from_msg(skb, msg, len); if (ret) goto err;
@@ -645,7 +645,7 @@ static int caif_stream_sendmsg(struct socket *sock, struct msghdr *msg, */ size = min_t(int, size, skb_tailroom(skb)); - err = memcpy_from_msg(skb_put(skb, size), msg, size); + err = skb_memcpy_from_msg(skb, msg, size); if (err) { kfree_skb(skb); goto out_err;
diff --git a/net/can/bcm.c b/net/can/bcm.c
index 47a8748d..6fb4670 100644
--- a/net/can/bcm.c
+++ b/net/can/bcm.c@@ -1269,7 +1269,7 @@ static int bcm_tx_send(struct msghdr *msg, int ifindex, struct sock *sk, can_skb_reserve(skb); - err = memcpy_from_msg(skb_put(skb, cfsiz), msg, cfsiz); + err = skb_memcpy_from_msg(skb, msg, cfsiz); if (err < 0) { kfree_skb(skb); return err;
@@ -1642,7 +1642,7 @@ static int bcm_recvmsg(struct socket *sock, struct msghdr *msg, size_t size, if (skb->len < size) size = skb->len; - err = memcpy_to_msg(msg, skb->data, size); + err = skb_memcpy_to_msg(msg, skb, size); if (err < 0) { skb_free_datagram(sk, skb); return err;
diff --git a/net/can/raw.c b/net/can/raw.c
index 864c80d..b52d1db 100644
--- a/net/can/raw.c
+++ b/net/can/raw.c@@ -766,7 +766,7 @@ static int raw_sendmsg(struct socket *sock, struct msghdr *msg, size_t size) can_skb_prv(skb)->ifindex = dev->ifindex; can_skb_prv(skb)->skbcnt = 0; - err = memcpy_from_msg(skb_put(skb, size), msg, size); + err = skb_memcpy_from_msg(skb, msg, size); if (err < 0) goto free_skb;
@@ -813,7 +813,7 @@ static int raw_recvmsg(struct socket *sock, struct msghdr *msg, size_t size, else size = skb->len; - err = memcpy_to_msg(msg, skb->data, size); + err = skb_memcpy_to_msg(msg, skb, size); if (err < 0) { skb_free_datagram(sk, skb); return err;
diff --git a/net/dccp/proto.c b/net/dccp/proto.c
index b68168f..affe21a 100644
--- a/net/dccp/proto.c
+++ b/net/dccp/proto.c@@ -785,7 +785,7 @@ int dccp_sendmsg(struct sock *sk, struct msghdr *msg, size_t len) goto out_release; skb_reserve(skb, sk->sk_prot->max_header); - rc = memcpy_from_msg(skb_put(skb, len), msg, len); + rc = skb_memcpy_from_msg(skb, msg, len); if (rc != 0) goto out_discard;
diff --git a/net/decnet/af_decnet.c b/net/decnet/af_decnet.c
index 73a0399..6fa54fd 100644
--- a/net/decnet/af_decnet.c
+++ b/net/decnet/af_decnet.c@@ -1765,7 +1765,7 @@ static int dn_recvmsg(struct socket *sock, struct msghdr *msg, size_t size, if ((chunk + copied) > size) chunk = size - copied; - if (memcpy_to_msg(msg, skb->data, chunk)) { + if (skb_memcpy_to_msg(msg, skb, chunk)) { rv = -EFAULT; break; }
@@ -2036,7 +2036,7 @@ static int dn_sendmsg(struct socket *sock, struct msghdr *msg, size_t size) skb_reserve(skb, 64 + DN_MAX_NSP_DATA_HEADER); - if (memcpy_from_msg(skb_put(skb, len), msg, len)) { + if (skb_memcpy_from_msg(skb, msg, len)) { err = -EFAULT; goto out; }
diff --git a/net/ieee802154/socket.c b/net/ieee802154/socket.c
index a60658c..c4072a4 100644
--- a/net/ieee802154/socket.c
+++ b/net/ieee802154/socket.c@@ -296,7 +296,7 @@ static int raw_sendmsg(struct sock *sk, struct msghdr *msg, size_t size) skb_reset_mac_header(skb); skb_reset_network_header(skb); - err = memcpy_from_msg(skb_put(skb, size), msg, size); + err = skb_memcpy_from_msg(skb, msg, size); if (err < 0) goto out_skb;
@@ -684,7 +684,7 @@ static int dgram_sendmsg(struct sock *sk, struct msghdr *msg, size_t size) if (err < 0) goto out_skb; - err = memcpy_from_msg(skb_put(skb, size), msg, size); + err = skb_memcpy_from_msg(skb, msg, size); if (err < 0) goto out_skb;
diff --git a/net/ipx/ipx_route.c b/net/ipx/ipx_route.c
index b5d9144..72c8403 100644
--- a/net/ipx/ipx_route.c
+++ b/net/ipx/ipx_route.c@@ -229,7 +229,7 @@ int ipxrtr_route_packet(struct sock *sk, struct sockaddr_ipx *usipx, memcpy(ipx->ipx_dest.node, usipx->sipx_node, IPX_NODE_LEN); ipx->ipx_dest.sock = usipx->sipx_port; - rc = memcpy_from_msg(skb_put(skb, len), msg, len); + rc = skb_memcpy_from_msg(skb, msg, len); if (rc) { kfree_skb(skb); goto out_put;
diff --git a/net/key/af_key.c b/net/key/af_key.c
index a00d607..af9b4b9 100644
--- a/net/key/af_key.c
+++ b/net/key/af_key.c@@ -3637,7 +3637,7 @@ static int pfkey_sendmsg(struct socket *sock, struct msghdr *msg, size_t len) goto out; err = -EFAULT; - if (memcpy_from_msg(skb_put(skb,len), msg, len)) + if (skb_memcpy_from_msg(skb, msg, len)) goto out; hdr = pfkey_get_base_msg(skb, &err);
diff --git a/net/l2tp/l2tp_ip.c b/net/l2tp/l2tp_ip.c
index 4d322c1..3640f92 100644
--- a/net/l2tp/l2tp_ip.c
+++ b/net/l2tp/l2tp_ip.c@@ -458,7 +458,7 @@ static int l2tp_ip_sendmsg(struct sock *sk, struct msghdr *msg, size_t len) *((__be32 *) skb_put(skb, 4)) = 0; /* Copy user data into skb */ - rc = memcpy_from_msg(skb_put(skb, len), msg, len); + rc = skb_memcpy_from_msg(skb, msg, len); if (rc < 0) { kfree_skb(skb); goto error;
diff --git a/net/l2tp/l2tp_ppp.c b/net/l2tp/l2tp_ppp.c
index bc6e8bf..c54ebaf 100644
--- a/net/l2tp/l2tp_ppp.c
+++ b/net/l2tp/l2tp_ppp.c@@ -329,7 +329,7 @@ static int pppol2tp_sendmsg(struct socket *sock, struct msghdr *m, skb_put(skb, 2); /* Copy user data into skb */ - error = memcpy_from_msg(skb_put(skb, total_len), m, total_len); + error = skb_memcpy_from_msg(skb, m, total_len); if (error < 0) { kfree_skb(skb); goto error_put_sess_tun;
diff --git a/net/llc/af_llc.c b/net/llc/af_llc.c
index c38d16f..aed88a1 100644
--- a/net/llc/af_llc.c
+++ b/net/llc/af_llc.c@@ -928,7 +928,7 @@ static int llc_ui_sendmsg(struct socket *sock, struct msghdr *msg, size_t len) skb->dev = llc->dev; skb->protocol = llc_proto_type(addr->sllc_arphrd); skb_reserve(skb, hdrlen); - rc = memcpy_from_msg(skb_put(skb, copied), msg, copied); + rc = skb_memcpy_from_msg(skb, msg, copied); if (rc) goto out; if (sk->sk_type == SOCK_DGRAM || addr->sllc_ua) {
diff --git a/net/netlink/af_netlink.c b/net/netlink/af_netlink.c
index f347506..5ce9ac2 100644
--- a/net/netlink/af_netlink.c
+++ b/net/netlink/af_netlink.c@@ -1844,7 +1844,7 @@ static int netlink_sendmsg(struct socket *sock, struct msghdr *msg, size_t len) NETLINK_CB(skb).flags = netlink_skb_flags; err = -EFAULT; - if (memcpy_from_msg(skb_put(skb, len), msg, len)) { + if (skb_memcpy_from_msg(skb, msg, len)) { kfree_skb(skb); goto out; }
diff --git a/net/nfc/rawsock.c b/net/nfc/rawsock.c
index e2188de..a7bf4d4 100644
--- a/net/nfc/rawsock.c
+++ b/net/nfc/rawsock.c@@ -230,7 +230,7 @@ static int rawsock_sendmsg(struct socket *sock, struct msghdr *msg, size_t len) if (skb == NULL) return rc; - rc = memcpy_from_msg(skb_put(skb, len), msg, len); + rc = skb_memcpy_from_msg(skb, msg, len); if (rc < 0) { kfree_skb(skb); return rc;
diff --git a/net/packet/af_packet.c b/net/packet/af_packet.c
index 3f5caa3..162460b 100644
--- a/net/packet/af_packet.c
+++ b/net/packet/af_packet.c@@ -1972,7 +1972,7 @@ static int packet_sendmsg_spkt(struct socket *sock, struct msghdr *msg, if (len < hhlen) skb_reset_network_header(skb); } - err = memcpy_from_msg(skb_put(skb, len), msg, len); + err = skb_memcpy_from_msg(skb, msg, len); if (err) goto out_free; goto retry;
diff --git a/net/phonet/datagram.c b/net/phonet/datagram.c
index b44fb90..1ea1105 100644
--- a/net/phonet/datagram.c
+++ b/net/phonet/datagram.c@@ -108,7 +108,7 @@ static int pn_sendmsg(struct sock *sk, struct msghdr *msg, size_t len) return err; skb_reserve(skb, MAX_PHONET_HEADER); - err = memcpy_from_msg((void *)skb_put(skb, len), msg, len); + err = skb_memcpy_from_msg(skb, msg, len); if (err < 0) { kfree_skb(skb); return err;
diff --git a/net/phonet/pep.c b/net/phonet/pep.c
index 9fc76b1..84870b6 100644
--- a/net/phonet/pep.c
+++ b/net/phonet/pep.c@@ -1143,7 +1143,7 @@ static int pep_sendmsg(struct sock *sk, struct msghdr *msg, size_t len) return err; skb_reserve(skb, MAX_PHONET_HEADER + 3 + pn->aligned); - err = memcpy_from_msg(skb_put(skb, len), msg, len); + err = skb_memcpy_from_msg(skb, msg, len); if (err < 0) goto outfree;
--
2.7.4