On Fri, Mar 04, 2022, Zeng Guang wrote: > +#define BUILD_CONTROLS_SHADOW(lname, uname, bits) \ > +static inline \ > +void lname##_controls_set(struct vcpu_vmx *vmx, u##bits val) \ > +{ \ > + if (vmx->loaded_vmcs->controls_shadow.lname != val) { \ > + vmcs_write##bits(uname, val); \ > + vmx->loaded_vmcs->controls_shadow.lname = val; \ > + } \ > +} \ > +static inline u##bits __##lname##_controls_get(struct loaded_vmcs *vmcs)\ > +{ \ > + return vmcs->controls_shadow.lname; \ > +} \ > +static inline u##bits lname##_controls_get(struct vcpu_vmx *vmx) \ > +{ \ > + return __##lname##_controls_get(vmx->loaded_vmcs); \ > +} \ > +static inline \ Drop the newline, there's no need to split this across two lines. Aligning the backslashes will mean they all poke past the 80 char soft limit, but that's totally ok. The whole point of the line limit is to improve readability, and a trivial runover is much less painful than a split function declaration. As a bonus, all the backslashes are aligned, have leading whitespace, and still land on a tab stop :-) #define BUILD_CONTROLS_SHADOW(lname, uname, bits) \ static inline void lname##_controls_set(struct vcpu_vmx *vmx, u##bits val) \ { \ if (vmx->loaded_vmcs->controls_shadow.lname != val) { \ vmcs_write##bits(uname, val); \ vmx->loaded_vmcs->controls_shadow.lname = val; \ } \ } \ static inline u##bits __##lname##_controls_get(struct loaded_vmcs *vmcs) \ { \ return vmcs->controls_shadow.lname; \ } \ static inline u##bits lname##_controls_get(struct vcpu_vmx *vmx) \ { \ return __##lname##_controls_get(vmx->loaded_vmcs); \ } \ static inline void lname##_controls_setbit(struct vcpu_vmx *vmx, u##bits val) \ { \ lname##_controls_set(vmx, lname##_controls_get(vmx) | val); \ } \ static inline void lname##_controls_clearbit(struct vcpu_vmx *vmx, u##bits val) \ { \ lname##_controls_set(vmx, lname##_controls_get(vmx) & ~val); \ } With that fixed, Reviewed-by: Sean Christopherson <seanjc@xxxxxxxxxx> > +void lname##_controls_setbit(struct vcpu_vmx *vmx, u##bits val) \ > +{ \ > + lname##_controls_set(vmx, lname##_controls_get(vmx) | val); \ > +} \ > +static inline \ > +void lname##_controls_clearbit(struct vcpu_vmx *vmx, u##bits val) \ > +{ \ > + lname##_controls_set(vmx, lname##_controls_get(vmx) & ~val); \ > } > -BUILD_CONTROLS_SHADOW(vm_entry, VM_ENTRY_CONTROLS) > -BUILD_CONTROLS_SHADOW(vm_exit, VM_EXIT_CONTROLS) > -BUILD_CONTROLS_SHADOW(pin, PIN_BASED_VM_EXEC_CONTROL) > -BUILD_CONTROLS_SHADOW(exec, CPU_BASED_VM_EXEC_CONTROL) > -BUILD_CONTROLS_SHADOW(secondary_exec, SECONDARY_VM_EXEC_CONTROL) > +BUILD_CONTROLS_SHADOW(vm_entry, VM_ENTRY_CONTROLS, 32) > +BUILD_CONTROLS_SHADOW(vm_exit, VM_EXIT_CONTROLS, 32) > +BUILD_CONTROLS_SHADOW(pin, PIN_BASED_VM_EXEC_CONTROL, 32) > +BUILD_CONTROLS_SHADOW(exec, CPU_BASED_VM_EXEC_CONTROL, 32) > +BUILD_CONTROLS_SHADOW(secondary_exec, SECONDARY_VM_EXEC_CONTROL, 32) > > /* > * VMX_REGS_LAZY_LOAD_SET - The set of registers that will be updated in the > -- > 2.27.0 >