Messages in this thread | | | Date | Fri, 26 Jun 2020 07:37:07 +0800 | From | kernel test robot <> | Subject | Re: [PATCH 3/3] hv_netvsc: Use vmbus_requestor to generate transaction IDs for VMBus hardening |
| |
Hi Andres,
Thank you for the patch! Perhaps something to improve:
[auto build test WARNING on next-20200625] [also build test WARNING on v5.8-rc2] [cannot apply to mkp-scsi/for-next scsi/for-next linux/master linus/master v5.8-rc2 v5.8-rc1 v5.7] [If your patch is applied to the wrong git tree, kindly drop us a note. And when submitting patch, we suggest to use as documented in https://git-scm.com/docs/git-format-patch]
url: https://github.com/0day-ci/linux/commits/Andres-Beltran/Drivers-hv-vmbus-vmbus_requestor-data-structure/20200625-234113 base: 3f9437c6234d95d96967f1b438a4fb71b6be254d config: i386-allyesconfig (attached as .config) compiler: gcc-9 (Debian 9.3.0-13) 9.3.0 reproduce (this is a W=1 build): # save the attached .config to linux build tree make W=1 ARCH=i386
If you fix the issue, kindly add following tag as appropriate Reported-by: kernel test robot <lkp@intel.com>
All warnings (new ones prefixed by >>):
drivers/net/hyperv/netvsc.c: In function 'netvsc_init_buf': >> drivers/net/hyperv/netvsc.c:354:63: warning: cast from pointer to integer of different size [-Wpointer-to-int-cast] 354 | rqst_id = vmbus_next_request_id(&device->channel->requestor, (u64)init_packet); | ^ drivers/net/hyperv/netvsc.c:444:63: warning: cast from pointer to integer of different size [-Wpointer-to-int-cast] 444 | rqst_id = vmbus_next_request_id(&device->channel->requestor, (u64)init_packet); | ^ drivers/net/hyperv/netvsc.c: In function 'negotiate_nvsp_ver': drivers/net/hyperv/netvsc.c:524:63: warning: cast from pointer to integer of different size [-Wpointer-to-int-cast] 524 | rqst_id = vmbus_next_request_id(&device->channel->requestor, (u64)init_packet); | ^ drivers/net/hyperv/netvsc.c: In function 'netvsc_send_tx_complete': >> drivers/net/hyperv/netvsc.c:722:8: warning: cast to pointer from integer of different size [-Wint-to-pointer-cast] 722 | skb = (struct sk_buff *)cmd_rqst; | ^ drivers/net/hyperv/netvsc.c: In function 'netvsc_send_pkt': drivers/net/hyperv/netvsc.c:883:59: warning: cast from pointer to integer of different size [-Wpointer-to-int-cast] 883 | rqst_id = vmbus_next_request_id(&out_channel->requestor, (u64)skb); | ^
vim +354 drivers/net/hyperv/netvsc.c
296 297 static int netvsc_init_buf(struct hv_device *device, 298 struct netvsc_device *net_device, 299 const struct netvsc_device_info *device_info) 300 { 301 struct nvsp_1_message_send_receive_buffer_complete *resp; 302 struct net_device *ndev = hv_get_drvdata(device); 303 struct nvsp_message *init_packet; 304 unsigned int buf_size; 305 size_t map_words; 306 int ret = 0; 307 u64 rqst_id; 308 309 /* Get receive buffer area. */ 310 buf_size = device_info->recv_sections * device_info->recv_section_size; 311 buf_size = roundup(buf_size, PAGE_SIZE); 312 313 /* Legacy hosts only allow smaller receive buffer */ 314 if (net_device->nvsp_version <= NVSP_PROTOCOL_VERSION_2) 315 buf_size = min_t(unsigned int, buf_size, 316 NETVSC_RECEIVE_BUFFER_SIZE_LEGACY); 317 318 net_device->recv_buf = vzalloc(buf_size); 319 if (!net_device->recv_buf) { 320 netdev_err(ndev, 321 "unable to allocate receive buffer of size %u\n", 322 buf_size); 323 ret = -ENOMEM; 324 goto cleanup; 325 } 326 327 net_device->recv_buf_size = buf_size; 328 329 /* 330 * Establish the gpadl handle for this buffer on this 331 * channel. Note: This call uses the vmbus connection rather 332 * than the channel to establish the gpadl handle. 333 */ 334 ret = vmbus_establish_gpadl(device->channel, net_device->recv_buf, 335 buf_size, 336 &net_device->recv_buf_gpadl_handle); 337 if (ret != 0) { 338 netdev_err(ndev, 339 "unable to establish receive buffer's gpadl\n"); 340 goto cleanup; 341 } 342 343 /* Notify the NetVsp of the gpadl handle */ 344 init_packet = &net_device->channel_init_pkt; 345 memset(init_packet, 0, sizeof(struct nvsp_message)); 346 init_packet->hdr.msg_type = NVSP_MSG1_TYPE_SEND_RECV_BUF; 347 init_packet->msg.v1_msg.send_recv_buf. 348 gpadl_handle = net_device->recv_buf_gpadl_handle; 349 init_packet->msg.v1_msg. 350 send_recv_buf.id = NETVSC_RECEIVE_BUFFER_ID; 351 352 trace_nvsp_send(ndev, init_packet); 353 > 354 rqst_id = vmbus_next_request_id(&device->channel->requestor, (u64)init_packet); 355 if (rqst_id == VMBUS_RQST_ERROR) { 356 netdev_err(ndev, "No request id available\n"); 357 goto cleanup; 358 } 359 360 /* Send the gpadl notification request */ 361 ret = vmbus_sendpacket(device->channel, init_packet, 362 sizeof(struct nvsp_message), 363 rqst_id, 364 VM_PKT_DATA_INBAND, 365 VMBUS_DATA_PACKET_FLAG_COMPLETION_REQUESTED); 366 if (ret != 0) { 367 /* Reclaim request ID to avoid leak of IDs */ 368 vmbus_request_addr(&device->channel->requestor, rqst_id); 369 netdev_err(ndev, 370 "unable to send receive buffer's gpadl to netvsp\n"); 371 goto cleanup; 372 } 373 374 wait_for_completion(&net_device->channel_init_wait); 375 376 /* Check the response */ 377 resp = &init_packet->msg.v1_msg.send_recv_buf_complete; 378 if (resp->status != NVSP_STAT_SUCCESS) { 379 netdev_err(ndev, 380 "Unable to complete receive buffer initialization with NetVsp - status %d\n", 381 resp->status); 382 ret = -EINVAL; 383 goto cleanup; 384 } 385 386 /* Parse the response */ 387 netdev_dbg(ndev, "Receive sections: %u sub_allocs: size %u count: %u\n", 388 resp->num_sections, resp->sections[0].sub_alloc_size, 389 resp->sections[0].num_sub_allocs); 390 391 /* There should only be one section for the entire receive buffer */ 392 if (resp->num_sections != 1 || resp->sections[0].offset != 0) { 393 ret = -EINVAL; 394 goto cleanup; 395 } 396 397 net_device->recv_section_size = resp->sections[0].sub_alloc_size; 398 net_device->recv_section_cnt = resp->sections[0].num_sub_allocs; 399 400 /* Setup receive completion ring. 401 * Add 1 to the recv_section_cnt because at least one entry in a 402 * ring buffer has to be empty. 403 */ 404 net_device->recv_completion_cnt = net_device->recv_section_cnt + 1; 405 ret = netvsc_alloc_recv_comp_ring(net_device, 0); 406 if (ret) 407 goto cleanup; 408 409 /* Now setup the send buffer. */ 410 buf_size = device_info->send_sections * device_info->send_section_size; 411 buf_size = round_up(buf_size, PAGE_SIZE); 412 413 net_device->send_buf = vzalloc(buf_size); 414 if (!net_device->send_buf) { 415 netdev_err(ndev, "unable to allocate send buffer of size %u\n", 416 buf_size); 417 ret = -ENOMEM; 418 goto cleanup; 419 } 420 421 /* Establish the gpadl handle for this buffer on this 422 * channel. Note: This call uses the vmbus connection rather 423 * than the channel to establish the gpadl handle. 424 */ 425 ret = vmbus_establish_gpadl(device->channel, net_device->send_buf, 426 buf_size, 427 &net_device->send_buf_gpadl_handle); 428 if (ret != 0) { 429 netdev_err(ndev, 430 "unable to establish send buffer's gpadl\n"); 431 goto cleanup; 432 } 433 434 /* Notify the NetVsp of the gpadl handle */ 435 init_packet = &net_device->channel_init_pkt; 436 memset(init_packet, 0, sizeof(struct nvsp_message)); 437 init_packet->hdr.msg_type = NVSP_MSG1_TYPE_SEND_SEND_BUF; 438 init_packet->msg.v1_msg.send_send_buf.gpadl_handle = 439 net_device->send_buf_gpadl_handle; 440 init_packet->msg.v1_msg.send_send_buf.id = NETVSC_SEND_BUFFER_ID; 441 442 trace_nvsp_send(ndev, init_packet); 443 444 rqst_id = vmbus_next_request_id(&device->channel->requestor, (u64)init_packet); 445 if (rqst_id == VMBUS_RQST_ERROR) { 446 netdev_err(ndev, "No request id available\n"); 447 goto cleanup; 448 } 449 450 /* Send the gpadl notification request */ 451 ret = vmbus_sendpacket(device->channel, init_packet, 452 sizeof(struct nvsp_message), 453 rqst_id, 454 VM_PKT_DATA_INBAND, 455 VMBUS_DATA_PACKET_FLAG_COMPLETION_REQUESTED); 456 if (ret != 0) { 457 /* Reclaim request ID to avoid leak of IDs */ 458 vmbus_request_addr(&device->channel->requestor, rqst_id); 459 netdev_err(ndev, 460 "unable to send send buffer's gpadl to netvsp\n"); 461 goto cleanup; 462 } 463 464 wait_for_completion(&net_device->channel_init_wait); 465 466 /* Check the response */ 467 if (init_packet->msg.v1_msg. 468 send_send_buf_complete.status != NVSP_STAT_SUCCESS) { 469 netdev_err(ndev, "Unable to complete send buffer " 470 "initialization with NetVsp - status %d\n", 471 init_packet->msg.v1_msg. 472 send_send_buf_complete.status); 473 ret = -EINVAL; 474 goto cleanup; 475 } 476 477 /* Parse the response */ 478 net_device->send_section_size = init_packet->msg. 479 v1_msg.send_send_buf_complete.section_size; 480 481 /* Section count is simply the size divided by the section size. */ 482 net_device->send_section_cnt = buf_size / net_device->send_section_size; 483 484 netdev_dbg(ndev, "Send section size: %d, Section count:%d\n", 485 net_device->send_section_size, net_device->send_section_cnt); 486 487 /* Setup state for managing the send buffer. */ 488 map_words = DIV_ROUND_UP(net_device->send_section_cnt, BITS_PER_LONG); 489 490 net_device->send_section_map = kcalloc(map_words, sizeof(ulong), GFP_KERNEL); 491 if (net_device->send_section_map == NULL) { 492 ret = -ENOMEM; 493 goto cleanup; 494 } 495 496 goto exit; 497 498 cleanup: 499 netvsc_revoke_recv_buf(device, net_device, ndev); 500 netvsc_revoke_send_buf(device, net_device, ndev); 501 netvsc_teardown_recv_gpadl(device, net_device, ndev); 502 netvsc_teardown_send_gpadl(device, net_device, ndev); 503 504 exit: 505 return ret; 506 } 507
--- 0-DAY CI Kernel Test Service, Intel Corporation https://lists.01.org/hyperkitty/list/kbuild-all@lists.01.org [unhandled content-type:application/gzip] | |