History

udp: implement GRO for plain UDP sockets.

This is the RX counterpart of commit bec1f6f69736 ("udp: generate gso with UDP_SEGMENT"). When UDP_GRO is enabled, such socket is also eligible for GRO in the rx path: UDP segments directed to such socket are assembled into a larger GSO_UDP_L4 packet. The core UDP GRO support is enabled with setsockopt(UDP_GRO). Initial benchmark numbers: Before: udp rx: 1079 MB/s 769065 calls/s After: udp rx: 1466 MB/s 24877 calls/s This change introduces a side effect in respect to UDP tunnels: after a UDP tunnel creation, now the kernel performs a lookup per ingress UDP packet, while before such lookup happened only if the ingress packet carried a valid internal header csum. rfc v2 -> rfc v3: - fixed typos in macro name and comments - really enforce UDP_GRO_CNT_MAX, instead of UDP_GRO_CNT_MAX + 1 - acquire socket lock in UDP_GRO setsockopt rfc v1 -> rfc v2: - use a new option to enable UDP GRO - use static keys to protect the UDP GRO socket lookup

Paolo Abeni committed 8 years ago

Commit e20cf8d1 parent 60fb9565 files · +99 −28Browse files

Showing the changes to include/uapi/linux (1 of 5 files). Show all

Unified · Split

include/uapi/linux/udp.h+1−0
@@ -33,6 +33,7 @@ struct udphdr { · 32 unmodified lines
3333 #define UDP_NO_CHECK6_TX 101 /* Disable sending checksum for UDP6X */
3434 #define UDP_NO_CHECK6_RX 102 /* Disable accpeting checksum for UDP6 */
3535 #define UDP_SEGMENT 103 /* Set GSO segmentation size */
36+#define UDP_GRO 104 /* This socket can receive UDP GRO packets */
3637
3738 /* UDP encapsulation types */
3839 #define UDP_ENCAP_ESPINUDP_NON_IKE 1 /* draft-ietf-ipsec-nat-t-ike-00/01 */