From 1dd9ca9df454702df110f61324184772f00c6d5a Mon Sep 17 00:00:00 2001 From: Charis Poag Date: Thu, 20 Feb 2025 20:41:50 -0600 Subject: [PATCH] [SWDEV-514998/SWDEV-511662] Fix tests for Guest and BM with static CPX config Guest: Tests needed to account for not supporting changing compute partitions. BM: Tests need to account for invalid responses from Driver (due to static CPX config). --- .../functional/computepartition_read_write.cc | 124 ++++++++++++------ 1 file changed, 87 insertions(+), 37 deletions(-) diff --git a/tests/rocm_smi_test/functional/computepartition_read_write.cc b/tests/rocm_smi_test/functional/computepartition_read_write.cc index 2863f33843..5d45642cda 100755 --- a/tests/rocm_smi_test/functional/computepartition_read_write.cc +++ b/tests/rocm_smi_test/functional/computepartition_read_write.cc @@ -204,9 +204,9 @@ static void checkPartitionIdChanges( std::cout << "\t** Checking Partition ID | Device: " << std::to_string(i) << "; Current Partition: " << current_partition << " ; Max partition IDs to check: " << max_loop << "\n"; - ASSERT_EQ(ret, RSMI_STATUS_SUCCESS); + EXPECT_EQ(ret, RSMI_STATUS_SUCCESS); if (ret == RSMI_STATUS_SUCCESS && current_partition == "SPX") { - ASSERT_LT(partition_id, max_loop); + EXPECT_LT(partition_id, max_loop); if (isVerbose) { std::cout << "\n\t**Confirmed partition_id < " << max_loop << " for SPX" @@ -215,7 +215,7 @@ static void checkPartitionIdChanges( << static_cast(partition_id) << std::endl; } } else if (ret == RSMI_STATUS_SUCCESS && current_partition == "DPX") { - ASSERT_LT(partition_id, max_loop); + EXPECT_LT(partition_id, max_loop); if (isVerbose) { std::cout << "\n\t**Confirmed partition_id < " << max_loop << " for DPX" @@ -224,7 +224,7 @@ static void checkPartitionIdChanges( << static_cast(partition_id) << std::endl; } } else if (ret == RSMI_STATUS_SUCCESS && current_partition == "TPX") { - ASSERT_LT(partition_id, max_loop); + EXPECT_LT(partition_id, max_loop); if (isVerbose) { std::cout << "\n\t**Confirmed partition_id < " << max_loop << " for TPX" @@ -233,7 +233,7 @@ static void checkPartitionIdChanges( << static_cast(partition_id) << std::endl; } } else if (ret == RSMI_STATUS_SUCCESS && current_partition == "QPX") { - ASSERT_LT(partition_id, max_loop); + EXPECT_LT(partition_id, max_loop); if (isVerbose) { std::cout << "\n\t**Confirmed partition_id < " << max_loop << " for QPX" @@ -242,7 +242,7 @@ static void checkPartitionIdChanges( << static_cast(partition_id) << std::endl; } } else if (ret == RSMI_STATUS_SUCCESS && current_partition == "CPX") { - ASSERT_LT(partition_id, max_loop); + EXPECT_LT(partition_id, max_loop); if (isVerbose) { std::cout << "\n\t**Confirmed partition_id < " << max_loop << " for CPX" @@ -251,7 +251,7 @@ static void checkPartitionIdChanges( << static_cast(partition_id) << std::endl; } } else if (ret == RSMI_STATUS_SUCCESS && current_partition == "UNKNOWN") { - ASSERT_EQ(partition_id, max_loop - 1); + EXPECT_EQ(partition_id, max_loop - 1); if (isVerbose) { std::cout << "\n\t**Confirmed partition_id = " << (max_loop - 1) @@ -303,7 +303,7 @@ void TestComputePartitionReadWrite::Run(void) { bool devicePartitionUpdated = false; ret = rsmi_dev_partition_id_get(dv_ind, nullptr); - ASSERT_EQ(ret, RSMI_STATUS_INVALID_ARGS); + EXPECT_EQ(ret, RSMI_STATUS_INVALID_ARGS); IF_VERB(STANDARD) { if (ret == RSMI_STATUS_INVALID_ARGS) { std::cout << "\t**" << "Confirmed rsmi_dev_partition_id_get(..,nullptr): " @@ -351,15 +351,15 @@ void TestComputePartitionReadWrite::Run(void) { "Skip compute partition test." << std::endl; continue; } - ASSERT_EQ(RSMI_STATUS_SUCCESS, ret); + EXPECT_EQ(RSMI_STATUS_SUCCESS, ret); // Verify api support checking functionality is working uint32_t kLength = 2; char smallBuffer[kLength]; err = rsmi_dev_compute_partition_get(dv_ind, smallBuffer, kLength); size_t size = sizeof(smallBuffer)/sizeof(*smallBuffer); - ASSERT_EQ(err, RSMI_STATUS_INSUFFICIENT_SIZE); - ASSERT_EQ((size_t)kLength, size); + EXPECT_EQ(err, RSMI_STATUS_INSUFFICIENT_SIZE); + EXPECT_EQ((size_t)kLength, size); IF_VERB(STANDARD) { if (err == RSMI_STATUS_INSUFFICIENT_SIZE) { std::cout << "\t**" @@ -370,7 +370,7 @@ void TestComputePartitionReadWrite::Run(void) { // Verify api support checking functionality is working err = rsmi_dev_compute_partition_get(dv_ind, nullptr, 255); - ASSERT_EQ(err, RSMI_STATUS_INVALID_ARGS); + EXPECT_EQ(err, RSMI_STATUS_INVALID_ARGS); IF_VERB(STANDARD) { if (err == RSMI_STATUS_INVALID_ARGS) { std::cout << "\t**" @@ -381,7 +381,7 @@ void TestComputePartitionReadWrite::Run(void) { // Verify api support checking functionality is working err = rsmi_dev_compute_partition_get(dv_ind, orig_char_computePartition, 0); - ASSERT_TRUE((err == RSMI_STATUS_INVALID_ARGS) || + EXPECT_TRUE((err == RSMI_STATUS_INVALID_ARGS) || (err == RSMI_STATUS_NOT_SUPPORTED)); IF_VERB(STANDARD) { if (err == RSMI_STATUS_INVALID_ARGS) { @@ -394,7 +394,7 @@ void TestComputePartitionReadWrite::Run(void) { // Re-run original get, so we can reset to later ret = rsmi_dev_compute_partition_get(dv_ind, orig_char_computePartition, 255); - ASSERT_EQ(RSMI_STATUS_SUCCESS, ret); + EXPECT_EQ(RSMI_STATUS_SUCCESS, ret); std::cout << "\t**rsmi_dev_compute_partition_get(" << dv_ind << ", " << orig_char_computePartition << ")\n"; @@ -460,10 +460,21 @@ void TestComputePartitionReadWrite::Run(void) { << "\t**New Partition (set): " << computePartitionString(updatePartition) << "\n"; } - ASSERT_TRUE((ret == RSMI_STATUS_SETTING_UNAVAILABLE) - || (ret== RSMI_STATUS_PERMISSION) - || (ret == RSMI_STATUS_SUCCESS) - || ret == RSMI_STATUS_BUSY); + EXPECT_TRUE(ret == RSMI_STATUS_SETTING_UNAVAILABLE + || ret== RSMI_STATUS_PERMISSION + || ret == RSMI_STATUS_SUCCESS + || ret == RSMI_STATUS_BUSY + || ret == RSMI_STATUS_NOT_SUPPORTED + || ret == RSMI_STATUS_INVALID_ARGS); + + if (ret == RSMI_STATUS_INVALID_ARGS) { + std::cout << "\t**" + << "1st Test: Due to invalid args, skipping rest of test for this device." + << "\n\t Device might be in a static partition mode. " + << "With inability to change partition modes." + << std::endl; + break; + } } for (int partition = static_cast(mapStringToRSMIComputePartitionTypes.at( @@ -488,10 +499,12 @@ void TestComputePartitionReadWrite::Run(void) { << "\t**New Partition (set): " << computePartitionString(updatePartition) << "\n"; } - ASSERT_TRUE((ret == RSMI_STATUS_SETTING_UNAVAILABLE) - || (ret== RSMI_STATUS_PERMISSION) - || (ret == RSMI_STATUS_SUCCESS) - || ret == RSMI_STATUS_BUSY); + EXPECT_TRUE(ret == RSMI_STATUS_SETTING_UNAVAILABLE + || ret== RSMI_STATUS_PERMISSION + || ret == RSMI_STATUS_SUCCESS + || ret == RSMI_STATUS_BUSY + || ret == RSMI_STATUS_NOT_SUPPORTED + || ret == RSMI_STATUS_INVALID_ARGS); if (ret == RSMI_STATUS_BUSY) { IF_VERB(STANDARD) { @@ -501,8 +514,17 @@ void TestComputePartitionReadWrite::Run(void) { continue; } + if (ret == RSMI_STATUS_INVALID_ARGS) { + std::cout << "\t**" + << "2nd test: Due to invalid args, skipping rest of test for this device." + << "\n\t Device might be in a static partition mode. " + << "With inability to change partition modes." + << std::endl; + break; + } + bool isSettingUnavailable = false; - if (ret == RSMI_STATUS_SETTING_UNAVAILABLE) { + if (ret == RSMI_STATUS_SETTING_UNAVAILABLE || ret == RSMI_STATUS_INVALID_ARGS) { isSettingUnavailable = true; } rsmi_status_t retGet = @@ -516,19 +538,20 @@ void TestComputePartitionReadWrite::Run(void) { << std::endl; } if (isSettingUnavailable) { - ASSERT_EQ(RSMI_STATUS_SETTING_UNAVAILABLE, ret); - ASSERT_STRNE(computePartitionString(updatePartition).c_str(), + EXPECT_TRUE(ret ==RSMI_STATUS_SETTING_UNAVAILABLE || ret == RSMI_STATUS_INVALID_ARGS); + EXPECT_STRNE(computePartitionString(updatePartition).c_str(), current_char_computePartition); IF_VERB(STANDARD) { std::cout << "\t**" << "Confirmed after receiving " - << "RSMI_STATUS_SETTING_UNAVAILABLE,\n\t current compute " + << amd::smi::getRSMIStatusString(ret, false) + << ",\n\t current compute " << "partition (" << current_char_computePartition << ") did not update to (" << computePartitionString(updatePartition) << ")" << std::endl; } - } else { + } else if (ret == RSMI_STATUS_SUCCESS) { if (strcmp(orig_char_computePartition, current_char_computePartition) != 0) { devicePartitionUpdated = true; @@ -537,8 +560,8 @@ void TestComputePartitionReadWrite::Run(void) { devicePartitionUpdated = false; } - ASSERT_EQ(RSMI_STATUS_SUCCESS, ret); - ASSERT_STREQ(computePartitionString(updatePartition).c_str(), + EXPECT_EQ(RSMI_STATUS_SUCCESS, ret); + EXPECT_STREQ(computePartitionString(updatePartition).c_str(), current_char_computePartition); IF_VERB(STANDARD) { std::cout << "\t**" @@ -551,6 +574,28 @@ void TestComputePartitionReadWrite::Run(void) { checkPartitionIdChanges(dv_ind, computePartitionString(updatePartition), isVerbose, true); + } else { + EXPECT_EQ(RSMI_STATUS_NOT_SUPPORTED, ret); + IF_VERB(STANDARD) { + std::cout << "\t**rsmi_dev_compute_partition_set(" << dv_ind + << ", " << computePartitionString(updatePartition) << "): " + << amd::smi::getRSMIStatusString(ret, false) + << "\n\t**Confirmed after receiving " + << "RSMI_STATUS_NOT_SUPPORTED, current compute " + << "partition (" << current_char_computePartition + << ")\n\tcannot not update to (" + << computePartitionString(updatePartition) << ")" + << "; if not already the current partition." << std::endl; + } + checkPartitionIdChanges(dv_ind, std::string(current_char_computePartition), + isVerbose, false); + // on guest this means we can't change partitions + // some partitions will match the original partition + if (amd::smi::is_vm_guest()) { + continue; + } + EXPECT_STRNE(computePartitionString(updatePartition).c_str(), + current_char_computePartition); } } // END looping through partition changes std::cout << "\t**=========== END PARTITION LOOP (dev = " @@ -591,7 +636,7 @@ void TestComputePartitionReadWrite::Run(void) { << (devicePartitionUpdated ? "TRUE" : "FALSE") << "\n"; } - if (final_partition_state != std::string(current_char_computePartition)) { + if (devicePartitionUpdated) { checkPartitionIdChanges(dv_ind, std::string(current_char_computePartition), isVerbose, true); } else { @@ -599,7 +644,7 @@ void TestComputePartitionReadWrite::Run(void) { isVerbose, false); } if (devicePartitionUpdated) { - ASSERT_STRNE(oldPartition.c_str(), current_char_computePartition); + EXPECT_STRNE(oldPartition.c_str(), current_char_computePartition); IF_VERB(STANDARD) { std::cout << "\t**" << "Confirmed prior partition (" << oldPartition << ") is not " @@ -608,7 +653,7 @@ void TestComputePartitionReadWrite::Run(void) { } final_partition_state = std::string(current_char_computePartition); } else { - ASSERT_STREQ(oldPartition.c_str(), current_char_computePartition); + EXPECT_STREQ(oldPartition.c_str(), current_char_computePartition); IF_VERB(STANDARD) { std::cout << "\t**" << "Confirmed prior partition (" << oldPartition << ") is equal" @@ -628,14 +673,19 @@ void TestComputePartitionReadWrite::Run(void) { = mapStringToRSMIComputePartitionTypes.at( std::string(orig_char_computePartition)); ret = rsmi_dev_compute_partition_set(dv_ind, newPartition); - CHK_ERR_ASRT(ret) + EXPECT_TRUE(ret == RSMI_STATUS_SETTING_UNAVAILABLE + || ret== RSMI_STATUS_PERMISSION + || ret == RSMI_STATUS_SUCCESS + || ret == RSMI_STATUS_BUSY + || ret == RSMI_STATUS_NOT_SUPPORTED + || ret == RSMI_STATUS_INVALID_ARGS); IF_VERB(STANDARD) { std::cout << "\t**" << "rsmi_dev_compute_partition_set(" << std::to_string(dv_ind) << ", " << std::string(orig_char_computePartition) << ")" << std::endl; std::cout << "\t**" - << "Returning compute partition to: " + << "Attempting to returning compute partition to: " << computePartitionString(newPartition) << std::endl; } ret = rsmi_dev_compute_partition_get(dv_ind, current_char_computePartition, @@ -648,13 +698,13 @@ void TestComputePartitionReadWrite::Run(void) { << current_char_computePartition << std::endl; } - ASSERT_EQ(RSMI_STATUS_SUCCESS, ret); - ASSERT_STREQ(computePartitionString(newPartition).c_str(), + EXPECT_EQ(RSMI_STATUS_SUCCESS, ret); + EXPECT_STREQ(computePartitionString(newPartition).c_str(), current_char_computePartition); // only refresh (rsmi_shut_down() -> rsmi_init(0)) device list // if there was a partition change - if (final_partition_state != std::string(current_char_computePartition)) { + if (devicePartitionUpdated) { checkPartitionIdChanges(dv_ind, computePartitionString(newPartition), isVerbose, true); } else {