Akihiko Odaki wrote: > On 2025/02/06 6:21, Willem de Bruijn wrote: > > Akihiko Odaki wrote: > >> hdr_len is repeatedly used so keep it in a local variable. > >> > >> Signed-off-by: Akihiko Odaki <akihiko.odaki@xxxxxxxxxx> > > > >> @@ -682,11 +683,8 @@ static ssize_t tap_get_user(struct tap_queue *q, void *msg_control, > >> if (msg_control && sock_flag(&q->sk, SOCK_ZEROCOPY)) { > >> struct iov_iter i; > >> > >> - copylen = vnet_hdr.hdr_len ? > >> - tap16_to_cpu(q, vnet_hdr.hdr_len) : GOODCOPY_LEN; > >> - if (copylen > good_linear) > >> - copylen = good_linear; > >> - else if (copylen < ETH_HLEN) > >> + copylen = min(hdr_len ? hdr_len : GOODCOPY_LEN, good_linear); > >> + if (copylen < ETH_HLEN) > >> copylen = ETH_HLEN; > > > > I forgot earlier: this can also use single line statement > > > > copylen = max(copylen, ETH_HLEN); > > > > And perhaps easiest to follow is > > > > copylen = hdr_len ?: GOODCOPY_LEN; > > copylen = min(copylen, good_linear); > > copylen = max(copylen, ETH_HLEN); > > I introduced the min() usage as it now neatly fits in a line, but I > found even clamp() fits so I'll use it in the next version: > copylen = clamp(hdr_len ?: GOODCOPY_LEN, ETH_HLEN, good_linear); > > Please tell me if you prefer hdr_len ?: GOODCOPY_LEN in a separate line: > copylen = hdr_len ?: GOODCOPY_LEN; > copylen = clamp(copylen, ETH_HLEN, good_linear); Oh nice. I had forgotten about clamp. Even better.