|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [PATCH for-4.21??? 1/3] x86/vLAPIC: add indirection to LVT handling
On 09.10.2025 16:56, Grygorii Strashko wrote:
> On 08.10.25 15:08, Jan Beulich wrote:
>> --- a/xen/arch/x86/hvm/vlapic.c
>> +++ b/xen/arch/x86/hvm/vlapic.c
>> @@ -32,7 +32,16 @@
>> #include <public/hvm/params.h>
>>
>> #define VLAPIC_VERSION 0x00050014
>> -#define VLAPIC_LVT_NUM 6
>> +#define LVT_BIAS(reg) (((reg) - APIC_LVTT) >> 4)
>
> LVT_REG_IDX is more meaningful.
Not to me. I don't like LVT_BIAS() very much as a name, but if anything I'd
want to replace it by something clearly better (and unambiguous).
>> +
>> +#define LVTS \
>> + LVT(LVTT), LVT(LVTTHMR), LVT(LVTPC), LVT(LVT0), LVT(LVT1), LVT(LVTERR),
>> +
>> +static const unsigned int lvt_reg[] = {
>
> this is going to be used by vlapic_get_reg()/vlapic_set_reg()
> which both accept "uint32_t reg", so wouldn't it be reasonable
> to use "uint32_t" here too.
Possible, but against ./CODING_STYLE (applies to your other uint32_t remarks,
too).
>> @@ -41,20 +50,21 @@
>> (LVT_MASK | APIC_DM_MASK | APIC_INPUT_POLARITY |\
>> APIC_LVT_REMOTE_IRR | APIC_LVT_LEVEL_TRIGGER)
>>
>> -static const unsigned int vlapic_lvt_mask[VLAPIC_LVT_NUM] =
>> +static const unsigned int lvt_valid[] =
>> {
>> - /* LVTT */
>> - LVT_MASK | APIC_TIMER_MODE_MASK,
>> - /* LVTTHMR */
>> - LVT_MASK | APIC_DM_MASK,
>> - /* LVTPC */
>> - LVT_MASK | APIC_DM_MASK,
>> - /* LVT0-1 */
>> - LINT_MASK, LINT_MASK,
>> - /* LVTERR */
>> - LVT_MASK
>> +#define LVTT_VALID (LVT_MASK | APIC_TIMER_MODE_MASK)
>> +#define LVTTHMR_VALID (LVT_MASK | APIC_DM_MASK)
>> +#define LVTPC_VALID (LVT_MASK | APIC_DM_MASK)
>> +#define LVT0_VALID LINT_MASK
>> +#define LVT1_VALID LINT_MASK
>> +#define LVTERR_VALID LVT_MASK
>> +#define LVT(which) [LVT_BIAS(APIC_ ## which)] = which ## _VALID
>> + LVTS
>> +#undef LVT
>> };
>>
>> +#undef LVTS
>> +
>
> I know people have different coding style/approaches...
> But using self expanding macro-magic in this particular case is over-kill
> - it breaks grep (grep APIC_LVTT will not give all occurrences)
> - it complicates code analyzes and readability
> - What is array size?
> - Which array elements actually initialized?
> - what is the actual element's values?
> - in this particular case - no benefits in terms of code lines.
>
> It might be reasonable if there would be few dozen of regs (or more),
> but there are only 6(7) and HW spec is old and stable.
>
> So could there just be:
> static const unsigned int lvt_reg[] = {
> APIC_LVTT,
> APIC_LVTTHMR
> ...
>
> and
>
> static const unsigned int lvt_valid[] = {
> [LVT_REG_IDX(APIC_LVTT)] = (LVT_MASK | APIC_TIMER_MODE_MASK),
> [LVT_REG_IDX(APIC_LVTTHMR)] = (LVT_MASK | APIC_DM_MASK),
> ..
>
> Just fast look at above code gives all info without need to parse all
> these recursive macro.
And with no guarantee at all that the order of entries remains in sync
between all (two now, three later) uses.
>> #define vlapic_lvtt_period(vlapic) \
>> ((vlapic_get_reg(vlapic, APIC_LVTT) & APIC_TIMER_MODE_MASK) \
>> == APIC_TIMER_MODE_PERIODIC)
>> @@ -827,16 +837,16 @@ void vlapic_reg_write(struct vcpu *v, un
>>
>> if ( !(val & APIC_SPIV_APIC_ENABLED) )
>> {
>> - int i;
>> + unsigned int i,
>
> uint32_t?
>
>> + nr = GET_APIC_MAXLVT(vlapic_get_reg(vlapic, APIC_LVR)) + 1;
>
> This deserves wrapper (may be static inline)
> Defining multiple vars on the same line makes code less readable as for me.
I don't see multiple variables being defined on this line.
Jan
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |