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