* [bug report] KVM: TDX: Get system-wide info about TDX module on initialization
@ 2025-09-09 8:28 Dan Carpenter
2025-09-09 10:20 ` Tony Lindgren
0 siblings, 1 reply; 2+ messages in thread
From: Dan Carpenter @ 2025-09-09 8:28 UTC (permalink / raw)
To: Isaku Yamahata; +Cc: kvm
Hello Isaku Yamahata,
Commit 61bb28279623 ("KVM: TDX: Get system-wide info about TDX module
on initialization") from Oct 30, 2024 (linux-next), leads to the
following Smatch static checker warning:
arch/x86/kvm/vmx/tdx.c:3464 __tdx_bringup()
warn: missing error code 'r'
arch/x86/kvm/vmx/tdx.c
3416 static int __init __tdx_bringup(void)
3417 {
3418 const struct tdx_sys_info_td_conf *td_conf;
3419 int r, i;
3420
3421 for (i = 0; i < ARRAY_SIZE(tdx_uret_msrs); i++) {
3422 /*
3423 * Check if MSRs (tdx_uret_msrs) can be saved/restored
3424 * before returning to user space.
3425 *
3426 * this_cpu_ptr(user_return_msrs)->registered isn't checked
3427 * because the registration is done at vcpu runtime by
3428 * tdx_user_return_msr_update_cache().
3429 */
3430 tdx_uret_msrs[i].slot = kvm_find_user_return_msr(tdx_uret_msrs[i].msr);
3431 if (tdx_uret_msrs[i].slot == -1) {
3432 /* If any MSR isn't supported, it is a KVM bug */
3433 pr_err("MSR %x isn't included by kvm_find_user_return_msr\n",
3434 tdx_uret_msrs[i].msr);
3435 return -EIO;
3436 }
3437 }
3438
3439 /*
3440 * Enabling TDX requires enabling hardware virtualization first,
3441 * as making SEAMCALLs requires CPU being in post-VMXON state.
3442 */
3443 r = kvm_enable_virtualization();
3444 if (r)
3445 return r;
3446
3447 cpus_read_lock();
3448 r = __do_tdx_bringup();
3449 cpus_read_unlock();
3450
3451 if (r)
3452 goto tdx_bringup_err;
3453
3454 /* Get TDX global information for later use */
3455 tdx_sysinfo = tdx_get_sysinfo();
3456 if (WARN_ON_ONCE(!tdx_sysinfo)) {
3457 r = -EINVAL;
3458 goto get_sysinfo_err;
3459 }
3460
3461 /* Check TDX module and KVM capabilities */
3462 if (!tdx_get_supported_attrs(&tdx_sysinfo->td_conf) ||
3463 !tdx_get_supported_xfam(&tdx_sysinfo->td_conf))
--> 3464 goto get_sysinfo_err;
error code?
3465
3466 if (!(tdx_sysinfo->features.tdx_features0 & MD_FIELD_ID_FEATURES0_TOPOLOGY_ENUM))
3467 goto get_sysinfo_err;
here too?
3468
3469 /*
3470 * TDX has its own limit of maximum vCPUs it can support for all
3471 * TDX guests in addition to KVM_MAX_VCPUS. Userspace needs to
3472 * query TDX guest's maximum vCPUs by checking KVM_CAP_MAX_VCPU
3473 * extension on per-VM basis.
3474 *
3475 * TDX module reports such limit via the MAX_VCPU_PER_TD global
3476 * metadata. Different modules may report different values.
3477 * Some old module may also not support this metadata (in which
3478 * case this limit is U16_MAX).
3479 *
3480 * In practice, the reported value reflects the maximum logical
3481 * CPUs that ALL the platforms that the module supports can
3482 * possibly have.
3483 *
3484 * Simply forwarding the MAX_VCPU_PER_TD to userspace could
3485 * result in an unpredictable ABI. KVM instead always advertise
3486 * the number of logical CPUs the platform has as the maximum
3487 * vCPUs for TDX guests.
3488 *
3489 * Make sure MAX_VCPU_PER_TD reported by TDX module is not
3490 * smaller than the number of logical CPUs, otherwise KVM will
3491 * report an unsupported value to userspace.
3492 *
3493 * Note, a platform with TDX enabled in the BIOS cannot support
3494 * physical CPU hotplug, and TDX requires the BIOS has marked
3495 * all logical CPUs in MADT table as enabled. Just use
3496 * num_present_cpus() for the number of logical CPUs.
3497 */
3498 td_conf = &tdx_sysinfo->td_conf;
3499 if (td_conf->max_vcpus_per_td < num_present_cpus()) {
3500 pr_err("Disable TDX: MAX_VCPU_PER_TD (%u) smaller than number of logical CPUs (%u).\n",
3501 td_conf->max_vcpus_per_td, num_present_cpus());
3502 r = -EINVAL;
3503 goto get_sysinfo_err;
3504 }
3505
3506 if (misc_cg_set_capacity(MISC_CG_RES_TDX, tdx_get_nr_guest_keyids())) {
3507 r = -EINVAL;
3508 goto get_sysinfo_err;
3509 }
3510
3511 /*
3512 * Leave hardware virtualization enabled after TDX is enabled
3513 * successfully. TDX CPU hotplug depends on this.
3514 */
3515 return 0;
3516
3517 get_sysinfo_err:
3518 __tdx_cleanup();
3519 tdx_bringup_err:
3520 kvm_disable_virtualization();
3521 return r;
3522 }
regards,
dan carpenter
^ permalink raw reply [flat|nested] 2+ messages in thread
end of thread, other threads:[~2025-09-09 10:20 UTC | newest]
Thread overview: 2+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2025-09-09 8:28 [bug report] KVM: TDX: Get system-wide info about TDX module on initialization Dan Carpenter
2025-09-09 10:20 ` Tony Lindgren
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.