6b61c2c596
In case of NUMA there are 2 cases to consider: 1. '-numa node,memdev', the only one that will be available for 5.0 and newer machine types. In this case reuse current behavior, with only difference memdevs are put into MachineState::ram container + a temporary glue to keep memory_region_allocate_system_memory() working until all boards converted. 2. fake NUMA ("-numa node mem" and default RAM splitting) the later has been deprecated and will be removed but the former is going to stay available for compat reasons for 5.0 and older machine types it takes allocate_system_memory_nonnuma() path, like non-NUMA case and falls under conversion to memdev. So extend non-NUMA MachineState::ram initialization introduced in previous patch to take care of fake NUMA case. Signed-off-by: Igor Mammedov <imammedo@redhat.com> Message-Id: <20200219160953.13771-6-imammedo@redhat.com>
118 lines
3.4 KiB
C
118 lines
3.4 KiB
C
#ifndef SYSEMU_NUMA_H
|
|
#define SYSEMU_NUMA_H
|
|
|
|
#include "qemu/bitmap.h"
|
|
#include "qapi/qapi-types-machine.h"
|
|
#include "exec/cpu-common.h"
|
|
|
|
struct CPUArchId;
|
|
|
|
#define MAX_NODES 128
|
|
#define NUMA_NODE_UNASSIGNED MAX_NODES
|
|
#define NUMA_DISTANCE_MIN 10
|
|
#define NUMA_DISTANCE_DEFAULT 20
|
|
#define NUMA_DISTANCE_MAX 254
|
|
#define NUMA_DISTANCE_UNREACHABLE 255
|
|
|
|
/* the value of AcpiHmatLBInfo flags */
|
|
enum {
|
|
HMAT_LB_MEM_MEMORY = 0,
|
|
HMAT_LB_MEM_CACHE_1ST_LEVEL = 1,
|
|
HMAT_LB_MEM_CACHE_2ND_LEVEL = 2,
|
|
HMAT_LB_MEM_CACHE_3RD_LEVEL = 3,
|
|
HMAT_LB_LEVELS /* must be the last entry */
|
|
};
|
|
|
|
/* the value of AcpiHmatLBInfo data type */
|
|
enum {
|
|
HMAT_LB_DATA_ACCESS_LATENCY = 0,
|
|
HMAT_LB_DATA_READ_LATENCY = 1,
|
|
HMAT_LB_DATA_WRITE_LATENCY = 2,
|
|
HMAT_LB_DATA_ACCESS_BANDWIDTH = 3,
|
|
HMAT_LB_DATA_READ_BANDWIDTH = 4,
|
|
HMAT_LB_DATA_WRITE_BANDWIDTH = 5,
|
|
HMAT_LB_TYPES /* must be the last entry */
|
|
};
|
|
|
|
#define UINT16_BITS 16
|
|
|
|
struct NodeInfo {
|
|
uint64_t node_mem;
|
|
struct HostMemoryBackend *node_memdev;
|
|
bool present;
|
|
bool has_cpu;
|
|
uint8_t lb_info_provided;
|
|
uint16_t initiator;
|
|
uint8_t distance[MAX_NODES];
|
|
};
|
|
|
|
struct NumaNodeMem {
|
|
uint64_t node_mem;
|
|
uint64_t node_plugged_mem;
|
|
};
|
|
|
|
struct HMAT_LB_Data {
|
|
uint8_t initiator;
|
|
uint8_t target;
|
|
uint64_t data;
|
|
};
|
|
typedef struct HMAT_LB_Data HMAT_LB_Data;
|
|
|
|
struct HMAT_LB_Info {
|
|
/* Indicates it's memory or the specified level memory side cache. */
|
|
uint8_t hierarchy;
|
|
|
|
/* Present the type of data, access/read/write latency or bandwidth. */
|
|
uint8_t data_type;
|
|
|
|
/* The range bitmap of bandwidth for calculating common base */
|
|
uint64_t range_bitmap;
|
|
|
|
/* The common base unit for latencies or bandwidths */
|
|
uint64_t base;
|
|
|
|
/* Array to store the latencies or bandwidths */
|
|
GArray *list;
|
|
};
|
|
typedef struct HMAT_LB_Info HMAT_LB_Info;
|
|
|
|
struct NumaState {
|
|
/* Number of NUMA nodes */
|
|
int num_nodes;
|
|
|
|
/* Allow setting NUMA distance for different NUMA nodes */
|
|
bool have_numa_distance;
|
|
|
|
/* Detect if HMAT support is enabled. */
|
|
bool hmat_enabled;
|
|
|
|
/* NUMA nodes information */
|
|
NodeInfo nodes[MAX_NODES];
|
|
|
|
/* NUMA nodes HMAT Locality Latency and Bandwidth Information */
|
|
HMAT_LB_Info *hmat_lb[HMAT_LB_LEVELS][HMAT_LB_TYPES];
|
|
|
|
/* Memory Side Cache Information Structure */
|
|
NumaHmatCacheOptions *hmat_cache[MAX_NODES][HMAT_LB_LEVELS];
|
|
};
|
|
typedef struct NumaState NumaState;
|
|
|
|
void set_numa_options(MachineState *ms, NumaOptions *object, Error **errp);
|
|
void parse_numa_opts(MachineState *ms);
|
|
void parse_numa_hmat_lb(NumaState *numa_state, NumaHmatLBOptions *node,
|
|
Error **errp);
|
|
void parse_numa_hmat_cache(MachineState *ms, NumaHmatCacheOptions *node,
|
|
Error **errp);
|
|
void numa_complete_configuration(MachineState *ms);
|
|
void query_numa_node_mem(NumaNodeMem node_mem[], MachineState *ms);
|
|
extern QemuOptsList qemu_numa_opts;
|
|
void numa_legacy_auto_assign_ram(MachineClass *mc, NodeInfo *nodes,
|
|
int nb_nodes, ram_addr_t size);
|
|
void numa_default_auto_assign_ram(MachineClass *mc, NodeInfo *nodes,
|
|
int nb_nodes, ram_addr_t size);
|
|
void numa_cpu_pre_plug(const struct CPUArchId *slot, DeviceState *dev,
|
|
Error **errp);
|
|
bool numa_uses_legacy_mem(void);
|
|
|
|
#endif
|