[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [PATCH v2 3/3] svm/nestedsvm: Introduce nested capabilities bit
On 28.03.2024 11:57, George Dunlap wrote: > On Thu, Mar 28, 2024 at 6:44 AM Jan Beulich <jbeulich@xxxxxxxx> wrote: >>>>> --- a/xen/arch/x86/hvm/nestedhvm.c >>>>> +++ b/xen/arch/x86/hvm/nestedhvm.c >>>>> @@ -150,6 +150,16 @@ static int __init cf_check nestedhvm_setup(void) >>>>> __clear_bit(0x80, shadow_io_bitmap[0]); >>>>> __clear_bit(0xed, shadow_io_bitmap[1]); >>>>> >>>>> + /* >>>>> + * NB this must be called after all command-line processing has been >>>>> + * done, so that if (for example) HAP is disabled, nested virt is >>>>> + * disabled as well. >>>>> + */ >>>>> + if ( cpu_has_vmx ) >>>>> + start_nested_vmx(&hvm_funcs); >>>>> + else if ( cpu_has_svm ) >>>>> + start_nested_svm(&hvm_funcs); >>>> >>>> Instead of passing the pointer, couldn't you have the functions return >>>> bool, and then set hvm_funcs.caps.nested_virt from that? Passing that >>>> pointer looks somewhat odd to me. >>> >>> For one, it makes start_nested_XXX symmetric to start_XXX, which also >>> has access to the full hvm_funcs structure (albeit in the former case >>> because it's creating the structure). >> >> This last aspect is the crucial aspect: start{svm,vmx}() are indeed quite >> special because of this. Everywhere else we have accessor helpers when >> hvm_funcs needs consulting, e.g. ... >> >>> For two, both of them need to read caps.hap. >> >> ... caps _reads_ would want using (an) accessor(s), too. >> >>> For three, it's just more flexible -- there may be >>> future things that we want to modify in the start_nested_*() >>> functions. If we did as you suggest, and then added (say) >>> caps.nested_virt_needs_hap, then we'd either need to add a second >>> function, or refactor it to look like this. >> >> Right, I can see this as an argument when taking, as you do, speculation >> on future needs into account. Albeit I'm then inclined to say that even >> such modifications may better be done through accessor helpers. > > Why access it through accessor helpers? > > I consider that it's the SVM and VMX "construction/setup" code > respectively which "own" hvm_funcs (as evidenced by the fact that they > create the structures and then return them); and I consider the > start_nested_{vmx/svm} to be a part of the same code; so I consider it > valid for them to have direct access to the structure. That's one way of looking at it, yes. However, to me neither SVM nor VMX code directly fiddle with hvm_funcs in the way you describe it. Instead they return a pointer to their respective instances of struct hvm_function_table. If the nested startup code would similarly alter private struct instances of some sort, all would be fine. May I suggest that you grep for hvm_funcs in what is there right now. You'll find solely vmcs.c having a few uses of .caps, which likely are wrong (as in: layering violations), too. That said I can accept that the situation is slightly different here, when generic code passes a pointer to the nested startup functions. To me at least it still feels layering-violation-ish. Jan
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |