On Thu, 5 Jun 2025 17:44:52 +0800
Zhao Liu <zhao1....@intel.com> wrote:

> Hi Ali,
> 
> I'm very sorry to bother you with some comments after so many
> versions.
> 
> > diff --git a/hw/cpu/core.c b/hw/cpu/core.c
> > index 5cb2e9a7f5..7339782663 100644
> > --- a/hw/cpu/core.c
> > +++ b/hw/cpu/core.c  
> 
> core.c is not the right place. It just contains the "cpu-core"
> abstraction. So we need to move the following functions to other
> files.
> 
> > @@ -102,4 +102,96 @@ static void cpu_core_register_types(void)
> >      type_register_static(&cpu_core_type_info);
> >  }
> >  
> > +bool cache_described_at(const MachineState *ms, CpuTopologyLevel
> > level)  
> 
> It's better to add the comment about what this function did. (its name
> doesn't reflect it wants to check the coresponding CPU topology
> level.)
> 
> I also feel it's not a good name, what about
> "machine_check_cache_at_topo_level"?
> 
> Furthermore, we can move this one to hw/core/machine-smp.c, as it is
> about with machine's smp_cache.
> 
> > +{
> > +    if (machine_get_cache_topo_level(ms, CACHE_LEVEL_AND_TYPE_L3)
> > == level ||
> > +        machine_get_cache_topo_level(ms, CACHE_LEVEL_AND_TYPE_L2)
> > == level ||
> > +        machine_get_cache_topo_level(ms, CACHE_LEVEL_AND_TYPE_L1I)
> > == level ||
> > +        machine_get_cache_topo_level(ms, CACHE_LEVEL_AND_TYPE_L1D)
> > == level) {
> > +        return true;
> > +    }
> > +    return false;
> > +}
> > +
> > +int partial_cache_description(const MachineState *ms,
> > CPUCorePPTTCaches *caches,
> > +                              int num_caches)  
> 
> Because I'll suggest to move CPUCorePPTTCaches to
> include/hw/acpi/cpu.h later, and this function accepts
> CPUCorePPTTCaches as the argument, so I think we could move this
> function to hw/acpi/cpu.c (if Michael and Igor don't object).
> 
> > +{
> > +    int level, c;
> > +
> > +    for (level = 1; level < num_caches; level++) {
> > +        for (c = 0; c < num_caches; c++) {
> > +            if (caches[c].level != level) {
> > +                continue;
> > +            }
> > +
> > +            switch (level) {
> > +            case 1:
> > +                /*
> > +                 * L1 cache is assumed to have both L1I and L1D
> > available.
> > +                 * Technically both need to be checked.
> > +                 */
> > +                if (machine_get_cache_topo_level(ms,
> > +
> > CACHE_LEVEL_AND_TYPE_L1I) ==
> > +                    CPU_TOPOLOGY_LEVEL_DEFAULT) {
> > +                    return level;
> > +                }
> > +                break;
> > +            case 2:
> > +                if (machine_get_cache_topo_level(ms,
> > CACHE_LEVEL_AND_TYPE_L2) ==
> > +                    CPU_TOPOLOGY_LEVEL_DEFAULT) {
> > +                    return level;
> > +                }
> > +                break;
> > +            case 3:
> > +                if (machine_get_cache_topo_level(ms,
> > CACHE_LEVEL_AND_TYPE_L3) ==
> > +                    CPU_TOPOLOGY_LEVEL_DEFAULT) {
> > +                    return level;
> > +                }
> > +                break;
> > +            }
> > +        }
> > +    }
> > +
> > +    return 0;
> > +}
> > +
> > +/*
> > + * This function assumes l3 and l2 have unified cache and l1 is
> > split l1d
> > + * and l1i, and further prepares the lowest cache level for a
> > topology
> > + * level.  The info will be fed to build_caches to create caches
> > at the
> > + * right level.
> > + */
> > +bool find_the_lowest_level_cache_defined_at_level(const
> > MachineState *ms,
> > +                                                  int *level_found,
> > +                                                  CpuTopologyLevel
> > topo_level) {  
> 
> This is a very long name :-).
> 
> Maybe we can rename it like:
> 
> machine_find_lowest_level_cache_at_topo_level,
> 
> (sorry this name doesn't shorten the length but align the naming style
> in machine-smp.c)
> 
> and explain the arguments in the comment.
> 
> Furthermore, we can move this one to hw/core/machine-smp.c, too.
> 
> > +    CpuTopologyLevel level;
> > +
> > +    level = machine_get_cache_topo_level(ms,
> > CACHE_LEVEL_AND_TYPE_L1I);
> > +    if (level == topo_level) {
> > +        *level_found = 1;
> > +        return true;
> > +    }
> > +
> > +    level = machine_get_cache_topo_level(ms,
> > CACHE_LEVEL_AND_TYPE_L1D);
> > +    if (level == topo_level) {
> > +        *level_found = 1;
> > +        return true;
> > +    }
> > +
> > +    level = machine_get_cache_topo_level(ms,
> > CACHE_LEVEL_AND_TYPE_L2);
> > +    if (level == topo_level) {
> > +        *level_found = 2;
> > +        return true;
> > +    }
> > +
> > +    level = machine_get_cache_topo_level(ms,
> > CACHE_LEVEL_AND_TYPE_L3);
> > +    if (level == topo_level) {
> > +        *level_found = 3;
> > +        return true;
> > +    }
> > +
> > +    return false;
> > +}
> > +
> >  type_init(cpu_core_register_types)  
> 
> ...
> 
> > diff --git a/include/hw/cpu/core.h b/include/hw/cpu/core.h
> > index 98ab91647e..0f7bf8bc28 100644
> > --- a/include/hw/cpu/core.h
> > +++ b/include/hw/cpu/core.h
> > @@ -11,6 +11,7 @@
> >  
> >  #include "hw/qdev-core.h"
> >  #include "qom/object.h"
> > +#include "qapi/qapi-types-machine-common.h"
> >  
> >  #define TYPE_CPU_CORE "cpu-core"
> >  
> > @@ -25,6 +26,32 @@ struct CPUCore {
> >      int nr_threads;
> >  };
> >  
> > +typedef enum CPUCacheType {
> > +    CPU_CORE_DATA,
> > +    CPU_CORE_INSTRUCTION,
> > +    CPU_CORE_UNIFIED,
> > +} CPUCoreCacheType;  
> 
> This is a complete duplicate of the x86's CPUCaches
> (target/i386/cpu.h).
> 
> I think we can move x86's CPUCaches to include/hw/core/cpu.h.
> 
> > +typedef struct CPUPPTTCaches {
> > +    CPUCoreCacheType type;
> > +    uint32_t pptt_id;
> > +    uint32_t sets;
> > +    uint32_t size;
> > +    uint32_t level;
> > +    uint16_t linesize;
> > +    uint8_t attributes; /* write policy: 0x0 write back, 0x1 write
> > through */
> > +    uint8_t associativity;
> > +} CPUCorePPTTCaches;  
> 
> x86 doesn't use PPTT to describe cache so it's not necessary to reuse
> CPUCacheInfo (target/i386/cpu.h) for PPTT.
> 
> But I understand it's better to place this sturct in
> include/hw/acpi/cpu.h, since it is part of the ACPI PPTT table.
> 
> > +int partial_cache_description(const MachineState *ms,
> > CPUCorePPTTCaches *caches,
> > +                              int num_caches);  
> 
> Could move to include/hw/acpi/cpu.h, too.
> 
> > +bool cache_described_at(const MachineState *ms, CpuTopologyLevel
> > level); +
> > +bool find_the_lowest_level_cache_defined_at_level(const
> > MachineState *ms,
> > +                                                  int *level_found,
> > +                                                  CpuTopologyLevel
> > topo_level);
> > +  
> 
> Because these 2 functions' definitions would be moved to
> hw/core/machine-smp.c, then we need to move their declarations to
> include/hw/boards.h.
> 
> 
> Except the above nits, the general part is fine for me.
> 
> Thanks,
> Zhao
> 
> 
> 

Hi Zhao,

Thanks for the feedback, I was actually unsure about the structure, and
was looking to get some feedback here, to see where to put what! I
will go over the suggestions, and take note. In the meantime,
let's see if we can get some more review here.

Alireza


Reply via email to