Thread (17 messages) 17 messages, 2 authors, 2025-02-06

Re: [PATCH net-next v5 6/7] tap: Keep hdr_len in tap_get_user()

From: Akihiko Odaki <hidden>
Date: 2025-02-06 07:04:18
Also in: kvm, linux-doc, linux-kselftest, lkml, virtualization

On 2025/02/06 6:21, Willem de Bruijn wrote:
Akihiko Odaki wrote:
quoted
hdr_len is repeatedly used so keep it in a local variable.

Signed-off-by: Akihiko Odaki <redacted>
quoted
@@ -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);
quoted
  		linear = copylen;
  		i = *from;
@@ -697,11 +695,9 @@ static ssize_t tap_get_user(struct tap_queue *q, void *msg_control,
  
  	if (!zerocopy) {
  		copylen = len;
-		linear = tap16_to_cpu(q, vnet_hdr.hdr_len);
-		if (linear > good_linear)
-			linear = good_linear;
-		else if (linear < ETH_HLEN)
-			linear = ETH_HLEN;
+		linear = min(hdr_len, good_linear);
+		if (copylen < ETH_HLEN)
+			copylen = ETH_HLEN;> > Same

I realized I mistakenly replaced linear with copylen here. Using clamp() 
will remove redundant variable references and fix the bug.
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help