On Tue, 2024-08-13 at 11:25 +0800, Chao Gao wrote: > > + for (i = 0; i < td_conf->num_cpuid_config; i++) { > > + struct kvm_tdx_cpuid_config source = { > > + .leaf = (u32)td_conf->cpuid_config_leaves[i], > > + .sub_leaf = td_conf->cpuid_config_leaves[i] >> 32, > > + .eax = (u32)td_conf->cpuid_config_values[i].eax_ebx, > > + .ebx = td_conf->cpuid_config_values[i].eax_ebx >> 32, > > + .ecx = (u32)td_conf->cpuid_config_values[i].ecx_edx, > > + .edx = td_conf->cpuid_config_values[i].ecx_edx >> 32, > > + }; > > + struct kvm_tdx_cpuid_config *dest = > > + &kvm_tdx_caps->cpuid_configs[i]; > > + > > + memcpy(dest, &source, sizeof(struct kvm_tdx_cpuid_config)); > > this memcpy() looks superfluous. does this work? > > kvm_tdx_caps->cpuid_configs[i] = { > .leaf = (u32)td_conf->cpuid_config_leaves[i], > .sub_leaf = td_conf->cpuid_config_leaves[i] >> 32, > .eax = (u32)td_conf->cpuid_config_values[i].eax_ebx, > .ebx = td_conf->cpuid_config_values[i].eax_ebx >> 32, > .ecx = (u32)td_conf->cpuid_config_values[i].ecx_edx, > .edx = td_conf->cpuid_config_values[i].ecx_edx >> 32, > }; This looks good to me. I didn't try to optimize because it's done in the module loading time.