Re: [PATCH] KVM: x86: Clean up included but non-essential header declarations

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Wed, Oct 18, 2023, Like Xu wrote:
> On 18/10/2023 5:31 am, Sean Christopherson wrote:
> > On Tue, Oct 17, 2023, Like Xu wrote:
> > > From: Like Xu <likexu@xxxxxxxxxxx>
> > > Removing these declarations as part of KVM code refactoring can also (when
> > > the compiler isn't so smart) reduce compile time, compile warnings, and the
> > 
> > Really, warnings?  On what W= level?  W=1 builds just fine with KVM_WERROR=y.
> > If any of the "supported" warn levels triggers a warn=>error, then we'll fix it.
> > 
> > > size of compiled artefacts, and more importantly can help developers better
> > > consider decoupling when adding/refactoring unmerged code, thus relieving
> > > some of the burden on the code review process.
> > 
> > Can you provide an example?  KVM certainly has its share of potential circular
> > dependency pitfalls, e.g. it's largely why we have the ugly and seemingly
> > arbitrary split between x86.h and asm/kvm_host.h.  But outside of legitimate
> > collisions like that, I can't think of a single instance where superfluous existing
> > includes caused problems.  On the other hand, I distinctly recall multiple
> > instances where a header didn't include what it used and broke the build when the
> > buggy header was included in a new file.
> 
> I've noticed that during patch iterations, developers add or forget to
> remove header declarations from previous versions (just so the compiler
> doesn't complain), and the status quo is that these header declarations
> are rapidly ballooning.

That's hyperbolic BS.  Here's the diff of includes in x86.c from v2.6.38 to now.

  @@ -1,20 +1,29 @@
  +#include "ioapic.h"
  +#include "kvm_emulate.h"
  +#include "mmu/page_track.h"
  +#include "cpuid.h"
  +#include "pmu.h"
  +#include "hyperv.h"
  +#include "lapic.h"
  +#include "xen.h"
  +#include "smm.h"
  
  New KVM functionality and/or the result of refactoring code to break up large files.
  
  -#include <linux/module.h>
  +#include <linux/export.h>
  +#include <linux/moduleparam.h>
  
  Likely a refactoring of other code.  Basically a wash.
  
  -#include <linux/intel-iommu.h>
  
  Removal of an unnecessary vendor-specific include.
  
  +#include <linux/pci.h>
  +#include <linux/timekeeper_internal.h>
  
  These two look dubious and probably can be removed.
  
  +#include <linux/pvclock_gtod.h>
  +#include <linux/kvm_irqfd.h>
  +#include <linux/irqbypass.h>
  +#include <linux/sched/stat.h>
  +#include <linux/sched/isolation.h>
  +#include <linux/mem_encrypt.h>
  +#include <linux/entry-kvm.h>
  +#include <linux/suspend.h>
  +#include <linux/smp.h>
  +#include <trace/events/ipi.h>
  
  New functionality and/or refactoring.
  
  -#include <asm/mtrr.h>
  -#include <asm/i387.h>
  -#include <asm/xcr.h>
  
  Removal from refactoring.
  
  +#include <asm/pkru.h>

  New functionality.

  +#include <linux/kernel_stat.h>
  
  This one looks dubious and probably can be removed.
  
  +#include <asm/fpu/api.h>
  +#include <asm/fpu/xcr.h>
  +#include <asm/fpu/xstate.h>
  +#include <asm/irq_remapping.h>
  +#include <asm/mshyperv.h>
  +#include <asm/hypervisor.h>
  
  New functionality and/or refactoring.
  
  +#include <asm/tlbflush.h>
  
  The tlbflush.h include _might_ be stale now that x86.c doesn't use cr4_read_shadow(),
  but it's also entirely possible there's a real need for it as tlbflush.h defines a
  lot more than just TLB flush stuff.
  
  +#include <asm/intel_pt.h>
  +#include <asm/emulate_prefix.h>
  +#include <asm/sgx.h>
  +#include <clocksource/hyperv_timer.h>
  
  New functionality and/or refactoring.

So over the last *13 years*, x86.c has gained 3 includes that are likely now
stale, and one that might be stale.  Yes, the total number of includes has roughly
doubled, but so has the size of x86.c!

arch/x86/include/asm/kvm_host.h is a similar story.  The number of includes has
roughly doubled, but the size of kvm_host.h has nearly *tripled*.  And at a glance,
every single new include is warranted.

  @@ -3,12 +3,26 @@
   #include <linux/mmu_notifier.h>
   #include <linux/tracepoint.h>
   #include <linux/cpumask.h>
  +#include <linux/irq_work.h>
  +#include <linux/irq.h>
  +#include <linux/workqueue.h>
   
   #include <linux/kvm.h>
   #include <linux/kvm_para.h>
   #include <linux/kvm_types.h>
  +#include <linux/perf_event.h>
  +#include <linux/pvclock_gtod.h>
  +#include <linux/clocksource.h>
  +#include <linux/irqbypass.h>
  +#include <linux/hyperv.h>
  +#include <linux/kfifo.h>
   
  +#include <asm/apic.h>
   #include <asm/pvclock-abi.h>
   #include <asm/desc.h>
   #include <asm/mtrr.h>
   #include <asm/msr-index.h>
  +#include <asm/asm.h>
  +#include <asm/kvm_page_track.h>
  +#include <asm/kvm_vcpu_regs.h>
  +#include <asm/hyperv-tlfs.h>

I would hardly desribe either of those as "rapidly ballooning".

> > >   43 files changed, 184 deletions(-)
> > 
> > NAK, I am not taking a wholesale purge of includes.  I have no objection to
> > removing truly unnecessary includes, e.g. there are definitely some includes that
> > are no longer necessary due to code being moved around.  But changes like the
> > removal of all includes from tdp_mmu.h and smm.h are completely bogus.  If anything,
> > smm.h clearly needs more includes, because it is certainly not including everything
> > it is using.
> 
> Thanks, this patch being nak is to be expected. As you've noticed in the
> smm.h story, sensible dependencies should appear in sensible header files,
> and are assembled correctly to promote better understanding (the compiler
> seems to be happy on weird dependency combinations and doesn't complain
> until something goes wrong).
> 
> In addition to "x86.h and asm/kvm_host.h", we could have gone further in
> the direction of "Make headers standalone", couldn't we ?

I honestly have no idea what point you're trying to make.  If you're asking
"could be split up x86.h and asm/kvm_host.h into smaller headers", then the answer
is "yes".  But that's not at all what your proposed patch does, and such cleanups
are usually non-trivial and come with a cost, e.g. complicates backporting fixes
to stable trees.

I'm obviously not opposed to cleaning up and reducing unnecessary includes, e.g.
see the recent work I put into arch/x86/include/asm/kvm_page_track.h.  But crap
like this just wastes my time and makes me grumpy.



[Index of Archives]     [KVM ARM]     [KVM ia64]     [KVM ppc]     [Virtualization Tools]     [Spice Development]     [Libvirt]     [Libvirt Users]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite Questions]     [Linux Kernel]     [Linux SCSI]     [XFree86]

  Powered by Linux