Lines Matching +full:build +full:- +full:deprecated

29 #include "exec/cpu-common.h"
31 #include "qemu/error-report.h"
33 #include "qapi/opts-visitor.h"
34 #include "qapi/qapi-visit-machine.h"
37 #include "hw/mem/pc-dimm.h"
39 #include "hw/mem/memory-device.h"
41 #include "qemu/config-file.h"
69 unsigned int max_cpus = ms->smp.max_cpus; in parse_numa_node()
70 NodeInfo *numa_info = ms->numa_state->nodes; in parse_numa_node()
72 if (node->has_nodeid) { in parse_numa_node()
73 nodenr = node->nodeid; in parse_numa_node()
75 nodenr = ms->numa_state->num_nodes; in parse_numa_node()
94 if (node->has_initiator) { in parse_numa_node()
95 if (!ms->numa_state->hmat_enabled) { in parse_numa_node()
97 "(HMAT) is disabled, enable it with -machine hmat=on " in parse_numa_node()
102 if (node->initiator >= MAX_NODES) { in parse_numa_node()
104 "between 0 and %d", node->initiator, in parse_numa_node()
105 MAX_NODES - 1); in parse_numa_node()
109 numa_info[nodenr].initiator = node->initiator; in parse_numa_node()
112 for (cpus = node->cpus; cpus; cpus = cpus->next) { in parse_numa_node()
114 if (cpus->value >= max_cpus) { in parse_numa_node()
118 cpus->value, max_cpus); in parse_numa_node()
121 props = mc->cpu_index_to_instance_props(ms, cpus->value); in parse_numa_node()
131 have_memdevs = have_memdevs || node->memdev; in parse_numa_node()
132 have_mem = have_mem || node->has_mem; in parse_numa_node()
133 if ((node->has_mem && have_memdevs) || (node->memdev && have_mem)) { in parse_numa_node()
139 if (node->has_mem) { in parse_numa_node()
140 if (!mc->numa_mem_supported) { in parse_numa_node()
141 error_setg(errp, "Parameter -numa node,mem is not supported by this" in parse_numa_node()
143 error_append_hint(errp, "Use -numa node,memdev instead\n"); in parse_numa_node()
147 numa_info[nodenr].node_mem = node->mem; in parse_numa_node()
149 warn_report("Parameter -numa node,mem is deprecated," in parse_numa_node()
150 " use -numa node,memdev instead"); in parse_numa_node()
153 if (node->memdev) { in parse_numa_node()
155 o = object_resolve_path_type(node->memdev, TYPE_MEMORY_BACKEND, NULL); in parse_numa_node()
157 error_setg(errp, "memdev=%s is ambiguous", node->memdev); in parse_numa_node()
168 ms->numa_state->num_nodes++; in parse_numa_node()
174 uint16_t src = dist->src; in parse_numa_distance()
175 uint16_t dst = dist->dst; in parse_numa_distance()
176 uint8_t val = dist->val; in parse_numa_distance()
177 NodeInfo *numa_info = ms->numa_state->nodes; in parse_numa_distance()
181 src >= MAX_NODES ? "src" : "dst", MAX_NODES - 1); in parse_numa_distance()
187 "Please use '-numa node' option to declare it first."); in parse_numa_distance()
205 ms->numa_state->have_numa_distance = true; in parse_numa_distance()
213 NodeInfo *numa_info = numa_state->nodes; in parse_numa_hmat_lb()
215 numa_state->hmat_lb[node->hierarchy][node->data_type]; in parse_numa_hmat_lb()
220 if (node->initiator > numa_state->num_nodes) { in parse_numa_hmat_lb()
222 node->initiator, numa_state->num_nodes); in parse_numa_hmat_lb()
225 if (node->target > numa_state->num_nodes) { in parse_numa_hmat_lb()
227 node->target, numa_state->num_nodes); in parse_numa_hmat_lb()
230 if (!numa_info[node->initiator].has_cpu && in parse_numa_hmat_lb()
231 !numa_info[node->initiator].has_gi) { in parse_numa_hmat_lb()
233 "initiator proximity domain", node->initiator); in parse_numa_hmat_lb()
236 if (!numa_info[node->target].present) { in parse_numa_hmat_lb()
238 node->target); in parse_numa_hmat_lb()
244 numa_state->hmat_lb[node->hierarchy][node->data_type] = hmat_lb; in parse_numa_hmat_lb()
245 hmat_lb->list = g_array_new(false, true, sizeof(HMAT_LB_Data)); in parse_numa_hmat_lb()
247 hmat_lb->hierarchy = node->hierarchy; in parse_numa_hmat_lb()
248 hmat_lb->data_type = node->data_type; in parse_numa_hmat_lb()
249 lb_data.initiator = node->initiator; in parse_numa_hmat_lb()
250 lb_data.target = node->target; in parse_numa_hmat_lb()
252 if (node->data_type <= HMAT_LB_DATA_TYPE_WRITE_LATENCY) { in parse_numa_hmat_lb()
255 if (!node->has_latency) { in parse_numa_hmat_lb()
259 if (node->has_bandwidth) { in parse_numa_hmat_lb()
266 for (i = 0; i < hmat_lb->list->len; i++) { in parse_numa_hmat_lb()
267 lb_temp = &g_array_index(hmat_lb->list, HMAT_LB_Data, i); in parse_numa_hmat_lb()
269 if (node->initiator == lb_temp->initiator && in parse_numa_hmat_lb()
270 node->target == lb_temp->target) { in parse_numa_hmat_lb()
272 "initiator=%d and target=%d", node->initiator, in parse_numa_hmat_lb()
273 node->target); in parse_numa_hmat_lb()
278 hmat_lb->base = hmat_lb->base ? hmat_lb->base : UINT64_MAX; in parse_numa_hmat_lb()
280 if (node->latency) { in parse_numa_hmat_lb()
282 max_entry = node->latency; in parse_numa_hmat_lb()
290 temp_base = MIN(hmat_lb->base, temp_base); in parse_numa_hmat_lb()
291 max_entry = node->latency / hmat_lb->base; in parse_numa_hmat_lb()
292 max_entry = MAX(hmat_lb->range_bitmap, max_entry); in parse_numa_hmat_lb()
295 * For latency hmat_lb->range_bitmap record the max compressed in parse_numa_hmat_lb()
301 "min or max values on more than %d", node->latency, in parse_numa_hmat_lb()
302 node->initiator, node->target, UINT16_MAX - 1); in parse_numa_hmat_lb()
305 hmat_lb->base = temp_base; in parse_numa_hmat_lb()
306 hmat_lb->range_bitmap = max_entry; in parse_numa_hmat_lb()
313 numa_info[node->target].lb_info_provided |= BIT(0); in parse_numa_hmat_lb()
315 lb_data.data = node->latency; in parse_numa_hmat_lb()
316 } else if (node->data_type >= HMAT_LB_DATA_TYPE_ACCESS_BANDWIDTH) { in parse_numa_hmat_lb()
318 if (!node->has_bandwidth) { in parse_numa_hmat_lb()
322 if (node->has_latency) { in parse_numa_hmat_lb()
327 if (!QEMU_IS_ALIGNED(node->bandwidth, MiB)) { in parse_numa_hmat_lb()
329 "target=%d should be 1MB aligned", node->bandwidth, in parse_numa_hmat_lb()
330 node->initiator, node->target); in parse_numa_hmat_lb()
335 for (i = 0; i < hmat_lb->list->len; i++) { in parse_numa_hmat_lb()
336 lb_temp = &g_array_index(hmat_lb->list, HMAT_LB_Data, i); in parse_numa_hmat_lb()
338 if (node->initiator == lb_temp->initiator && in parse_numa_hmat_lb()
339 node->target == lb_temp->target) { in parse_numa_hmat_lb()
341 "initiator=%d and target=%d", node->initiator, in parse_numa_hmat_lb()
342 node->target); in parse_numa_hmat_lb()
347 hmat_lb->base = hmat_lb->base ? hmat_lb->base : 1; in parse_numa_hmat_lb()
349 if (node->bandwidth) { in parse_numa_hmat_lb()
351 bitmap_copy = hmat_lb->range_bitmap; in parse_numa_hmat_lb()
352 bitmap_copy |= node->bandwidth; in parse_numa_hmat_lb()
355 max_entry = node->bandwidth / temp_base; in parse_numa_hmat_lb()
356 last_bit = 64 - clz64(bitmap_copy); in parse_numa_hmat_lb()
363 if ((last_bit - first_bit) > UINT16_BITS || in parse_numa_hmat_lb()
367 "entered values on more than %d", node->bandwidth, in parse_numa_hmat_lb()
368 node->initiator, node->target, UINT16_MAX - 1); in parse_numa_hmat_lb()
371 hmat_lb->base = temp_base; in parse_numa_hmat_lb()
372 hmat_lb->range_bitmap = bitmap_copy; in parse_numa_hmat_lb()
379 numa_info[node->target].lb_info_provided |= BIT(1); in parse_numa_hmat_lb()
381 lb_data.data = node->bandwidth; in parse_numa_hmat_lb()
386 g_array_append_val(hmat_lb->list, lb_data); in parse_numa_hmat_lb()
392 int nb_numa_nodes = ms->numa_state->num_nodes; in parse_numa_hmat_cache()
393 NodeInfo *numa_info = ms->numa_state->nodes; in parse_numa_hmat_cache()
396 if (node->node_id >= nb_numa_nodes) { in parse_numa_hmat_cache()
397 error_setg(errp, "Invalid node-id=%" PRIu32 ", it should be less " in parse_numa_hmat_cache()
398 "than %d", node->node_id, nb_numa_nodes); in parse_numa_hmat_cache()
402 if (numa_info[node->node_id].lb_info_provided != (BIT(0) | BIT(1))) { in parse_numa_hmat_cache()
404 "node-id=%" PRIu32 " should be provided before memory side " in parse_numa_hmat_cache()
405 "cache attributes", node->node_id); in parse_numa_hmat_cache()
409 if (node->level < 1 || node->level >= HMAT_LB_LEVELS) { in parse_numa_hmat_cache()
411 "and less than or equal to %d", node->level, in parse_numa_hmat_cache()
412 HMAT_LB_LEVELS - 1); in parse_numa_hmat_cache()
416 assert(node->associativity < HMAT_CACHE_ASSOCIATIVITY__MAX); in parse_numa_hmat_cache()
417 assert(node->policy < HMAT_CACHE_WRITE_POLICY__MAX); in parse_numa_hmat_cache()
418 if (ms->numa_state->hmat_cache[node->node_id][node->level]) { in parse_numa_hmat_cache()
420 "node-id=%" PRIu32 " and level=%" PRIu8, in parse_numa_hmat_cache()
421 node->node_id, node->level); in parse_numa_hmat_cache()
425 if ((node->level > 1) && in parse_numa_hmat_cache()
426 ms->numa_state->hmat_cache[node->node_id][node->level - 1] == NULL) { in parse_numa_hmat_cache()
428 node->level - 1); in parse_numa_hmat_cache()
432 if ((node->level > 1) && in parse_numa_hmat_cache()
433 (node->size <= in parse_numa_hmat_cache()
434 ms->numa_state->hmat_cache[node->node_id][node->level - 1]->size)) { in parse_numa_hmat_cache()
437 "level=%u", node->size, node->level, in parse_numa_hmat_cache()
438 ms->numa_state->hmat_cache[node->node_id] in parse_numa_hmat_cache()
439 [node->level - 1]->size, in parse_numa_hmat_cache()
440 node->level - 1); in parse_numa_hmat_cache()
444 if ((node->level < HMAT_LB_LEVELS - 1) && in parse_numa_hmat_cache()
445 ms->numa_state->hmat_cache[node->node_id][node->level + 1] && in parse_numa_hmat_cache()
446 (node->size >= in parse_numa_hmat_cache()
447 ms->numa_state->hmat_cache[node->node_id][node->level + 1]->size)) { in parse_numa_hmat_cache()
450 "level=%u", node->size, node->level, in parse_numa_hmat_cache()
451 ms->numa_state->hmat_cache[node->node_id] in parse_numa_hmat_cache()
452 [node->level + 1]->size, in parse_numa_hmat_cache()
453 node->level + 1); in parse_numa_hmat_cache()
459 ms->numa_state->hmat_cache[node->node_id][node->level] = hmat_cache; in parse_numa_hmat_cache()
464 if (!ms->numa_state) { in set_numa_options()
465 error_setg(errp, "NUMA is not supported by this machine-type"); in set_numa_options()
469 switch (object->type) { in set_numa_options()
471 parse_numa_node(ms, &object->u.node, errp); in set_numa_options()
474 parse_numa_distance(ms, &object->u.dist, errp); in set_numa_options()
477 if (!object->u.cpu.has_node_id) { in set_numa_options()
478 error_setg(errp, "Missing mandatory node-id property"); in set_numa_options()
481 if (!ms->numa_state->nodes[object->u.cpu.node_id].present) { in set_numa_options()
482 error_setg(errp, "Invalid node-id=%" PRId64 ", NUMA node must be " in set_numa_options()
483 "defined with -numa node,nodeid=ID before it's used with " in set_numa_options()
484 "-numa cpu,node-id=ID", object->u.cpu.node_id); in set_numa_options()
489 qapi_NumaCpuOptions_base(&object->u.cpu), in set_numa_options()
493 if (!ms->numa_state->hmat_enabled) { in set_numa_options()
495 "(HMAT) is disabled, enable it with -machine hmat=on " in set_numa_options()
500 parse_numa_hmat_lb(ms->numa_state, &object->u.hmat_lb, errp); in set_numa_options()
503 if (!ms->numa_state->hmat_enabled) { in set_numa_options()
505 "(HMAT) is disabled, enable it with -machine hmat=on " in set_numa_options()
510 parse_numa_hmat_cache(ms, &object->u.hmat_cache, errp); in set_numa_options()
527 return -1; in parse_numa()
530 /* Fix up legacy suffix-less format */ in parse_numa()
531 if ((object->type == NUMA_OPTIONS_TYPE_NODE) && object->u.node.has_mem) { in parse_numa()
533 int ret = qemu_strtosz_MiB(mem_str, NULL, &object->u.node.mem); in parse_numa()
536 error_setg_errno(&err, -ret, "could not parse memory size '%s'", in parse_numa()
548 return -1; in parse_numa()
564 int nb_numa_nodes = ms->numa_state->num_nodes; in validate_numa_distance()
565 NodeInfo *numa_info = ms->numa_state->nodes; in validate_numa_distance()
606 NodeInfo *numa_info = ms->numa_state->nodes; in complete_init_numa_distance()
613 for (src = 0; src < ms->numa_state->num_nodes; src++) { in complete_init_numa_distance()
614 for (dst = 0; dst < ms->numa_state->num_nodes; dst++) { in complete_init_numa_distance()
631 for (i = 0; i < ms->numa_state->num_nodes; i++) { in numa_init_memdev_container()
632 uint64_t size = ms->numa_state->nodes[i].node_mem; in numa_init_memdev_container()
633 HostMemoryBackend *backend = ms->numa_state->nodes[i].node_memdev; in numa_init_memdev_container()
647 NodeInfo *numa_info = ms->numa_state->nodes; in numa_complete_configuration()
651 * (ms->maxram_size > ms->ram_size) but without '-numa' options explicitly on in numa_complete_configuration()
666 if (ms->numa_state->num_nodes == 0 && in numa_complete_configuration()
667 ((ms->ram_slots && mc->auto_enable_numa_with_memhp) || in numa_complete_configuration()
668 (ms->maxram_size > ms->ram_size && mc->auto_enable_numa_with_memdev) || in numa_complete_configuration()
669 mc->auto_enable_numa)) { in numa_complete_configuration()
672 numa_info[0].node_mem = ms->ram_size; in numa_complete_configuration()
678 for (i = max_numa_nodeid - 1; i >= 0; i--) { in numa_complete_configuration()
687 assert(ms->numa_state->num_nodes == max_numa_nodeid); in numa_complete_configuration()
689 if (ms->numa_state->num_nodes > 0) { in numa_complete_configuration()
693 for (i = 0; i < ms->numa_state->num_nodes; i++) { in numa_complete_configuration()
696 if (numa_total != ms->ram_size) { in numa_complete_configuration()
699 numa_total, ms->ram_size); in numa_complete_configuration()
703 if (!numa_uses_legacy_mem() && mc->default_ram_id) { in numa_complete_configuration()
704 if (ms->memdev) { in numa_complete_configuration()
705 error_report("'-machine memory-backend' and '-numa memdev'" in numa_complete_configuration()
709 ms->ram = g_new(MemoryRegion, 1); in numa_complete_configuration()
710 memory_region_init(ms->ram, OBJECT(ms), mc->default_ram_id, in numa_complete_configuration()
711 ms->ram_size); in numa_complete_configuration()
712 numa_init_memdev_container(ms, ms->ram); in numa_complete_configuration()
714 /* QEMU needs at least all unique node pair distances to build in numa_complete_configuration()
716 * as symmetric by default, i.e. distance A->B == distance B->A. in numa_complete_configuration()
718 * initialization even though only distance A->B is provided and in numa_complete_configuration()
719 * distance B->A is not. QEMU knows the distance of a node to in numa_complete_configuration()
720 * itself is always 10, so A->A distances may be omitted. When in numa_complete_configuration()
722 * A->B != distance B->A, then that means the distance table is in numa_complete_configuration()
726 if (ms->numa_state->have_numa_distance) { in numa_complete_configuration()
743 int node_id = object_property_get_int(OBJECT(dev), "node-id", &error_abort); in numa_cpu_pre_plug()
746 /* due to bug in libvirt, it doesn't pass node-id from props on in numa_cpu_pre_plug()
748 if (slot->props.has_node_id) { in numa_cpu_pre_plug()
749 object_property_set_int(OBJECT(dev), "node-id", in numa_cpu_pre_plug()
750 slot->props.node_id, errp); in numa_cpu_pre_plug()
752 } else if (node_id != slot->props.node_id) { in numa_cpu_pre_plug()
753 error_setg(errp, "invalid node-id, must be %"PRId64, in numa_cpu_pre_plug()
754 slot->props.node_id); in numa_cpu_pre_plug()
767 for (info = info_list; info; info = info->next) { in numa_stat_memory_devices()
768 MemoryDeviceInfo *value = info->value; in numa_stat_memory_devices()
771 switch (value->type) { in numa_stat_memory_devices()
774 pcdimm_info = value->type == MEMORY_DEVICE_INFO_KIND_DIMM ? in numa_stat_memory_devices()
775 value->u.dimm.data : value->u.nvdimm.data; in numa_stat_memory_devices()
776 node_mem[pcdimm_info->node].node_mem += pcdimm_info->size; in numa_stat_memory_devices()
777 node_mem[pcdimm_info->node].node_plugged_mem += in numa_stat_memory_devices()
778 pcdimm_info->size; in numa_stat_memory_devices()
781 vpi = value->u.virtio_pmem.data; in numa_stat_memory_devices()
783 node_mem[0].node_mem += vpi->size; in numa_stat_memory_devices()
784 node_mem[0].node_plugged_mem += vpi->size; in numa_stat_memory_devices()
787 vmi = value->u.virtio_mem.data; in numa_stat_memory_devices()
788 node_mem[vmi->node].node_mem += vmi->size; in numa_stat_memory_devices()
789 node_mem[vmi->node].node_plugged_mem += vmi->size; in numa_stat_memory_devices()
792 se = value->u.sgx_epc.data; in numa_stat_memory_devices()
793 node_mem[se->node].node_mem += se->size; in numa_stat_memory_devices()
794 node_mem[se->node].node_plugged_mem = 0; in numa_stat_memory_devices()
808 if (ms->numa_state == NULL || ms->numa_state->num_nodes <= 0) { in query_numa_node_mem()
813 for (i = 0; i < ms->numa_state->num_nodes; i++) { in query_numa_node_mem()
814 node_mem[i].node_mem += ms->numa_state->nodes[i].node_mem; in query_numa_node_mem()
826 notifier->ram_block_added(notifier, host, size, max_size); in ram_block_notify_add_single()
839 notifier->ram_block_removed(notifier, host, size, max_size); in ram_block_notify_remove_single()
849 if (n->ram_block_added) { in ram_block_notifier_add()
858 if (n->ram_block_removed) { in ram_block_notifier_remove()
869 if (notifier->ram_block_added) { in ram_block_notify_add()
870 notifier->ram_block_added(notifier, host, size, max_size); in ram_block_notify_add()
881 if (notifier->ram_block_removed) { in ram_block_notify_remove()
882 notifier->ram_block_removed(notifier, host, size, max_size); in ram_block_notify_remove()
893 if (notifier->ram_block_resized) { in ram_block_notify_resize()
894 notifier->ram_block_resized(notifier, host, old_size, new_size); in ram_block_notify_resize()