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
Showing the changes to include/uapi/linux (1 of 5 files). Show all
Unified · Split
| @@ -33,6 +33,7 @@ struct udphdr { · 32 unmodified lines | |||
| 33 | #define UDP_NO_CHECK6_TX 101 /* Disable sending checksum for UDP6X */ | 33 | #define UDP_NO_CHECK6_TX 101 /* Disable sending checksum for UDP6X */ |
| 34 | #define UDP_NO_CHECK6_RX 102 /* Disable accpeting checksum for UDP6 */ | 34 | #define UDP_NO_CHECK6_RX 102 /* Disable accpeting checksum for UDP6 */ |
| 35 | #define UDP_SEGMENT 103 /* Set GSO segmentation size */ | 35 | #define UDP_SEGMENT 103 /* Set GSO segmentation size */ |
| 36 | #define UDP_GRO 104 /* This socket can receive UDP GRO packets */ | ||
| 36 | 37 | ||
| 37 | /* UDP encapsulation types */ | 38 | /* UDP encapsulation types */ |
| 38 | #define UDP_ENCAP_ESPINUDP_NON_IKE 1 /* draft-ietf-ipsec-nat-t-ike-00/01 */ | 39 | #define UDP_ENCAP_ESPINUDP_NON_IKE 1 /* draft-ietf-ipsec-nat-t-ike-00/01 */ |