Lines Matching full:node

58 static int max_numa_nodeid; /* Highest specified NUMA node ID, plus one.
62 static void parse_numa_node(MachineState *ms, NumaNodeOptions *node, in parse_numa_node() argument
72 if (node->has_nodeid) { in parse_numa_node()
73 nodenr = node->nodeid; in parse_numa_node()
91 * HMAT is enabled and this node has no cpus, QEMU will raise error. in parse_numa_node()
94 if (node->has_initiator) { 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()
109 numa_info[nodenr].initiator = node->initiator; in parse_numa_node()
112 for (cpus = node->cpus; cpus; cpus = cpus->next) { 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()
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()
186 error_setg(errp, "Source/Destination NUMA node is missing. " in parse_numa_distance()
187 "Please use '-numa node' option to declare it first."); in parse_numa_distance()
199 error_setg(errp, "Local distance of node %d should be %d.", in parse_numa_distance()
208 void parse_numa_hmat_lb(NumaState *numa_state, NumaHmatLBOptions *node, in parse_numa_hmat_lb() argument
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()
237 error_setg(errp, "The target=%d should point to an existing node", 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()
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()
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()
280 if (node->latency) { in parse_numa_hmat_lb()
282 max_entry = node->latency; in parse_numa_hmat_lb()
291 max_entry = node->latency / hmat_lb->base; 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()
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()
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()
349 if (node->bandwidth) { 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()
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()
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()
389 void parse_numa_hmat_cache(MachineState *ms, NumaHmatCacheOptions *node, in parse_numa_hmat_cache() argument
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()
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()
458 memcpy(hmat_cache, node, sizeof(*hmat_cache)); in parse_numa_hmat_cache()
459 ms->numa_state->hmat_cache[node->node_id][node->level] = hmat_cache; in parse_numa_hmat_cache()
471 parse_numa_node(ms, &object->u.node, errp); in set_numa_options()
478 error_setg(errp, "Missing mandatory node-id property"); 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()
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()
554 /* If all node pair distances are symmetric, then only distances
557 * distance from a node to itself is always NUMA_DISTANCE_MIN,
572 error_report("The distance between node %d and %d is " in validate_numa_distance()
595 "for both directions of all node pairs."); in validate_numa_distance()
610 * there would not be any missing distance except local node, which in complete_init_numa_distance()
661 * Enable NUMA implicitly by adding a new NUMA node automatically. in numa_complete_configuration()
664 * assume there is just one node with whole RAM. in numa_complete_configuration()
670 NumaNodeOptions node = { }; in numa_complete_configuration() local
671 parse_numa_node(ms, &node, &error_abort); in numa_complete_configuration()
677 /* No support for sparse NUMA node IDs yet: */ in numa_complete_configuration()
679 /* Report large node IDs first, to make mistakes easier to spot */ in numa_complete_configuration()
681 error_report("numa: Node ID missing: %d", i); in numa_complete_configuration()
714 /* QEMU needs at least all unique node pair distances to build in numa_complete_configuration()
719 * distance B->A is not. QEMU knows the distance of a node to in numa_complete_configuration()
724 * of all node pairs are required. 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()
749 object_property_set_int(OBJECT(dev), "node-id", in numa_cpu_pre_plug()
753 error_setg(errp, "invalid node-id, must be %"PRId64, in numa_cpu_pre_plug()
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()
782 /* TODO: once we support numa, assign to right node */ 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()
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()