* [bug report] drm/amdkfd: Extend KFD device topology to surface peer-to-peer links
@ 2022-06-24 7:01 Dan Carpenter
0 siblings, 0 replies; only message in thread
From: Dan Carpenter @ 2022-06-24 7:01 UTC (permalink / raw)
To: Ramesh.Errabolu; +Cc: amd-gfx
Hello Ramesh Errabolu,
The patch 0f28cca87e9a: "drm/amdkfd: Extend KFD device topology to
surface peer-to-peer links" from May 26, 2022, leads to the following
Smatch static checker warning:
drivers/gpu/drm/amd/amdgpu/../amdkfd/kfd_topology.c:1428 kfd_create_indirect_link_prop() warn: iterator used outside loop: 'cpu_link'
drivers/gpu/drm/amd/amdgpu/../amdkfd/kfd_topology.c:1462 kfd_create_indirect_link_prop() error: we previously assumed 'cpu_dev' could be null (see line 1420)
drivers/gpu/drm/amd/amdgpu/../amdkfd/kfd_topology.c:1516 kfd_add_peer_prop() warn: iterator used outside loop: 'iolink3'
drivers/gpu/drm/amd/amdgpu/../display/amdgpu_dm/amdgpu_dm.c:4997 add_modifier() warn: use safer allocation function (eg: kmalloc_array)
drivers/gpu/drm/amd/amdgpu/../display/dc/bios/bios_parser2.c:1601 bios_parser_is_device_id_supported() warn: inconsistent indenting
drivers/gpu/drm/amd/amdgpu/../display/dc/bios/bios_parser2.c:407 get_bios_object_from_path_v3() warn: inconsistent indenting
drivers/gpu/drm/amd/amdgpu/../display/dc/bios/bios_parser2.c:613 bios_parser_get_hpd_info() warn: inconsistent indenting
drivers/gpu/drm/amd/amdgpu/../display/dc/bios/bios_parser2.c:820 bios_parser_get_device_tag() warn: inconsistent indenting
drivers/gpu/drm/amd/amdgpu/../display/dc/core/dc.c:3151 commit_planes_for_stream() warn: inconsistent indenting
drivers/gpu/drm/amd/amdgpu/../display/dc/core/dc_stream.c:395 dc_stream_set_cursor_position() warn: variable dereferenced before check 'stream' (see line 392)
drivers/gpu/drm/amd/amdgpu/../pm/swsmu/amdgpu_smu.c:140 smu_set_gfx_power_up_by_imu() error: we previously assumed 'smu->ppt_funcs' could be null (see line 140)
drivers/gpu/drm/amd/amdgpu/../amdkfd/kfd_topology.c
1393 static int kfd_create_indirect_link_prop(struct kfd_topology_device *kdev, int gpu_node)
1394 {
1395 struct kfd_iolink_properties *props = NULL, *props2 = NULL;
1396 struct kfd_iolink_properties *gpu_link, *cpu_link;
1397 struct kfd_topology_device *cpu_dev;
1398 int ret = 0;
1399 int i, num_cpu;
1400
1401 num_cpu = 0;
1402 list_for_each_entry(cpu_dev, &topology_device_list, list) {
1403 if (cpu_dev->gpu)
1404 break;
1405 num_cpu++;
1406 }
1407
1408 gpu_link = list_first_entry(&kdev->io_link_props,
1409 struct kfd_iolink_properties, list);
1410 if (!gpu_link)
1411 return -ENOMEM;
1412
1413 for (i = 0; i < num_cpu; i++) {
1414 /* CPU <--> GPU */
1415 if (gpu_link->node_to == i)
1416 continue;
1417
1418 /* find CPU <--> CPU links */
1419 cpu_dev = kfd_topology_device_by_proximity_domain(i);
1420 if (cpu_dev) {
1421 list_for_each_entry(cpu_link,
1422 &cpu_dev->io_link_props, list) {
1423 if (cpu_link->node_to == gpu_link->node_to)
1424 break;
1425 }
If we exit the loop without hitting the break statement then "cpu_link"
is not a valid pointer.
1426 }
1427
--> 1428 if (cpu_link->node_to != gpu_link->node_to)
It's weird that this doesn't trigger an uninitialized variable warning.
1429 return -ENOMEM;
1430
1431 /* CPU <--> CPU <--> GPU, GPU node*/
1432 props = kfd_alloc_struct(props);
1433 if (!props)
1434 return -ENOMEM;
1435
1436 memcpy(props, gpu_link, sizeof(struct kfd_iolink_properties));
1437 props->weight = gpu_link->weight + cpu_link->weight;
1438 props->min_latency = gpu_link->min_latency + cpu_link->min_latency;
1439 props->max_latency = gpu_link->max_latency + cpu_link->max_latency;
1440 props->min_bandwidth = min(gpu_link->min_bandwidth, cpu_link->min_bandwidth);
1441 props->max_bandwidth = min(gpu_link->max_bandwidth, cpu_link->max_bandwidth);
1442
1443 props->node_from = gpu_node;
1444 props->node_to = i;
1445 kdev->node_props.p2p_links_count++;
1446 list_add_tail(&props->list, &kdev->p2p_link_props);
1447 ret = kfd_build_p2p_node_entry(kdev, props);
1448 if (ret < 0)
1449 return ret;
1450
1451 /* for small Bar, no CPU --> GPU in-direct links */
1452 if (kfd_dev_is_large_bar(kdev->gpu)) {
1453 /* CPU <--> CPU <--> GPU, CPU node*/
1454 props2 = kfd_alloc_struct(props2);
1455 if (!props2)
1456 return -ENOMEM;
1457
1458 memcpy(props2, props, sizeof(struct kfd_iolink_properties));
1459 props2->node_from = i;
1460 props2->node_to = gpu_node;
1461 props2->kobj = NULL;
1462 cpu_dev->node_props.p2p_links_count++;
If you fix the exit condition above then probably this warning will go
away too?
1463 list_add_tail(&props2->list, &cpu_dev->p2p_link_props);
1464 ret = kfd_build_p2p_node_entry(cpu_dev, props2);
1465 if (ret < 0)
1466 return ret;
1467 }
1468 }
1469 return ret;
1470 }
regards,
dan carpenter
^ permalink raw reply [flat|nested] only message in thread
only message in thread, other threads:[~2022-06-24 7:02 UTC | newest]
Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2022-06-24 7:01 [bug report] drm/amdkfd: Extend KFD device topology to surface peer-to-peer links Dan Carpenter
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.