Re: [PATCH net-next v1 3/6] virtio_net: support device stats

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hi Xuan,

kernel test robot noticed the following build warnings:

[auto build test WARNING on mst-vhost/linux-next]
[also build test WARNING on linus/master v6.7-rc8]
[cannot apply to net-next/main horms-ipvs/master next-20231222]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch#_base_tree_information]

url:    https://github.com/intel-lab-lkp/linux/commits/Xuan-Zhuo/virtio_net-introduce-device-stats-feature-and-structures/20231226-153227
base:   https://git.kernel.org/pub/scm/linux/kernel/git/mst/vhost.git linux-next
patch link:    https://lore.kernel.org/r/20231226073103.116153-4-xuanzhuo%40linux.alibaba.com
patch subject: [PATCH net-next v1 3/6] virtio_net: support device stats
config: x86_64-randconfig-121-20240101 (https://download.01.org/0day-ci/archive/20240102/202401020308.rvzTx1oI-lkp@xxxxxxxxx/config)
compiler: gcc-7 (Ubuntu 7.5.0-6ubuntu2) 7.5.0
reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20240102/202401020308.rvzTx1oI-lkp@xxxxxxxxx/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@xxxxxxxxx>
| Closes: https://lore.kernel.org/oe-kbuild-all/202401020308.rvzTx1oI-lkp@xxxxxxxxx/

sparse warnings: (new ones prefixed by >>)
>> drivers/net/virtio_net.c:3432:52: sparse: sparse: incorrect type in argument 2 (different base types) @@     expected restricted __virtio16 [usertype] val @@     got restricted __le16 [usertype] vq_index @@
   drivers/net/virtio_net.c:3432:52: sparse:     expected restricted __virtio16 [usertype] val
   drivers/net/virtio_net.c:3432:52: sparse:     got restricted __le16 [usertype] vq_index
   drivers/net/virtio_net.c:3457:83: sparse: sparse: incorrect type in argument 2 (different base types) @@     expected restricted __virtio64 [usertype] val @@     got unsigned long long [usertype] @@
   drivers/net/virtio_net.c:3457:83: sparse:     expected restricted __virtio64 [usertype] val
   drivers/net/virtio_net.c:3457:83: sparse:     got unsigned long long [usertype]
>> drivers/net/virtio_net.c:3429:81: sparse: sparse: incorrect type in argument 2 (different base types) @@     expected restricted __virtio16 [usertype] val @@     got restricted __le16 [usertype] size @@
   drivers/net/virtio_net.c:3429:81: sparse:     expected restricted __virtio16 [usertype] val
   drivers/net/virtio_net.c:3429:81: sparse:     got restricted __le16 [usertype] size
>> drivers/net/virtio_net.c:3519:82: sparse: sparse: incorrect type in argument 2 (different base types) @@     expected restricted __virtio64 [usertype] val @@     got restricted __le64 [assigned] [usertype] v @@
   drivers/net/virtio_net.c:3519:82: sparse:     expected restricted __virtio64 [usertype] val
   drivers/net/virtio_net.c:3519:82: sparse:     got restricted __le64 [assigned] [usertype] v

vim +3432 drivers/net/virtio_net.c

  3352	
  3353	static int virtnet_get_hw_stats(struct virtnet_info *vi,
  3354					struct virtnet_stats_ctx *ctx)
  3355	{
  3356		struct virtio_net_ctrl_queue_stats *req;
  3357		struct virtio_net_stats_reply_hdr *hdr;
  3358		struct scatterlist sgs_in, sgs_out;
  3359		u32 num_rx, num_tx, num_cq, offset;
  3360		int qnum, i, j,  qid, res_size;
  3361		struct virtnet_stats_map *m;
  3362		void *reply, *p;
  3363		u64 bitmap;
  3364		int ok;
  3365		u64 *v;
  3366	
  3367		if (!virtio_has_feature(vi->vdev, VIRTIO_NET_F_DEVICE_STATS))
  3368			return 0;
  3369	
  3370		qnum = 0;
  3371		if (ctx->bitmap_cq)
  3372			qnum += 1;
  3373	
  3374		if (ctx->bitmap_rx)
  3375			qnum += vi->curr_queue_pairs;
  3376	
  3377		if (ctx->bitmap_tx)
  3378			qnum += vi->curr_queue_pairs;
  3379	
  3380		req = kcalloc(qnum, sizeof(*req), GFP_KERNEL);
  3381		if (!req)
  3382			return -ENOMEM;
  3383	
  3384		res_size = (ctx->size_rx + ctx->size_tx) * vi->curr_queue_pairs + ctx->size_cq;
  3385		reply = kmalloc(res_size, GFP_KERNEL);
  3386		if (!reply) {
  3387			kfree(req);
  3388			return -ENOMEM;
  3389		}
  3390	
  3391		j = 0;
  3392		for (i = 0; i < vi->curr_queue_pairs; ++i) {
  3393			if (ctx->bitmap_rx) {
  3394				req->stats[j].vq_index = cpu_to_le16(i * 2);
  3395				req->stats[j].types_bitmap[0] = cpu_to_le64(ctx->bitmap_rx);
  3396				++j;
  3397			}
  3398	
  3399			if (ctx->bitmap_tx) {
  3400				req->stats[j].vq_index = cpu_to_le16(i * 2 + 1);
  3401				req->stats[j].types_bitmap[0] = cpu_to_le64(ctx->bitmap_tx);
  3402				++j;
  3403			}
  3404		}
  3405	
  3406		if (ctx->size_cq) {
  3407			req->stats[j].vq_index = cpu_to_le16(vi->max_queue_pairs * 2);
  3408			req->stats[j].types_bitmap[0] = cpu_to_le64(ctx->bitmap_cq);
  3409			++j;
  3410		}
  3411	
  3412		sg_init_one(&sgs_out, req, sizeof(*req) * j);
  3413		sg_init_one(&sgs_in, reply, res_size);
  3414	
  3415		ok = virtnet_send_command(vi, VIRTIO_NET_CTRL_STATS,
  3416					  VIRTIO_NET_CTRL_STATS_GET,
  3417					  &sgs_out, &sgs_in);
  3418		kfree(req);
  3419	
  3420		if (!ok) {
  3421			kfree(reply);
  3422			return ok;
  3423		}
  3424	
  3425		num_rx = VIRTNET_RQ_STATS_LEN + ctx->num_rx;
  3426		num_tx = VIRTNET_SQ_STATS_LEN + ctx->num_tx;
  3427		num_cq = ctx->num_tx;
  3428	
> 3429		for (p = reply; p - reply < res_size; p += virtio16_to_cpu(vi->vdev, hdr->size)) {
  3430			hdr = p;
  3431	
> 3432			qid = virtio16_to_cpu(vi->vdev, hdr->vq_index);
  3433	
  3434			if (qid == vi->max_queue_pairs * 2) {
  3435				offset = 0;
  3436				bitmap = ctx->bitmap_cq;
  3437			} else if (qid % 2) {
  3438				offset = num_cq + num_rx * vi->curr_queue_pairs + num_tx * (qid / 2);
  3439				offset += VIRTNET_SQ_STATS_LEN;
  3440				bitmap = ctx->bitmap_tx;
  3441			} else {
  3442				offset = num_cq + num_rx * (qid / 2) + VIRTNET_RQ_STATS_LEN;
  3443				bitmap = ctx->bitmap_rx;
  3444			}
  3445	
  3446			for (i = 0; i < ARRAY_SIZE(virtio_net_stats_map); ++i) {
  3447				m = &virtio_net_stats_map[i];
  3448	
  3449				if (m->flag & bitmap)
  3450					offset += m->num;
  3451	
  3452				if (hdr->type != m->type)
  3453					continue;
  3454	
  3455				for (j = 0; j < m->num; ++j) {
  3456					v = p + m->desc[j].offset;
  3457					ctx->data[offset + j] = virtio64_to_cpu(vi->vdev, *v);
  3458				}
  3459	
  3460				break;
  3461			}
  3462		}
  3463	
  3464		kfree(reply);
  3465		return 0;
  3466	}
  3467	
  3468	static void virtnet_get_strings(struct net_device *dev, u32 stringset, u8 *data)
  3469	{
  3470		struct virtnet_info *vi = netdev_priv(dev);
  3471		unsigned int i, j;
  3472		u8 *p = data;
  3473	
  3474		switch (stringset) {
  3475		case ETH_SS_STATS:
  3476			virtnet_get_hw_stats_string(vi, VIRTNET_STATS_Q_TYPE_CQ, 0, &p);
  3477	
  3478			for (i = 0; i < vi->curr_queue_pairs; i++) {
  3479				for (j = 0; j < VIRTNET_RQ_STATS_LEN; j++)
  3480					ethtool_sprintf(&p, "rx_queue_%u_%s", i,
  3481							virtnet_rq_stats_desc[j].desc);
  3482	
  3483				virtnet_get_hw_stats_string(vi, VIRTNET_STATS_Q_TYPE_RX, i, &p);
  3484			}
  3485	
  3486			for (i = 0; i < vi->curr_queue_pairs; i++) {
  3487				for (j = 0; j < VIRTNET_SQ_STATS_LEN; j++)
  3488					ethtool_sprintf(&p, "tx_queue_%u_%s", i,
  3489							virtnet_sq_stats_desc[j].desc);
  3490	
  3491				virtnet_get_hw_stats_string(vi, VIRTNET_STATS_Q_TYPE_TX, i, &p);
  3492			}
  3493			break;
  3494		}
  3495	}
  3496	
  3497	static int virtnet_get_sset_count(struct net_device *dev, int sset)
  3498	{
  3499		struct virtnet_info *vi = netdev_priv(dev);
  3500		struct virtnet_stats_ctx ctx = {0};
  3501		u32 pair_count;
  3502	
  3503		switch (sset) {
  3504		case ETH_SS_STATS:
  3505			if (virtio_has_feature(vi->vdev, VIRTIO_NET_F_DEVICE_STATS) &&
  3506			    !vi->device_stats_cap) {
  3507				struct scatterlist sg;
  3508	
  3509				sg_init_one(&sg, &vi->ctrl->stats_cap, sizeof(vi->ctrl->stats_cap));
  3510	
  3511				if (!virtnet_send_command(vi, VIRTIO_NET_CTRL_STATS,
  3512							  VIRTIO_NET_CTRL_STATS_QUERY,
  3513							  NULL, &sg)) {
  3514					dev_warn(&dev->dev, "Fail to get stats capability\n");
  3515				} else {
  3516					__le64 v;
  3517	
  3518					v = vi->ctrl->stats_cap.supported_stats_types[0];
> 3519					vi->device_stats_cap = virtio64_to_cpu(vi->vdev, v);
  3520				}
  3521			}
  3522	
  3523			virtnet_stats_ctx_init(vi, &ctx, NULL);
  3524	
  3525			pair_count = VIRTNET_RQ_STATS_LEN + VIRTNET_SQ_STATS_LEN;
  3526			pair_count += ctx.num_rx + ctx.num_tx;
  3527	
  3528			return ctx.num_cq + vi->curr_queue_pairs * pair_count;
  3529		default:
  3530			return -EOPNOTSUPP;
  3531		}
  3532	}
  3533	

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




[Index of Archives]     [KVM Development]     [Libvirt Development]     [Libvirt Users]     [CentOS Virtualization]     [Netdev]     [Ethernet Bridging]     [Linux Wireless]     [Kernel Newbies]     [Security]     [Linux for Hams]     [Netfilter]     [Bugtraq]     [Yosemite Forum]     [MIPS Linux]     [ARM Linux]     [Linux RAID]     [Linux Admin]     [Samba]

  Powered by Linux