func: static int virtnet_receive(struct receive_queue *rq, int budget) struct virtnet_info * vi = rq -> vq -> vdev -> priv ; unsigned int len , received = 0 ; void * buf ; while ( received < budget && ( buf = virtqueue_get_buf ( rq -> vq , & len ) ) != NULL )  receive_buf ( vi , rq , buf , len ); received ++; static void receive_buf(struct virtnet_info *vi, struct receive_queue void *buf, unsigned int len) struct net_device * dev = vi -> dev ; struct sk_buff * skb ; if ( unlikely ( len < vi -> hdr_len + ETH_HLEN ) )  if ( vi -> mergeable_rx_bufs )  if ( vi -> big_packets )  skb = receive_big ( dev , vi , rq , buf , len ); static struct sk_buff *receive_big(struct net_device struct virtnet_info struct receive_queue void unsigned int len) struct page * page = buf ; struct sk_buff * skb = page_to_skb ( vi , rq , page , 0 , len , PAGE_SIZE ) ; static struct sk_buff *page_to_skb(struct virtnet_info struct receive_queue struct page *page, unsigned int unsigned int len, unsigned int truesize) struct sk_buff * skb ; struct virtio_net_hdr_mrg_rxbuf * hdr ; unsigned int copy , hdr_len , hdr_padded_len ; char * p ; p = page_address ( page ) + offset; skb = netdev_alloc_skb_ip_align ( vi -> dev , GOOD_COPY_LEN ); if ( unlikely ( ! skb ) )  hdr = skb_vnet_hdr ( skb ); hdr_len = vi -> hdr_len; memcpy ( hdr , p , hdr_len ); 