[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <2c7d53d8-7d54-40cc-8125-9ba5386d79f1@linux.dev>
Date: Tue, 2 Jan 2024 17:45:31 +0800
From: Zhu Yanjun <yanjun.zhu@...ux.dev>
To: kernel test robot <lkp@...el.com>, Xuan Zhuo
<xuanzhuo@...ux.alibaba.com>, netdev@...r.kernel.org
Cc: oe-kbuild-all@...ts.linux.dev, "Michael S. Tsirkin" <mst@...hat.com>,
Jason Wang <jasowang@...hat.com>, Eric Dumazet <edumazet@...gle.com>,
Jakub Kicinski <kuba@...nel.org>, Paolo Abeni <pabeni@...hat.com>,
virtualization@...ts.linux.dev
Subject: Re: [PATCH net-next v1 3/6] virtio_net: support device stats
在 2024/1/2 3:56, kernel test robot 写道:
> 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@intel.com/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@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/202401020308.rvzTx1oI-lkp@intel.com/
>
> 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
I can reproduce these warnings in the local host.
It seems that the followings can fix these warnings.
"
diff --git a/drivers/net/virtio_net.c b/drivers/net/virtio_net.c
index 1f4d9605552f..62e40234e29c 100644
--- a/drivers/net/virtio_net.c
+++ b/drivers/net/virtio_net.c
@@ -3426,10 +3426,10 @@ static int virtnet_get_hw_stats(struct
virtnet_info *vi,
num_tx = VIRTNET_SQ_STATS_LEN + ctx->num_tx;
num_cq = ctx->num_tx;
- for (p = reply; p - reply < res_size; p +=
virtio16_to_cpu(vi->vdev, hdr->size)) {
+ for (p = reply; p - reply < res_size; p +=
virtio16_to_cpu(vi->vdev, (__virtio16 __force)hdr->size)) {
hdr = p;
- qid = virtio16_to_cpu(vi->vdev, hdr->vq_index);
+ qid = virtio16_to_cpu(vi->vdev, (__virtio16
__force)(hdr->vq_index));
if (qid == vi->max_queue_pairs * 2) {
offset = 0;
@@ -3454,7 +3454,7 @@ static int virtnet_get_hw_stats(struct
virtnet_info *vi,
for (j = 0; j < m->num; ++j) {
v = p + m->desc[j].offset;
- ctx->data[offset + j] =
virtio64_to_cpu(vi->vdev, *v);
+ ctx->data[offset + j] =
virtio64_to_cpu(vi->vdev, (__virtio64 __force)*v);
}
break;
@@ -3516,7 +3516,7 @@ static int virtnet_get_sset_count(struct
net_device *dev, int sset)
__le64 v;
v =
vi->ctrl->stats_cap.supported_stats_types[0];
- vi->device_stats_cap =
virtio64_to_cpu(vi->vdev, v);
+ vi->device_stats_cap =
virtio64_to_cpu(vi->vdev, (__virtio64 __force)v);
}
}
"
Not sure whether the above diff are good to the whole commit or not.
Zhu Yanjun
>
> 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
>
Powered by blists - more mailing lists