Allocate only the required CPUs
This commit is contained in:
		
							parent
							
								
									8153742c1f
								
							
						
					
					
						commit
						a663f2c11b
					
				
							
								
								
									
										41
									
								
								emu.c
									
									
									
									
									
								
							
							
						
						
									
										41
									
								
								emu.c
									
									
									
									
									
								
							| @ -540,11 +540,15 @@ add_new_cpu(struct ovni_emu *emu, struct ovni_loom *loom, int i, int phyid) | ||||
| { | ||||
| 	struct ovni_cpu *cpu; | ||||
| 
 | ||||
| 	/* The logical id must match our index */ | ||||
| 	assert((size_t) i == loom->ncpus); | ||||
| 
 | ||||
| 	cpu = &loom->cpu[i]; | ||||
| 
 | ||||
| 	if(i < 0 || i >= (int) loom->ncpus) | ||||
| 	{ | ||||
| 		err("CPU with index %d in loom %s is out of bounds\n", i, | ||||
| 				loom->hostname); | ||||
| 		abort(); | ||||
| 	} | ||||
| 
 | ||||
| 	assert(cpu->state == CPU_ST_UNKNOWN); | ||||
| 
 | ||||
| 	cpu->state = CPU_ST_READY; | ||||
| @ -554,8 +558,6 @@ add_new_cpu(struct ovni_emu *emu, struct ovni_loom *loom, int i, int phyid) | ||||
| 	cpu->loom = loom; | ||||
| 
 | ||||
| 	dbg("new cpu %d at phyid=%d\n", cpu->gindex, phyid); | ||||
| 
 | ||||
| 	loom->ncpus++; | ||||
| } | ||||
| 
 | ||||
| static void | ||||
| @ -579,16 +581,41 @@ proc_load_cpus(struct ovni_emu *emu, struct ovni_loom *loom, struct ovni_eproc * | ||||
| 
 | ||||
| 	assert(loom->ncpus == 0); | ||||
| 
 | ||||
| 	for(i = 0; i < json_array_get_count(cpuarray); i++) | ||||
| 	loom->ncpus = json_array_get_count(cpuarray); | ||||
| 
 | ||||
| 	if(loom->ncpus <= 0) | ||||
| 	{ | ||||
| 		err("loom %s proc %d has read %ld cpus, but required > 0\n", | ||||
| 				loom->hostname, proc->pid, loom->ncpus); | ||||
| 		abort(); | ||||
| 	} | ||||
| 
 | ||||
| 	loom->cpu = calloc(loom->ncpus, sizeof(struct ovni_cpu)); | ||||
| 
 | ||||
| 	if(loom->cpu == NULL) | ||||
| 	{ | ||||
| 		perror("calloc failed"); | ||||
| 		abort(); | ||||
| 	} | ||||
| 
 | ||||
| 	for(i = 0; i < loom->ncpus; i++) | ||||
| 	{ | ||||
| 		cpu = json_array_get_object(cpuarray, i); | ||||
| 
 | ||||
| 		if(cpu == NULL) | ||||
| 		{ | ||||
| 			err("json_array_get_object returned NULL\n"); | ||||
| 			abort(); | ||||
| 		} | ||||
| 
 | ||||
| 		index = (int) json_object_get_number(cpu, "index"); | ||||
| 		phyid = (int) json_object_get_number(cpu, "phyid"); | ||||
| 
 | ||||
| 		add_new_cpu(emu, loom, index, phyid); | ||||
| 	} | ||||
| 
 | ||||
| 	/* If we reach this point, all CPUs are in the ready state */ | ||||
| 
 | ||||
| 	/* Init the vcpu as well */ | ||||
| 	vcpu = &loom->vcpu; | ||||
| 	assert(vcpu->state == CPU_ST_UNKNOWN); | ||||
| @ -651,6 +678,8 @@ destroy_metadata(struct ovni_emu *emu) | ||||
| 			assert(proc->meta); | ||||
| 			json_value_free(proc->meta); | ||||
| 		} | ||||
| 
 | ||||
| 		free(loom->cpu); | ||||
| 	} | ||||
| 
 | ||||
| 	return 0; | ||||
|  | ||||
							
								
								
									
										2
									
								
								emu.h
									
									
									
									
									
								
							
							
						
						
									
										2
									
								
								emu.h
									
									
									
									
									
								
							| @ -381,7 +381,7 @@ struct ovni_loom { | ||||
| 	size_t max_phyid; | ||||
| 	size_t ncpus; | ||||
| 	size_t offset_ncpus; | ||||
| 	struct ovni_cpu cpu[OVNI_MAX_CPU]; | ||||
| 	struct ovni_cpu *cpu; | ||||
| 
 | ||||
| 	int64_t clock_offset; | ||||
| 
 | ||||
|  | ||||
| @ -187,7 +187,7 @@ update_cpu(struct ovni_cpu *cpu) | ||||
| struct ovni_cpu * | ||||
| emu_get_cpu(struct ovni_loom *loom, int cpuid) | ||||
| { | ||||
| 	assert(cpuid < OVNI_MAX_CPU); | ||||
| 	assert(cpuid < (int) loom->ncpus); | ||||
| 
 | ||||
| 	if(cpuid < 0) | ||||
| 	{ | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user