lists.openwall.net   lists  /  announce  owl-users  owl-dev  john-users  john-dev  passwdqc-users  yescrypt  popa3d-users  /  oss-security  kernel-hardening  musl  sabotage  tlsify  passwords  /  crypt-dev  xvendor  /  Bugtraq  Full-Disclosure  linux-kernel  linux-netdev  linux-ext4  linux-hardening  linux-cve-announce  PHC 
Open Source and information security mailing list archives
 
Hash Suite: Windows password security audit tool. GUI, reports in PDF.
[<prev] [next>] [day] [month] [year] [list]
Message-ID: <202512141739.xX2FDADd-lkp@intel.com>
Date: Sun, 14 Dec 2025 17:27:45 +0800
From: kernel test robot <lkp@...el.com>
To: Tiwei Bie <tiwei.btw@...group.com>
Cc: oe-kbuild-all@...ts.linux.dev, linux-kernel@...r.kernel.org,
	Johannes Berg <johannes.berg@...el.com>
Subject: arch/um/drivers/vector_kern.c:989:69: sparse: sparse: incorrect type
 in argument 1 (different address spaces)

Hi Tiwei,

First bad commit (maybe != root cause):

tree:   https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git master
head:   8f0b4cce4481fb22653697cced8d0d04027cb1e8
commit: b555cb66583e99158cfef8e91c025252cefae55b um: vector: Eliminate the dependency on uml_net
date:   7 months ago
config: um-randconfig-r121-20251214 (https://download.01.org/0day-ci/archive/20251214/202512141739.xX2FDADd-lkp@intel.com/config)
compiler: clang version 22.0.0git (https://github.com/llvm/llvm-project 1335a05ab8bc8339ce24be3a9da89d8c3f4e0571)
reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20251214/202512141739.xX2FDADd-lkp@intel.com/reproduce)

If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <lkp@...el.com>
| Closes: https://lore.kernel.org/oe-kbuild-all/202512141739.xX2FDADd-lkp@intel.com/

sparse warnings: (new ones prefixed by >>)
>> arch/um/drivers/vector_transports.c:73:38: sparse: sparse: incorrect type in assignment (different base types) @@     expected unsigned int [usertype] @@     got restricted __be32 [usertype] @@
   arch/um/drivers/vector_transports.c:73:38: sparse:     expected unsigned int [usertype]
   arch/um/drivers/vector_transports.c:73:38: sparse:     got restricted __be32 [usertype]
   arch/um/drivers/vector_transports.c:90:34: sparse: sparse: incorrect type in assignment (different base types) @@     expected unsigned int [usertype] @@     got restricted __be32 [usertype] @@
   arch/um/drivers/vector_transports.c:90:34: sparse:     expected unsigned int [usertype]
   arch/um/drivers/vector_transports.c:90:34: sparse:     got restricted __be32 [usertype]
   arch/um/drivers/vector_transports.c:109:35: sparse: sparse: incorrect type in assignment (different base types) @@     expected unsigned int [usertype] @@     got restricted __be32 [usertype] @@
   arch/um/drivers/vector_transports.c:109:35: sparse:     expected unsigned int [usertype]
   arch/um/drivers/vector_transports.c:109:35: sparse:     got restricted __be32 [usertype]
>> arch/um/drivers/vector_transports.c:254:37: sparse: sparse: incorrect type in assignment (different base types) @@     expected unsigned short [usertype] arptype @@     got restricted __be16 [usertype] @@
   arch/um/drivers/vector_transports.c:254:37: sparse:     expected unsigned short [usertype] arptype
   arch/um/drivers/vector_transports.c:254:37: sparse:     got restricted __be16 [usertype]
>> arch/um/drivers/vector_transports.c:273:52: sparse: sparse: invalid assignment: |=
   arch/um/drivers/vector_transports.c:273:52: sparse:    left side has type unsigned short
   arch/um/drivers/vector_transports.c:273:52: sparse:    right side has type restricted __be16
>> arch/um/drivers/vector_transports.c:274:36: sparse: sparse: incorrect type in assignment (different base types) @@     expected unsigned int [usertype] rx_key @@     got restricted __be32 [usertype] @@
   arch/um/drivers/vector_transports.c:274:36: sparse:     expected unsigned int [usertype] rx_key
   arch/um/drivers/vector_transports.c:274:36: sparse:     got restricted __be32 [usertype]
>> arch/um/drivers/vector_transports.c:275:36: sparse: sparse: incorrect type in assignment (different base types) @@     expected unsigned int [usertype] tx_key @@     got restricted __be32 [usertype] @@
   arch/um/drivers/vector_transports.c:275:36: sparse:     expected unsigned int [usertype] tx_key
   arch/um/drivers/vector_transports.c:275:36: sparse:     got restricted __be32 [usertype]
   arch/um/drivers/vector_transports.c:288:52: sparse: sparse: invalid assignment: |=
   arch/um/drivers/vector_transports.c:288:52: sparse:    left side has type unsigned short
   arch/um/drivers/vector_transports.c:288:52: sparse:    right side has type restricted __be16
>> arch/um/drivers/vector_transports.c:336:40: sparse: sparse: incorrect type in assignment (different base types) @@     expected unsigned long long [usertype] tx_session @@     got restricted __be32 [usertype] @@
   arch/um/drivers/vector_transports.c:336:40: sparse:     expected unsigned long long [usertype] tx_session
   arch/um/drivers/vector_transports.c:336:40: sparse:     got restricted __be32 [usertype]
   arch/um/drivers/vector_transports.c:337:40: sparse: sparse: incorrect type in assignment (different base types) @@     expected unsigned long long [usertype] rx_session @@     got restricted __be32 [usertype] @@
   arch/um/drivers/vector_transports.c:337:40: sparse:     expected unsigned long long [usertype] rx_session
   arch/um/drivers/vector_transports.c:337:40: sparse:     got restricted __be32 [usertype]
>> arch/um/drivers/vector_transports.c:355:47: sparse: sparse: incorrect type in assignment (different base types) @@     expected unsigned long long [usertype] rx_cookie @@     got restricted __be64 [usertype] @@
   arch/um/drivers/vector_transports.c:355:47: sparse:     expected unsigned long long [usertype] rx_cookie
   arch/um/drivers/vector_transports.c:355:47: sparse:     got restricted __be64 [usertype]
>> arch/um/drivers/vector_transports.c:356:47: sparse: sparse: incorrect type in assignment (different base types) @@     expected unsigned long long [usertype] tx_cookie @@     got restricted __be64 [usertype] @@
   arch/um/drivers/vector_transports.c:356:47: sparse:     expected unsigned long long [usertype] tx_cookie
   arch/um/drivers/vector_transports.c:356:47: sparse:     got restricted __be64 [usertype]
>> arch/um/drivers/vector_transports.c:360:47: sparse: sparse: incorrect type in assignment (different base types) @@     expected unsigned long long [usertype] rx_cookie @@     got restricted __be32 [usertype] @@
   arch/um/drivers/vector_transports.c:360:47: sparse:     expected unsigned long long [usertype] rx_cookie
   arch/um/drivers/vector_transports.c:360:47: sparse:     got restricted __be32 [usertype]
>> arch/um/drivers/vector_transports.c:361:47: sparse: sparse: incorrect type in assignment (different base types) @@     expected unsigned long long [usertype] tx_cookie @@     got restricted __be32 [usertype] @@
   arch/um/drivers/vector_transports.c:361:47: sparse:     expected unsigned long long [usertype] tx_cookie
   arch/um/drivers/vector_transports.c:361:47: sparse:     got restricted __be32 [usertype]
--
>> arch/um/drivers/vector_kern.c:989:69: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected unsigned char [usertype] *header @@     got void [noderef] __user *[noderef] __user iov_base @@
   arch/um/drivers/vector_kern.c:989:69: sparse:     expected unsigned char [usertype] *header
   arch/um/drivers/vector_kern.c:989:69: sparse:     got void [noderef] __user *[noderef] __user iov_base
>> arch/um/drivers/vector_kern.c:297:47: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected unsigned char [usertype] *header @@     got void [noderef] __user *iov_base @@
   arch/um/drivers/vector_kern.c:297:47: sparse:     expected unsigned char [usertype] *header
   arch/um/drivers/vector_kern.c:297:47: sparse:     got void [noderef] __user *iov_base
>> arch/um/drivers/vector_kern.c:300:33: sparse: sparse: incorrect type in assignment (different address spaces) @@     expected void [noderef] __user *iov_base @@     got unsigned char *data @@
   arch/um/drivers/vector_kern.c:300:33: sparse:     expected void [noderef] __user *iov_base
   arch/um/drivers/vector_kern.c:300:33: sparse:     got unsigned char *data
>> arch/um/drivers/vector_kern.c:309:41: sparse: sparse: incorrect type in assignment (different address spaces) @@     expected void [noderef] __user *iov_base @@     got void * @@
   arch/um/drivers/vector_kern.c:309:41: sparse:     expected void [noderef] __user *iov_base
   arch/um/drivers/vector_kern.c:309:41: sparse:     got void *
>> arch/um/drivers/vector_kern.c:344:45: sparse: sparse: incorrect type in argument 3 (different address spaces) @@     expected struct iovec *iov @@     got struct iovec [noderef] __user *msg_iov @@
   arch/um/drivers/vector_kern.c:344:45: sparse:     expected struct iovec *iov
   arch/um/drivers/vector_kern.c:344:45: sparse:     got struct iovec [noderef] __user *msg_iov
>> arch/um/drivers/vector_kern.c:349:47: sparse: sparse: incorrect type in assignment (different address spaces) @@     expected void [noderef] __user *msg_name @@     got void *remote_addr @@
   arch/um/drivers/vector_kern.c:349:47: sparse:     expected void [noderef] __user *msg_name
   arch/um/drivers/vector_kern.c:349:47: sparse:     got void *remote_addr
>> arch/um/drivers/vector_kern.c:487:29: sparse: sparse: incorrect type in assignment (different address spaces) @@     expected struct iovec *iov @@     got struct iovec [noderef] __user *msg_iov @@
   arch/um/drivers/vector_kern.c:487:29: sparse:     expected struct iovec *iov
   arch/um/drivers/vector_kern.c:487:29: sparse:     got struct iovec [noderef] __user *msg_iov
>> arch/um/drivers/vector_kern.c:491:50: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void const *objp @@     got void [noderef] __user *iov_base @@
   arch/um/drivers/vector_kern.c:491:50: sparse:     expected void const *objp
   arch/um/drivers/vector_kern.c:491:50: sparse:     got void [noderef] __user *iov_base
>> arch/um/drivers/vector_kern.c:555:46: sparse: sparse: incorrect type in assignment (different address spaces) @@     expected struct iovec [noderef] __user *msg_iov @@     got struct iovec *[assigned] iov @@
   arch/um/drivers/vector_kern.c:555:46: sparse:     expected struct iovec [noderef] __user *msg_iov
   arch/um/drivers/vector_kern.c:555:46: sparse:     got struct iovec *[assigned] iov
>> arch/um/drivers/vector_kern.c:563:39: sparse: sparse: incorrect type in assignment (different address spaces) @@     expected void [noderef] __user *iov_base @@     got void *[assigned] _res @@
   arch/um/drivers/vector_kern.c:563:39: sparse:     expected void [noderef] __user *iov_base
   arch/um/drivers/vector_kern.c:563:39: sparse:     got void *[assigned] _res
>> arch/um/drivers/vector_kern.c:606:32: sparse: sparse: incorrect type in initializer (different address spaces) @@     expected struct iovec *iov @@     got struct iovec [noderef] __user *msg_iov @@
   arch/um/drivers/vector_kern.c:606:32: sparse:     expected struct iovec *iov
   arch/um/drivers/vector_kern.c:606:32: sparse:     got struct iovec [noderef] __user *msg_iov
   arch/um/drivers/vector_kern.c:635:33: sparse: sparse: incorrect type in assignment (different address spaces) @@     expected void [noderef] __user *iov_base @@     got unsigned char *data @@
   arch/um/drivers/vector_kern.c:635:33: sparse:     expected void [noderef] __user *iov_base
   arch/um/drivers/vector_kern.c:635:33: sparse:     got unsigned char *data
   arch/um/drivers/vector_kern.c:642:41: sparse: sparse: incorrect type in assignment (different address spaces) @@     expected void [noderef] __user *iov_base @@     got void * @@
   arch/um/drivers/vector_kern.c:642:41: sparse:     expected void [noderef] __user *iov_base
   arch/um/drivers/vector_kern.c:642:41: sparse:     got void *
>> arch/um/drivers/vector_kern.c:841:21: sparse: sparse: incorrect type in assignment (different address spaces) @@     expected struct iovec [noderef] __user *[assigned] msg_iov @@     got struct iovec * @@
   arch/um/drivers/vector_kern.c:841:21: sparse:     expected struct iovec [noderef] __user *[assigned] msg_iov
   arch/um/drivers/vector_kern.c:841:21: sparse:     got struct iovec *
>> arch/um/drivers/vector_kern.c:847:33: sparse: sparse: incorrect type in assignment (different address spaces) @@     expected void [noderef] __user *iov_base @@     got void *header_rxbuffer @@
   arch/um/drivers/vector_kern.c:847:33: sparse:     expected void [noderef] __user *iov_base
   arch/um/drivers/vector_kern.c:847:33: sparse:     got void *header_rxbuffer
>> arch/um/drivers/vector_kern.c:857:38: sparse: sparse: incorrect type in assignment (different address spaces) @@     expected void [noderef] __user *iov_base @@     got char *static [toplevel] drop_buffer @@
   arch/um/drivers/vector_kern.c:857:38: sparse:     expected void [noderef] __user *iov_base
   arch/um/drivers/vector_kern.c:857:38: sparse:     got char *static [toplevel] drop_buffer
>> arch/um/drivers/vector_kern.c:909:25: sparse: sparse: incorrect type in assignment (different address spaces) @@     expected void [noderef] __user *iov_base @@     got void *header_txbuffer @@
   arch/um/drivers/vector_kern.c:909:25: sparse:     expected void [noderef] __user *iov_base
   arch/um/drivers/vector_kern.c:909:25: sparse:     got void *header_txbuffer
>> arch/um/drivers/vector_kern.c:1143:30: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void const *objp @@     got struct sock_filter [noderef] __user *filter @@
   arch/um/drivers/vector_kern.c:1143:30: sparse:     expected void const *objp
   arch/um/drivers/vector_kern.c:1143:30: sparse:     got struct sock_filter [noderef] __user *filter
   arch/um/drivers/vector_kern.c:1382:30: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void const *objp @@     got struct sock_filter [noderef] __user *filter @@
   arch/um/drivers/vector_kern.c:1382:30: sparse:     expected void const *objp
   arch/um/drivers/vector_kern.c:1382:30: sparse:     got struct sock_filter [noderef] __user *filter
>> arch/um/drivers/vector_kern.c:1397:25: sparse: sparse: incorrect type in assignment (different address spaces) @@     expected struct sock_filter [noderef] __user *filter @@     got void *[assigned] _res @@
   arch/um/drivers/vector_kern.c:1397:25: sparse:     expected struct sock_filter [noderef] __user *filter
   arch/um/drivers/vector_kern.c:1397:25: sparse:     got void *[assigned] _res
   arch/um/drivers/vector_kern.c:1414:30: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void const *objp @@     got struct sock_filter [noderef] __user *filter @@
   arch/um/drivers/vector_kern.c:1414:30: sparse:     expected void const *objp
   arch/um/drivers/vector_kern.c:1414:30: sparse:     got struct sock_filter [noderef] __user *filter
>> arch/um/drivers/vector_kern.c:989:61: sparse: sparse: dereference of noderef expression

vim +989 arch/um/drivers/vector_kern.c

49da7e64f33e80 Anton Ivanov    2017-11-20   825  
49da7e64f33e80 Anton Ivanov    2017-11-20   826  /* Bog standard recv using recvmsg - not used normally unless the user
49da7e64f33e80 Anton Ivanov    2017-11-20   827   * explicitly specifies not to use recvmmsg vector RX.
49da7e64f33e80 Anton Ivanov    2017-11-20   828   */
49da7e64f33e80 Anton Ivanov    2017-11-20   829  
49da7e64f33e80 Anton Ivanov    2017-11-20   830  static int vector_legacy_rx(struct vector_private *vp)
49da7e64f33e80 Anton Ivanov    2017-11-20   831  {
49da7e64f33e80 Anton Ivanov    2017-11-20   832  	int pkt_len;
49da7e64f33e80 Anton Ivanov    2017-11-20   833  	struct user_msghdr hdr;
49da7e64f33e80 Anton Ivanov    2017-11-20   834  	struct iovec iov[2 + MAX_IOV_SIZE]; /* header + data use case only */
49da7e64f33e80 Anton Ivanov    2017-11-20   835  	int iovpos = 0;
49da7e64f33e80 Anton Ivanov    2017-11-20   836  	struct sk_buff *skb;
49da7e64f33e80 Anton Ivanov    2017-11-20   837  	int header_check;
49da7e64f33e80 Anton Ivanov    2017-11-20   838  
49da7e64f33e80 Anton Ivanov    2017-11-20   839  	hdr.msg_name = NULL;
49da7e64f33e80 Anton Ivanov    2017-11-20   840  	hdr.msg_namelen = 0;
49da7e64f33e80 Anton Ivanov    2017-11-20  @841  	hdr.msg_iov = (struct iovec *) &iov;
49da7e64f33e80 Anton Ivanov    2017-11-20   842  	hdr.msg_control = NULL;
49da7e64f33e80 Anton Ivanov    2017-11-20   843  	hdr.msg_controllen = 0;
49da7e64f33e80 Anton Ivanov    2017-11-20   844  	hdr.msg_flags = 0;
49da7e64f33e80 Anton Ivanov    2017-11-20   845  
49da7e64f33e80 Anton Ivanov    2017-11-20   846  	if (vp->header_size > 0) {
49da7e64f33e80 Anton Ivanov    2017-11-20  @847  		iov[0].iov_base = vp->header_rxbuffer;
49da7e64f33e80 Anton Ivanov    2017-11-20   848  		iov[0].iov_len = vp->header_size;
49da7e64f33e80 Anton Ivanov    2017-11-20   849  	}
49da7e64f33e80 Anton Ivanov    2017-11-20   850  
49da7e64f33e80 Anton Ivanov    2017-11-20   851  	skb = prep_skb(vp, &hdr);
49da7e64f33e80 Anton Ivanov    2017-11-20   852  
49da7e64f33e80 Anton Ivanov    2017-11-20   853  	if (skb == NULL) {
49da7e64f33e80 Anton Ivanov    2017-11-20   854  		/* Read a packet into drop_buffer and don't do
49da7e64f33e80 Anton Ivanov    2017-11-20   855  		 * anything with it.
49da7e64f33e80 Anton Ivanov    2017-11-20   856  		 */
49da7e64f33e80 Anton Ivanov    2017-11-20  @857  		iov[iovpos].iov_base = drop_buffer;
49da7e64f33e80 Anton Ivanov    2017-11-20   858  		iov[iovpos].iov_len = DROP_BUFFER_SIZE;
49da7e64f33e80 Anton Ivanov    2017-11-20   859  		hdr.msg_iovlen = 1;
49da7e64f33e80 Anton Ivanov    2017-11-20   860  		vp->dev->stats.rx_dropped++;
49da7e64f33e80 Anton Ivanov    2017-11-20   861  	}
49da7e64f33e80 Anton Ivanov    2017-11-20   862  
49da7e64f33e80 Anton Ivanov    2017-11-20   863  	pkt_len = uml_vector_recvmsg(vp->fds->rx_fd, &hdr, 0);
d47761db97d35c Anton Ivanov    2019-08-09   864  	if (pkt_len < 0) {
d47761db97d35c Anton Ivanov    2019-08-09   865  		vp->in_error = true;
d47761db97d35c Anton Ivanov    2019-08-09   866  		return pkt_len;
d47761db97d35c Anton Ivanov    2019-08-09   867  	}
49da7e64f33e80 Anton Ivanov    2017-11-20   868  
49da7e64f33e80 Anton Ivanov    2017-11-20   869  	if (skb != NULL) {
49da7e64f33e80 Anton Ivanov    2017-11-20   870  		if (pkt_len > vp->header_size) {
49da7e64f33e80 Anton Ivanov    2017-11-20   871  			if (vp->header_size > 0) {
49da7e64f33e80 Anton Ivanov    2017-11-20   872  				header_check = vp->verify_header(
49da7e64f33e80 Anton Ivanov    2017-11-20   873  					vp->header_rxbuffer, skb, vp);
49da7e64f33e80 Anton Ivanov    2017-11-20   874  				if (header_check < 0) {
49da7e64f33e80 Anton Ivanov    2017-11-20   875  					dev_kfree_skb_irq(skb);
49da7e64f33e80 Anton Ivanov    2017-11-20   876  					vp->dev->stats.rx_dropped++;
49da7e64f33e80 Anton Ivanov    2017-11-20   877  					vp->estats.rx_encaps_errors++;
49da7e64f33e80 Anton Ivanov    2017-11-20   878  					return 0;
49da7e64f33e80 Anton Ivanov    2017-11-20   879  				}
49da7e64f33e80 Anton Ivanov    2017-11-20   880  				if (header_check > 0) {
49da7e64f33e80 Anton Ivanov    2017-11-20   881  					vp->estats.rx_csum_offload_good++;
49da7e64f33e80 Anton Ivanov    2017-11-20   882  					skb->ip_summed = CHECKSUM_UNNECESSARY;
49da7e64f33e80 Anton Ivanov    2017-11-20   883  				}
49da7e64f33e80 Anton Ivanov    2017-11-20   884  			}
49da7e64f33e80 Anton Ivanov    2017-11-20   885  			pskb_trim(skb, pkt_len - vp->rx_header_size);
49da7e64f33e80 Anton Ivanov    2017-11-20   886  			skb->protocol = eth_type_trans(skb, skb->dev);
49da7e64f33e80 Anton Ivanov    2017-11-20   887  			vp->dev->stats.rx_bytes += skb->len;
49da7e64f33e80 Anton Ivanov    2017-11-20   888  			vp->dev->stats.rx_packets++;
b35507a4cfb26b Anton Ivanov    2022-01-21   889  			napi_gro_receive(&vp->napi, skb);
49da7e64f33e80 Anton Ivanov    2017-11-20   890  		} else {
49da7e64f33e80 Anton Ivanov    2017-11-20   891  			dev_kfree_skb_irq(skb);
49da7e64f33e80 Anton Ivanov    2017-11-20   892  		}
49da7e64f33e80 Anton Ivanov    2017-11-20   893  	}
49da7e64f33e80 Anton Ivanov    2017-11-20   894  	return pkt_len;
49da7e64f33e80 Anton Ivanov    2017-11-20   895  }
49da7e64f33e80 Anton Ivanov    2017-11-20   896  
49da7e64f33e80 Anton Ivanov    2017-11-20   897  /*
49da7e64f33e80 Anton Ivanov    2017-11-20   898   * Packet at a time TX which falls back to vector TX if the
49da7e64f33e80 Anton Ivanov    2017-11-20   899   * underlying transport is busy.
49da7e64f33e80 Anton Ivanov    2017-11-20   900   */
49da7e64f33e80 Anton Ivanov    2017-11-20   901  
49da7e64f33e80 Anton Ivanov    2017-11-20   902  
49da7e64f33e80 Anton Ivanov    2017-11-20   903  
49da7e64f33e80 Anton Ivanov    2017-11-20   904  static int writev_tx(struct vector_private *vp, struct sk_buff *skb)
49da7e64f33e80 Anton Ivanov    2017-11-20   905  {
49da7e64f33e80 Anton Ivanov    2017-11-20   906  	struct iovec iov[3 + MAX_IOV_SIZE];
49da7e64f33e80 Anton Ivanov    2017-11-20   907  	int iov_count, pkt_len = 0;
49da7e64f33e80 Anton Ivanov    2017-11-20   908  
49da7e64f33e80 Anton Ivanov    2017-11-20  @909  	iov[0].iov_base = vp->header_txbuffer;
49da7e64f33e80 Anton Ivanov    2017-11-20   910  	iov_count = prep_msg(vp, skb, (struct iovec *) &iov);
49da7e64f33e80 Anton Ivanov    2017-11-20   911  
49da7e64f33e80 Anton Ivanov    2017-11-20   912  	if (iov_count < 1)
49da7e64f33e80 Anton Ivanov    2017-11-20   913  		goto drop;
d47761db97d35c Anton Ivanov    2019-08-09   914  
49da7e64f33e80 Anton Ivanov    2017-11-20   915  	pkt_len = uml_vector_writev(
49da7e64f33e80 Anton Ivanov    2017-11-20   916  		vp->fds->tx_fd,
49da7e64f33e80 Anton Ivanov    2017-11-20   917  		(struct iovec *) &iov,
49da7e64f33e80 Anton Ivanov    2017-11-20   918  		iov_count
49da7e64f33e80 Anton Ivanov    2017-11-20   919  	);
49da7e64f33e80 Anton Ivanov    2017-11-20   920  
d47761db97d35c Anton Ivanov    2019-08-09   921  	if (pkt_len < 0)
d47761db97d35c Anton Ivanov    2019-08-09   922  		goto drop;
d47761db97d35c Anton Ivanov    2019-08-09   923  
49da7e64f33e80 Anton Ivanov    2017-11-20   924  	netif_trans_update(vp->dev);
49da7e64f33e80 Anton Ivanov    2017-11-20   925  	netif_wake_queue(vp->dev);
49da7e64f33e80 Anton Ivanov    2017-11-20   926  
49da7e64f33e80 Anton Ivanov    2017-11-20   927  	if (pkt_len > 0) {
49da7e64f33e80 Anton Ivanov    2017-11-20   928  		vp->dev->stats.tx_bytes += skb->len;
49da7e64f33e80 Anton Ivanov    2017-11-20   929  		vp->dev->stats.tx_packets++;
49da7e64f33e80 Anton Ivanov    2017-11-20   930  	} else {
49da7e64f33e80 Anton Ivanov    2017-11-20   931  		vp->dev->stats.tx_dropped++;
49da7e64f33e80 Anton Ivanov    2017-11-20   932  	}
49da7e64f33e80 Anton Ivanov    2017-11-20   933  	consume_skb(skb);
49da7e64f33e80 Anton Ivanov    2017-11-20   934  	return pkt_len;
49da7e64f33e80 Anton Ivanov    2017-11-20   935  drop:
49da7e64f33e80 Anton Ivanov    2017-11-20   936  	vp->dev->stats.tx_dropped++;
49da7e64f33e80 Anton Ivanov    2017-11-20   937  	consume_skb(skb);
d47761db97d35c Anton Ivanov    2019-08-09   938  	if (pkt_len < 0)
d47761db97d35c Anton Ivanov    2019-08-09   939  		vp->in_error = true;
49da7e64f33e80 Anton Ivanov    2017-11-20   940  	return pkt_len;
49da7e64f33e80 Anton Ivanov    2017-11-20   941  }
49da7e64f33e80 Anton Ivanov    2017-11-20   942  
49da7e64f33e80 Anton Ivanov    2017-11-20   943  /*
49da7e64f33e80 Anton Ivanov    2017-11-20   944   * Receive as many messages as we can in one call using the special
49da7e64f33e80 Anton Ivanov    2017-11-20   945   * mmsg vector matched to an skb vector which we prepared earlier.
49da7e64f33e80 Anton Ivanov    2017-11-20   946   */
49da7e64f33e80 Anton Ivanov    2017-11-20   947  
b35507a4cfb26b Anton Ivanov    2022-01-21   948  static int vector_mmsg_rx(struct vector_private *vp, int budget)
49da7e64f33e80 Anton Ivanov    2017-11-20   949  {
49da7e64f33e80 Anton Ivanov    2017-11-20   950  	int packet_count, i;
49da7e64f33e80 Anton Ivanov    2017-11-20   951  	struct vector_queue *qi = vp->rx_queue;
49da7e64f33e80 Anton Ivanov    2017-11-20   952  	struct sk_buff *skb;
49da7e64f33e80 Anton Ivanov    2017-11-20   953  	struct mmsghdr *mmsg_vector = qi->mmsg_vector;
49da7e64f33e80 Anton Ivanov    2017-11-20   954  	void **skbuff_vector = qi->skbuff_vector;
49da7e64f33e80 Anton Ivanov    2017-11-20   955  	int header_check;
49da7e64f33e80 Anton Ivanov    2017-11-20   956  
49da7e64f33e80 Anton Ivanov    2017-11-20   957  	/* Refresh the vector and make sure it is with new skbs and the
49da7e64f33e80 Anton Ivanov    2017-11-20   958  	 * iovs are updated to point to them.
49da7e64f33e80 Anton Ivanov    2017-11-20   959  	 */
49da7e64f33e80 Anton Ivanov    2017-11-20   960  
49da7e64f33e80 Anton Ivanov    2017-11-20   961  	prep_queue_for_rx(qi);
49da7e64f33e80 Anton Ivanov    2017-11-20   962  
49da7e64f33e80 Anton Ivanov    2017-11-20   963  	/* Fire the Lazy Gun - get as many packets as we can in one go. */
49da7e64f33e80 Anton Ivanov    2017-11-20   964  
b35507a4cfb26b Anton Ivanov    2022-01-21   965  	if (budget > qi->max_depth)
b35507a4cfb26b Anton Ivanov    2022-01-21   966  		budget = qi->max_depth;
b35507a4cfb26b Anton Ivanov    2022-01-21   967  
49da7e64f33e80 Anton Ivanov    2017-11-20   968  	packet_count = uml_vector_recvmmsg(
671cd5eed9db34 Anton Ivanov    2024-07-06   969  		vp->fds->rx_fd, qi->mmsg_vector, budget, 0);
49da7e64f33e80 Anton Ivanov    2017-11-20   970  
d47761db97d35c Anton Ivanov    2019-08-09   971  	if (packet_count < 0)
d47761db97d35c Anton Ivanov    2019-08-09   972  		vp->in_error = true;
d47761db97d35c Anton Ivanov    2019-08-09   973  
49da7e64f33e80 Anton Ivanov    2017-11-20   974  	if (packet_count <= 0)
49da7e64f33e80 Anton Ivanov    2017-11-20   975  		return packet_count;
49da7e64f33e80 Anton Ivanov    2017-11-20   976  
49da7e64f33e80 Anton Ivanov    2017-11-20   977  	/* We treat packet processing as enqueue, buffer refresh as dequeue
49da7e64f33e80 Anton Ivanov    2017-11-20   978  	 * The queue_depth tells us how many buffers have been used and how
49da7e64f33e80 Anton Ivanov    2017-11-20   979  	 * many do we need to prep the next time prep_queue_for_rx() is called.
49da7e64f33e80 Anton Ivanov    2017-11-20   980  	 */
49da7e64f33e80 Anton Ivanov    2017-11-20   981  
612a8c8e0b43ba Anton Ivanov    2024-07-05   982  	atomic_add(packet_count, &qi->queue_depth);
49da7e64f33e80 Anton Ivanov    2017-11-20   983  
49da7e64f33e80 Anton Ivanov    2017-11-20   984  	for (i = 0; i < packet_count; i++) {
49da7e64f33e80 Anton Ivanov    2017-11-20   985  		skb = (*skbuff_vector);
49da7e64f33e80 Anton Ivanov    2017-11-20   986  		if (mmsg_vector->msg_len > vp->header_size) {
49da7e64f33e80 Anton Ivanov    2017-11-20   987  			if (vp->header_size > 0) {
49da7e64f33e80 Anton Ivanov    2017-11-20   988  				header_check = vp->verify_header(
49da7e64f33e80 Anton Ivanov    2017-11-20  @989  					mmsg_vector->msg_hdr.msg_iov->iov_base,
49da7e64f33e80 Anton Ivanov    2017-11-20   990  					skb,
49da7e64f33e80 Anton Ivanov    2017-11-20   991  					vp
49da7e64f33e80 Anton Ivanov    2017-11-20   992  				);
49da7e64f33e80 Anton Ivanov    2017-11-20   993  				if (header_check < 0) {
49da7e64f33e80 Anton Ivanov    2017-11-20   994  				/* Overlay header failed to verify - discard.
49da7e64f33e80 Anton Ivanov    2017-11-20   995  				 * We can actually keep this skb and reuse it,
49da7e64f33e80 Anton Ivanov    2017-11-20   996  				 * but that will make the prep logic too
49da7e64f33e80 Anton Ivanov    2017-11-20   997  				 * complex.
49da7e64f33e80 Anton Ivanov    2017-11-20   998  				 */
49da7e64f33e80 Anton Ivanov    2017-11-20   999  					dev_kfree_skb_irq(skb);
49da7e64f33e80 Anton Ivanov    2017-11-20  1000  					vp->estats.rx_encaps_errors++;
49da7e64f33e80 Anton Ivanov    2017-11-20  1001  					continue;
49da7e64f33e80 Anton Ivanov    2017-11-20  1002  				}
49da7e64f33e80 Anton Ivanov    2017-11-20  1003  				if (header_check > 0) {
49da7e64f33e80 Anton Ivanov    2017-11-20  1004  					vp->estats.rx_csum_offload_good++;
49da7e64f33e80 Anton Ivanov    2017-11-20  1005  					skb->ip_summed = CHECKSUM_UNNECESSARY;
49da7e64f33e80 Anton Ivanov    2017-11-20  1006  				}
49da7e64f33e80 Anton Ivanov    2017-11-20  1007  			}
49da7e64f33e80 Anton Ivanov    2017-11-20  1008  			pskb_trim(skb,
49da7e64f33e80 Anton Ivanov    2017-11-20  1009  				mmsg_vector->msg_len - vp->rx_header_size);
49da7e64f33e80 Anton Ivanov    2017-11-20  1010  			skb->protocol = eth_type_trans(skb, skb->dev);
49da7e64f33e80 Anton Ivanov    2017-11-20  1011  			/*
49da7e64f33e80 Anton Ivanov    2017-11-20  1012  			 * We do not need to lock on updating stats here
49da7e64f33e80 Anton Ivanov    2017-11-20  1013  			 * The interrupt loop is non-reentrant.
49da7e64f33e80 Anton Ivanov    2017-11-20  1014  			 */
49da7e64f33e80 Anton Ivanov    2017-11-20  1015  			vp->dev->stats.rx_bytes += skb->len;
49da7e64f33e80 Anton Ivanov    2017-11-20  1016  			vp->dev->stats.rx_packets++;
b35507a4cfb26b Anton Ivanov    2022-01-21  1017  			napi_gro_receive(&vp->napi, skb);
49da7e64f33e80 Anton Ivanov    2017-11-20  1018  		} else {
49da7e64f33e80 Anton Ivanov    2017-11-20  1019  			/* Overlay header too short to do anything - discard.
49da7e64f33e80 Anton Ivanov    2017-11-20  1020  			 * We can actually keep this skb and reuse it,
49da7e64f33e80 Anton Ivanov    2017-11-20  1021  			 * but that will make the prep logic too complex.
49da7e64f33e80 Anton Ivanov    2017-11-20  1022  			 */
49da7e64f33e80 Anton Ivanov    2017-11-20  1023  			if (skb != NULL)
49da7e64f33e80 Anton Ivanov    2017-11-20  1024  				dev_kfree_skb_irq(skb);
49da7e64f33e80 Anton Ivanov    2017-11-20  1025  		}
49da7e64f33e80 Anton Ivanov    2017-11-20  1026  		(*skbuff_vector) = NULL;
49da7e64f33e80 Anton Ivanov    2017-11-20  1027  		/* Move to the next buffer element */
49da7e64f33e80 Anton Ivanov    2017-11-20  1028  		mmsg_vector++;
49da7e64f33e80 Anton Ivanov    2017-11-20  1029  		skbuff_vector++;
49da7e64f33e80 Anton Ivanov    2017-11-20  1030  	}
49da7e64f33e80 Anton Ivanov    2017-11-20  1031  	if (packet_count > 0) {
49da7e64f33e80 Anton Ivanov    2017-11-20  1032  		if (vp->estats.rx_queue_max < packet_count)
49da7e64f33e80 Anton Ivanov    2017-11-20  1033  			vp->estats.rx_queue_max = packet_count;
49da7e64f33e80 Anton Ivanov    2017-11-20  1034  		vp->estats.rx_queue_running_average =
49da7e64f33e80 Anton Ivanov    2017-11-20  1035  			(vp->estats.rx_queue_running_average + packet_count) >> 1;
49da7e64f33e80 Anton Ivanov    2017-11-20  1036  	}
49da7e64f33e80 Anton Ivanov    2017-11-20  1037  	return packet_count;
49da7e64f33e80 Anton Ivanov    2017-11-20  1038  }
49da7e64f33e80 Anton Ivanov    2017-11-20  1039  
49da7e64f33e80 Anton Ivanov    2017-11-20  1040  static int vector_net_start_xmit(struct sk_buff *skb, struct net_device *dev)
49da7e64f33e80 Anton Ivanov    2017-11-20  1041  {
49da7e64f33e80 Anton Ivanov    2017-11-20  1042  	struct vector_private *vp = netdev_priv(dev);
49da7e64f33e80 Anton Ivanov    2017-11-20  1043  	int queue_depth = 0;
49da7e64f33e80 Anton Ivanov    2017-11-20  1044  
d47761db97d35c Anton Ivanov    2019-08-09  1045  	if (vp->in_error) {
d47761db97d35c Anton Ivanov    2019-08-09  1046  		deactivate_fd(vp->fds->rx_fd, vp->rx_irq);
d47761db97d35c Anton Ivanov    2019-08-09  1047  		if ((vp->fds->rx_fd != vp->fds->tx_fd) && (vp->tx_irq != 0))
d47761db97d35c Anton Ivanov    2019-08-09  1048  			deactivate_fd(vp->fds->tx_fd, vp->tx_irq);
d47761db97d35c Anton Ivanov    2019-08-09  1049  		return NETDEV_TX_BUSY;
d47761db97d35c Anton Ivanov    2019-08-09  1050  	}
d47761db97d35c Anton Ivanov    2019-08-09  1051  
49da7e64f33e80 Anton Ivanov    2017-11-20  1052  	if ((vp->options & VECTOR_TX) == 0) {
49da7e64f33e80 Anton Ivanov    2017-11-20  1053  		writev_tx(vp, skb);
49da7e64f33e80 Anton Ivanov    2017-11-20  1054  		return NETDEV_TX_OK;
49da7e64f33e80 Anton Ivanov    2017-11-20  1055  	}
49da7e64f33e80 Anton Ivanov    2017-11-20  1056  
49da7e64f33e80 Anton Ivanov    2017-11-20  1057  	/* We do BQL only in the vector path, no point doing it in
49da7e64f33e80 Anton Ivanov    2017-11-20  1058  	 * packet at a time mode as there is no device queue
49da7e64f33e80 Anton Ivanov    2017-11-20  1059  	 */
49da7e64f33e80 Anton Ivanov    2017-11-20  1060  
49da7e64f33e80 Anton Ivanov    2017-11-20  1061  	netdev_sent_queue(vp->dev, skb->len);
49da7e64f33e80 Anton Ivanov    2017-11-20  1062  	queue_depth = vector_enqueue(vp->tx_queue, skb);
49da7e64f33e80 Anton Ivanov    2017-11-20  1063  
b35507a4cfb26b Anton Ivanov    2022-01-21  1064  	if (queue_depth < vp->tx_queue->max_depth && netdev_xmit_more()) {
49da7e64f33e80 Anton Ivanov    2017-11-20  1065  		mod_timer(&vp->tl, vp->coalesce);
49da7e64f33e80 Anton Ivanov    2017-11-20  1066  		return NETDEV_TX_OK;
b35507a4cfb26b Anton Ivanov    2022-01-21  1067  	} else {
b35507a4cfb26b Anton Ivanov    2022-01-21  1068  		queue_depth = vector_send(vp->tx_queue);
b35507a4cfb26b Anton Ivanov    2022-01-21  1069  		if (queue_depth > 0)
b35507a4cfb26b Anton Ivanov    2022-01-21  1070  			napi_schedule(&vp->napi);
49da7e64f33e80 Anton Ivanov    2017-11-20  1071  	}
b35507a4cfb26b Anton Ivanov    2022-01-21  1072  
49da7e64f33e80 Anton Ivanov    2017-11-20  1073  	return NETDEV_TX_OK;
49da7e64f33e80 Anton Ivanov    2017-11-20  1074  }
49da7e64f33e80 Anton Ivanov    2017-11-20  1075  
49da7e64f33e80 Anton Ivanov    2017-11-20  1076  static irqreturn_t vector_rx_interrupt(int irq, void *dev_id)
49da7e64f33e80 Anton Ivanov    2017-11-20  1077  {
49da7e64f33e80 Anton Ivanov    2017-11-20  1078  	struct net_device *dev = dev_id;
49da7e64f33e80 Anton Ivanov    2017-11-20  1079  	struct vector_private *vp = netdev_priv(dev);
49da7e64f33e80 Anton Ivanov    2017-11-20  1080  
49da7e64f33e80 Anton Ivanov    2017-11-20  1081  	if (!netif_running(dev))
49da7e64f33e80 Anton Ivanov    2017-11-20  1082  		return IRQ_NONE;
b35507a4cfb26b Anton Ivanov    2022-01-21  1083  	napi_schedule(&vp->napi);
49da7e64f33e80 Anton Ivanov    2017-11-20  1084  	return IRQ_HANDLED;
49da7e64f33e80 Anton Ivanov    2017-11-20  1085  
49da7e64f33e80 Anton Ivanov    2017-11-20  1086  }
49da7e64f33e80 Anton Ivanov    2017-11-20  1087  
49da7e64f33e80 Anton Ivanov    2017-11-20  1088  static irqreturn_t vector_tx_interrupt(int irq, void *dev_id)
49da7e64f33e80 Anton Ivanov    2017-11-20  1089  {
49da7e64f33e80 Anton Ivanov    2017-11-20  1090  	struct net_device *dev = dev_id;
49da7e64f33e80 Anton Ivanov    2017-11-20  1091  	struct vector_private *vp = netdev_priv(dev);
49da7e64f33e80 Anton Ivanov    2017-11-20  1092  
49da7e64f33e80 Anton Ivanov    2017-11-20  1093  	if (!netif_running(dev))
49da7e64f33e80 Anton Ivanov    2017-11-20  1094  		return IRQ_NONE;
49da7e64f33e80 Anton Ivanov    2017-11-20  1095  	/* We need to pay attention to it only if we got
49da7e64f33e80 Anton Ivanov    2017-11-20  1096  	 * -EAGAIN or -ENOBUFFS from sendmmsg. Otherwise
49da7e64f33e80 Anton Ivanov    2017-11-20  1097  	 * we ignore it. In the future, it may be worth
49da7e64f33e80 Anton Ivanov    2017-11-20  1098  	 * it to improve the IRQ controller a bit to make
49da7e64f33e80 Anton Ivanov    2017-11-20  1099  	 * tweaking the IRQ mask less costly
49da7e64f33e80 Anton Ivanov    2017-11-20  1100  	 */
49da7e64f33e80 Anton Ivanov    2017-11-20  1101  
b35507a4cfb26b Anton Ivanov    2022-01-21  1102  	napi_schedule(&vp->napi);
49da7e64f33e80 Anton Ivanov    2017-11-20  1103  	return IRQ_HANDLED;
49da7e64f33e80 Anton Ivanov    2017-11-20  1104  
49da7e64f33e80 Anton Ivanov    2017-11-20  1105  }
49da7e64f33e80 Anton Ivanov    2017-11-20  1106  
49da7e64f33e80 Anton Ivanov    2017-11-20  1107  static int irq_rr;
49da7e64f33e80 Anton Ivanov    2017-11-20  1108  
49da7e64f33e80 Anton Ivanov    2017-11-20  1109  static int vector_net_close(struct net_device *dev)
49da7e64f33e80 Anton Ivanov    2017-11-20  1110  {
49da7e64f33e80 Anton Ivanov    2017-11-20  1111  	struct vector_private *vp = netdev_priv(dev);
49da7e64f33e80 Anton Ivanov    2017-11-20  1112  
49da7e64f33e80 Anton Ivanov    2017-11-20  1113  	netif_stop_queue(dev);
8fa7292fee5c52 Thomas Gleixner 2025-04-05  1114  	timer_delete(&vp->tl);
49da7e64f33e80 Anton Ivanov    2017-11-20  1115  
98ff534ec2cd02 Johannes Berg   2024-07-03  1116  	vp->opened = false;
98ff534ec2cd02 Johannes Berg   2024-07-03  1117  
49da7e64f33e80 Anton Ivanov    2017-11-20  1118  	if (vp->fds == NULL)
49da7e64f33e80 Anton Ivanov    2017-11-20  1119  		return 0;
49da7e64f33e80 Anton Ivanov    2017-11-20  1120  
49da7e64f33e80 Anton Ivanov    2017-11-20  1121  	/* Disable and free all IRQS */
49da7e64f33e80 Anton Ivanov    2017-11-20  1122  	if (vp->rx_irq > 0) {
49da7e64f33e80 Anton Ivanov    2017-11-20  1123  		um_free_irq(vp->rx_irq, dev);
49da7e64f33e80 Anton Ivanov    2017-11-20  1124  		vp->rx_irq = 0;
49da7e64f33e80 Anton Ivanov    2017-11-20  1125  	}
49da7e64f33e80 Anton Ivanov    2017-11-20  1126  	if (vp->tx_irq > 0) {
49da7e64f33e80 Anton Ivanov    2017-11-20  1127  		um_free_irq(vp->tx_irq, dev);
49da7e64f33e80 Anton Ivanov    2017-11-20  1128  		vp->tx_irq = 0;
49da7e64f33e80 Anton Ivanov    2017-11-20  1129  	}
b35507a4cfb26b Anton Ivanov    2022-01-21  1130  	napi_disable(&vp->napi);
b35507a4cfb26b Anton Ivanov    2022-01-21  1131  	netif_napi_del(&vp->napi);
49da7e64f33e80 Anton Ivanov    2017-11-20  1132  	if (vp->fds->rx_fd > 0) {
9807019a62dc67 Anton Ivanov    2019-10-02  1133  		if (vp->bpf)
9807019a62dc67 Anton Ivanov    2019-10-02  1134  			uml_vector_detach_bpf(vp->fds->rx_fd, vp->bpf);
49da7e64f33e80 Anton Ivanov    2017-11-20  1135  		os_close_file(vp->fds->rx_fd);
49da7e64f33e80 Anton Ivanov    2017-11-20  1136  		vp->fds->rx_fd = -1;
49da7e64f33e80 Anton Ivanov    2017-11-20  1137  	}
49da7e64f33e80 Anton Ivanov    2017-11-20  1138  	if (vp->fds->tx_fd > 0) {
49da7e64f33e80 Anton Ivanov    2017-11-20  1139  		os_close_file(vp->fds->tx_fd);
49da7e64f33e80 Anton Ivanov    2017-11-20  1140  		vp->fds->tx_fd = -1;
49da7e64f33e80 Anton Ivanov    2017-11-20  1141  	}
9807019a62dc67 Anton Ivanov    2019-10-02  1142  	if (vp->bpf != NULL)
9807019a62dc67 Anton Ivanov    2019-10-02 @1143  		kfree(vp->bpf->filter);
49da7e64f33e80 Anton Ivanov    2017-11-20  1144  	kfree(vp->bpf);
9807019a62dc67 Anton Ivanov    2019-10-02  1145  	vp->bpf = NULL;
49da7e64f33e80 Anton Ivanov    2017-11-20  1146  	kfree(vp->fds->remote_addr);
49da7e64f33e80 Anton Ivanov    2017-11-20  1147  	kfree(vp->transport_data);
49da7e64f33e80 Anton Ivanov    2017-11-20  1148  	kfree(vp->header_rxbuffer);
49da7e64f33e80 Anton Ivanov    2017-11-20  1149  	kfree(vp->header_txbuffer);
49da7e64f33e80 Anton Ivanov    2017-11-20  1150  	if (vp->rx_queue != NULL)
49da7e64f33e80 Anton Ivanov    2017-11-20  1151  		destroy_queue(vp->rx_queue);
49da7e64f33e80 Anton Ivanov    2017-11-20  1152  	if (vp->tx_queue != NULL)
49da7e64f33e80 Anton Ivanov    2017-11-20  1153  		destroy_queue(vp->tx_queue);
49da7e64f33e80 Anton Ivanov    2017-11-20  1154  	kfree(vp->fds);
49da7e64f33e80 Anton Ivanov    2017-11-20  1155  	vp->fds = NULL;
d47761db97d35c Anton Ivanov    2019-08-09  1156  	vp->in_error = false;
49da7e64f33e80 Anton Ivanov    2017-11-20  1157  	return 0;
49da7e64f33e80 Anton Ivanov    2017-11-20  1158  }
49da7e64f33e80 Anton Ivanov    2017-11-20  1159  

:::::: The code at line 989 was first introduced by commit
:::::: 49da7e64f33e80edffb1a9eeb230fa4c3f42dffb High Performance UML Vector Network Driver

:::::: TO: Anton Ivanov <anton.ivanov@...bridgegreys.com>
:::::: CC: Richard Weinberger <richard@....at>

-- 
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki

Powered by blists - more mailing lists

Powered by Openwall GNU/*/Linux Powered by OpenVZ