Use the CPU phyid for the name only
The logical index is used to change the affinity of the threads.
This commit is contained in:
		
							parent
							
								
									e0adf2f4a5
								
							
						
					
					
						commit
						0eb88af4b9
					
				| @ -3,6 +3,7 @@ | ||||
| 
 | ||||
| #include "cpu.h" | ||||
| 
 | ||||
| #include "loom.h" | ||||
| #include "chan.h" | ||||
| #include "value.h" | ||||
| #include "utlist.h" | ||||
| @ -28,16 +29,24 @@ static int chan_type[] = { | ||||
| }; | ||||
| 
 | ||||
| void | ||||
| cpu_init_begin(struct cpu *cpu, int phyid, int is_virtual) | ||||
| cpu_init_begin(struct cpu *cpu, int index, int phyid, int is_virtual) | ||||
| { | ||||
| 	memset(cpu, 0, sizeof(struct cpu)); | ||||
| 
 | ||||
| 	cpu->index = index; | ||||
| 	cpu->phyid = phyid; | ||||
| 	cpu->is_virtual = is_virtual; | ||||
| 	cpu->gindex = -1; | ||||
| 
 | ||||
| 	dbg("cpu init %d", phyid); | ||||
| } | ||||
| 
 | ||||
| int | ||||
| cpu_get_index(struct cpu *cpu) | ||||
| { | ||||
| 	return cpu->index; | ||||
| } | ||||
| 
 | ||||
| int | ||||
| cpu_get_phyid(struct cpu *cpu) | ||||
| { | ||||
| @ -56,23 +65,41 @@ cpu_set_loom(struct cpu *cpu, struct loom *loom) | ||||
| 	cpu->loom = loom; | ||||
| } | ||||
| 
 | ||||
| void | ||||
| cpu_set_name(struct cpu *cpu, const char *name) | ||||
| static int | ||||
| set_name(struct cpu *cpu) | ||||
| { | ||||
| 	if (snprintf(cpu->name, PATH_MAX, "%s", name) >= PATH_MAX) | ||||
| 		die("cpu name too long"); | ||||
| 	size_t i = loom_get_gindex(cpu->loom); | ||||
| 	size_t j = cpu_get_phyid(cpu); | ||||
| 	int n; | ||||
| 
 | ||||
| 	if (cpu->is_virtual) | ||||
| 		n = snprintf(cpu->name, PATH_MAX, "vCPU %ld.*", i); | ||||
| 	else | ||||
| 		n = snprintf(cpu->name, PATH_MAX, " CPU %ld.%ld", i, j); | ||||
| 
 | ||||
| 	if (n >= PATH_MAX) { | ||||
| 		err("cpu name too long"); | ||||
| 		return -1; | ||||
| 	} | ||||
| 
 | ||||
| 	return 0; | ||||
| } | ||||
| 
 | ||||
| int | ||||
| cpu_init_end(struct cpu *cpu) | ||||
| { | ||||
| 	if (strlen(cpu->name) == 0) { | ||||
| 		err("cpu name not set"); | ||||
| 	if (cpu->gindex < 0) { | ||||
| 		err("cpu gindex not set"); | ||||
| 		return -1; | ||||
| 	} | ||||
| 
 | ||||
| 	if (cpu->gindex < 0) { | ||||
| 		err("cpu gindex not set"); | ||||
| 	if (cpu->loom == NULL) { | ||||
| 		err("cpu loom not set"); | ||||
| 		return -1; | ||||
| 	} | ||||
| 
 | ||||
| 	if (set_name(cpu) != 0) { | ||||
| 		err("set_name failed"); | ||||
| 		return -1; | ||||
| 	} | ||||
| 
 | ||||
|  | ||||
| @ -4,7 +4,8 @@ | ||||
| #ifndef CPU_H | ||||
| #define CPU_H | ||||
| 
 | ||||
| struct cpu; /* Needed for thread */ | ||||
| struct cpu; /* Needed for thread and loom */ | ||||
| struct loom; | ||||
| 
 | ||||
| #include "thread.h" | ||||
| #include "chan.h" | ||||
| @ -30,8 +31,8 @@ struct cpu { | ||||
| 	char name[PATH_MAX]; | ||||
| 	int is_init; | ||||
| 
 | ||||
| 	/* Logical index: 0 to ncpus - 1 */ | ||||
| 	//int index;
 | ||||
| 	/* Logical index: 0 to ncpus - 1, and -1 for virtual */ | ||||
| 	int index; | ||||
| 
 | ||||
| 	/* Physical id: as reported by lscpu(1) */ | ||||
| 	int phyid; | ||||
| @ -64,8 +65,9 @@ struct cpu { | ||||
| 	UT_hash_handle hh; /* CPUs in the loom */ | ||||
| }; | ||||
| 
 | ||||
|         void cpu_init_begin(struct cpu *cpu, int phyid, int is_virtual); | ||||
|         void cpu_init_begin(struct cpu *cpu, int index, int phyid, int is_virtual); | ||||
| USE_RET int cpu_get_phyid(struct cpu *cpu); | ||||
| USE_RET int cpu_get_index(struct cpu *cpu); | ||||
|         void cpu_set_gindex(struct cpu *cpu, int64_t gindex); | ||||
|         void cpu_set_loom(struct cpu *cpu, struct loom *loom); | ||||
|         void cpu_set_name(struct cpu *cpu, const char *name); | ||||
|  | ||||
| @ -67,7 +67,7 @@ loom_init_begin(struct loom *loom, const char *name) | ||||
| 	set_hostname(loom->hostname, loom->name); | ||||
| 	loom->id = loom->name; | ||||
| 
 | ||||
| 	cpu_init_begin(&loom->vcpu, -1, 1); | ||||
| 	cpu_init_begin(&loom->vcpu, -1, -1, 1); | ||||
| 	cpu_set_loom(&loom->vcpu, loom); | ||||
| 
 | ||||
| 	dbg("creating new loom %s", loom->id); | ||||
| @ -98,6 +98,20 @@ loom_find_cpu(struct loom *loom, int phyid) | ||||
| 	return cpu; | ||||
| } | ||||
| 
 | ||||
| struct cpu * | ||||
| loom_get_cpu(struct loom *loom, int index) | ||||
| { | ||||
| 	if (index == -1) | ||||
| 		return &loom->vcpu; | ||||
| 
 | ||||
| 	if (index < 0 || (size_t) index >= loom->ncpus) { | ||||
| 		err("cpu index out of bounds"); | ||||
| 		return NULL; | ||||
| 	} | ||||
| 
 | ||||
| 	return loom->cpus_array[index]; | ||||
| } | ||||
| 
 | ||||
| int | ||||
| loom_add_cpu(struct loom *loom, struct cpu *cpu) | ||||
| { | ||||
| @ -183,6 +197,27 @@ loom_init_end(struct loom *loom) | ||||
| 		} | ||||
| 	} | ||||
| 
 | ||||
| 	/* Populate cpus_array */ | ||||
| 	loom->cpus_array = calloc(loom->ncpus, sizeof(struct cpu *)); | ||||
| 	if (loom->cpus_array == NULL) { | ||||
| 		err("calloc failed:"); | ||||
| 		return -1; | ||||
| 	} | ||||
| 	for (struct cpu *c = loom->cpus; c; c = c->hh.next) { | ||||
| 		int index = cpu_get_index(c); | ||||
| 		if (index < 0 || (size_t) index >= loom->ncpus) { | ||||
| 			err("cpu index out of bounds"); | ||||
| 			return -1; | ||||
| 		} | ||||
| 
 | ||||
| 		if (loom->cpus_array[index] != NULL) { | ||||
| 			err("cpu with index %d already taken", index); | ||||
| 			return -1; | ||||
| 		} | ||||
| 
 | ||||
| 		loom->cpus_array[index] = c; | ||||
| 	} | ||||
| 
 | ||||
| 	loom->is_init = 1; | ||||
| 
 | ||||
| 	return 0; | ||||
|  | ||||
| @ -4,7 +4,7 @@ | ||||
| #ifndef LOOM_H | ||||
| #define LOOM_H | ||||
| 
 | ||||
| //struct loom;
 | ||||
| struct loom; | ||||
| 
 | ||||
| #include <stddef.h> | ||||
| #include <stdint.h> | ||||
| @ -33,6 +33,9 @@ struct loom { | ||||
| 	/* Physical CPUs hash table by phyid */ | ||||
| 	struct cpu *cpus; | ||||
| 
 | ||||
| 	/* Array of CPUs indexed by logic index */ | ||||
| 	struct cpu **cpus_array; | ||||
| 
 | ||||
| 	/* Virtual CPU */ | ||||
| 	struct cpu vcpu; | ||||
| 
 | ||||
| @ -54,6 +57,7 @@ int loom_add_cpu(struct loom *loom, struct cpu *cpu); | ||||
| int64_t loom_get_gindex(struct loom *loom); | ||||
| void loom_set_gindex(struct loom *loom, int64_t gindex); | ||||
| struct cpu *loom_find_cpu(struct loom *loom, int phyid); | ||||
| struct cpu *loom_get_cpu(struct loom *loom, int index); | ||||
| void loom_set_vcpu(struct loom *loom, struct cpu *vcpu); | ||||
| struct cpu *loom_get_vcpu(struct loom *loom); | ||||
| struct proc *loom_find_proc(struct loom *loom, pid_t pid); | ||||
|  | ||||
| @ -97,8 +97,7 @@ load_cpus(struct loom *loom, JSON_Object *meta) | ||||
| 
 | ||||
| 		/* Cast from double */ | ||||
| 		int index = (int) json_object_get_number(jcpu, "index"); | ||||
| 		/* FIXME: Use phyid instead */ | ||||
| 		//int phyid = (int) json_object_get_number(jcpu, "phyid");
 | ||||
| 		int phyid = (int) json_object_get_number(jcpu, "phyid"); | ||||
| 
 | ||||
| 		struct cpu *cpu = calloc(1, sizeof(struct cpu)); | ||||
| 		if (cpu == NULL) { | ||||
| @ -106,7 +105,7 @@ load_cpus(struct loom *loom, JSON_Object *meta) | ||||
| 			return -1; | ||||
| 		} | ||||
| 
 | ||||
| 		cpu_init_begin(cpu, index, 0); | ||||
| 		cpu_init_begin(cpu, index, phyid, 0); | ||||
| 
 | ||||
| 		if (loom_add_cpu(loom, cpu) != 0) { | ||||
| 			err("loom_add_cpu() failed"); | ||||
|  | ||||
| @ -23,12 +23,12 @@ pre_thread_execute(struct emu *emu, struct thread *th) | ||||
| 		return -1; | ||||
| 	} | ||||
| 
 | ||||
| 	int cpuid = emu->ev->payload->i32[0]; | ||||
| 	struct cpu *cpu = loom_find_cpu(emu->loom, cpuid); | ||||
| 	int index = emu->ev->payload->i32[0]; | ||||
| 	struct cpu *cpu = loom_get_cpu(emu->loom, index); | ||||
| 
 | ||||
| 	if (cpu == NULL) { | ||||
| 		err("cannot find CPU with phyid %d in loom %s", | ||||
| 				cpuid, emu->loom->id); | ||||
| 		err("cannot find CPU with index %d in loom %s", | ||||
| 				index, emu->loom->id); | ||||
| 		return -1; | ||||
| 	} | ||||
| 
 | ||||
| @ -213,12 +213,12 @@ pre_affinity_set(struct emu *emu) | ||||
| 		return -1; | ||||
| 	} | ||||
| 
 | ||||
| 	/* Migrate current cpu to the one at phyid */ | ||||
| 	int phyid = emu->ev->payload->i32[0]; | ||||
| 	struct cpu *newcpu = loom_find_cpu(emu->loom, phyid); | ||||
| 	/* Migrate current cpu to the one at index */ | ||||
| 	int index = emu->ev->payload->i32[0]; | ||||
| 	struct cpu *newcpu = loom_get_cpu(emu->loom, index); | ||||
| 
 | ||||
| 	if (newcpu == NULL) { | ||||
| 		err("cannot find cpu with phyid %d", phyid); | ||||
| 		err("cannot find cpu with index %d", index); | ||||
| 		return -1; | ||||
| 	} | ||||
| 
 | ||||
| @ -244,7 +244,7 @@ pre_affinity_set(struct emu *emu) | ||||
| static int | ||||
| pre_affinity_remote(struct emu *emu) | ||||
| { | ||||
| 	int32_t phyid = emu->ev->payload->i32[0]; | ||||
| 	int32_t index = emu->ev->payload->i32[0]; | ||||
| 	int32_t tid = emu->ev->payload->i32[1]; | ||||
| 
 | ||||
| 	struct thread *remote_th = proc_find_thread(emu->proc, tid); | ||||
| @ -276,10 +276,10 @@ pre_affinity_remote(struct emu *emu) | ||||
| 		return -1; | ||||
| 	} | ||||
| 
 | ||||
| 	/* Migrate current cpu to the one at phyid */ | ||||
| 	struct cpu *newcpu = loom_find_cpu(emu->loom, phyid); | ||||
| 	/* Migrate current cpu to the one at index */ | ||||
| 	struct cpu *newcpu = loom_get_cpu(emu->loom, index); | ||||
| 	if (newcpu == NULL) { | ||||
| 		err("cannot find CPU with phyid %d", phyid); | ||||
| 		err("cannot find CPU with index %d", index); | ||||
| 		return -1; | ||||
| 	} | ||||
| 
 | ||||
| @ -293,7 +293,7 @@ pre_affinity_remote(struct emu *emu) | ||||
| 		return -1; | ||||
| 	} | ||||
| 
 | ||||
| 	dbg("remote_th %d remotely switches to cpu %d", tid, phyid); | ||||
| 	dbg("remote_th %d remotely switches to cpu %d", tid, index); | ||||
| 
 | ||||
| 	return 0; | ||||
| } | ||||
|  | ||||
| @ -278,41 +278,36 @@ init_global_indices(struct system *sys) | ||||
| } | ||||
| 
 | ||||
| static int | ||||
| init_cpu_name(struct loom *loom, struct cpu *cpu, int virtual) | ||||
| init_end_system(struct system *sys) | ||||
| { | ||||
| 	size_t i = loom_get_gindex(loom); | ||||
| 	size_t j = cpu_get_phyid(cpu); | ||||
| 	int n = 0; | ||||
| 	char name[PATH_MAX]; | ||||
| 
 | ||||
| 	if (virtual) | ||||
| 		n = snprintf(name, PATH_MAX, "vCPU %ld.*", i); | ||||
| 	else | ||||
| 		n = snprintf(name, PATH_MAX, "CPU %ld.%ld", i, j); | ||||
| 
 | ||||
| 	if (n >= PATH_MAX) { | ||||
| 		err("cpu name too long"); | ||||
| 		return -1; | ||||
| 	} | ||||
| 
 | ||||
| 	cpu_set_name(cpu, name); | ||||
| 
 | ||||
| 	return 0; | ||||
| } | ||||
| 
 | ||||
| static int | ||||
| init_cpu_names(struct system *sys) | ||||
| { | ||||
| 	for (struct loom *loom = sys->looms; loom; loom = loom->next) { | ||||
| 		for (struct cpu *cpu = loom->cpus; cpu; cpu = cpu->hh.next) { | ||||
| 			if (init_cpu_name(loom, cpu, 0) != 0) | ||||
| 	for (struct loom *l = sys->looms; l; l = l->next) { | ||||
| 		for (struct proc *p = l->procs; p; p = p->hh.next) { | ||||
| 			for (struct thread *t = p->threads; t; t = t->hh.next) { | ||||
| 				if (thread_init_end(t) != 0) { | ||||
| 					err("thread_init_end failed"); | ||||
| 					return -1; | ||||
| 				} | ||||
| 			} | ||||
| 			if (proc_init_end(p) != 0) { | ||||
| 				err("proc_init_end failed"); | ||||
| 				return -1; | ||||
| 			} | ||||
| 		} | ||||
| 		struct cpu *vcpu = loom_get_vcpu(loom); | ||||
| 		if (init_cpu_name(loom, vcpu, 1) != 0) | ||||
| 		for (struct cpu *cpu = l->cpus; cpu; cpu = cpu->hh.next) { | ||||
| 			if (cpu_init_end(cpu) != 0) { | ||||
| 				err("cpu_init_end failed"); | ||||
| 				return -1; | ||||
| 			} | ||||
| 		} | ||||
| 		if (cpu_init_end(&l->vcpu) != 0) { | ||||
| 			err("cpu_init_end failed"); | ||||
| 			return -1; | ||||
| 		} | ||||
| 		if (loom_init_end(l) != 0) { | ||||
| 			err("loom_init_end failed"); | ||||
| 			return -1; | ||||
| 		} | ||||
| 	} | ||||
| 
 | ||||
| 	return 0; | ||||
| } | ||||
| 
 | ||||
| @ -433,40 +428,6 @@ init_offsets(struct system *sys, struct trace *trace) | ||||
| 	return 0; | ||||
| } | ||||
| 
 | ||||
| static int | ||||
| init_end_system(struct system *sys) | ||||
| { | ||||
| 	for (struct loom *l = sys->looms; l; l = l->next) { | ||||
| 		for (struct proc *p = l->procs; p; p = p->hh.next) { | ||||
| 			for (struct thread *t = p->threads; t; t = t->hh.next) { | ||||
| 				if (thread_init_end(t) != 0) { | ||||
| 					err("thread_init_end failed"); | ||||
| 					return -1; | ||||
| 				} | ||||
| 			} | ||||
| 			if (proc_init_end(p) != 0) { | ||||
| 				err("proc_init_end failed"); | ||||
| 				return -1; | ||||
| 			} | ||||
| 		} | ||||
| 		for (struct cpu *cpu = l->cpus; cpu; cpu = cpu->hh.next) { | ||||
| 			if (cpu_init_end(cpu) != 0) { | ||||
| 				err("cpu_init_end failed"); | ||||
| 				return -1; | ||||
| 			} | ||||
| 		} | ||||
| 		if (cpu_init_end(&l->vcpu) != 0) { | ||||
| 			err("cpu_init_end failed"); | ||||
| 			return -1; | ||||
| 		} | ||||
| 		if (loom_init_end(l) != 0) { | ||||
| 			err("loom_init_end failed"); | ||||
| 			return -1; | ||||
| 		} | ||||
| 	} | ||||
| 	return 0; | ||||
| } | ||||
| 
 | ||||
| int | ||||
| system_init(struct system *sys, struct emu_args *args, struct trace *trace) | ||||
| { | ||||
| @ -488,9 +449,8 @@ system_init(struct system *sys, struct emu_args *args, struct trace *trace) | ||||
| 	/* Now that we have loaded all resources, populate the indices */ | ||||
| 	init_global_indices(sys); | ||||
| 
 | ||||
| 	/* Set CPU names like "CPU 1.34" */ | ||||
| 	if (init_cpu_names(sys) != 0) { | ||||
| 		err("init_cpu_names() failed"); | ||||
| 	if (init_end_system(sys) != 0) { | ||||
| 		err("init_end_system failed"); | ||||
| 		return -1; | ||||
| 	} | ||||
| 
 | ||||
| @ -506,11 +466,6 @@ system_init(struct system *sys, struct emu_args *args, struct trace *trace) | ||||
| 		return -1; | ||||
| 	} | ||||
| 
 | ||||
| 	if (init_end_system(sys) != 0) { | ||||
| 		err("init_end_system failed"); | ||||
| 		return -1; | ||||
| 	} | ||||
| 
 | ||||
| 	/* Finaly dump the system */ | ||||
| 	if (0) | ||||
| 		print_system(sys); | ||||
|  | ||||
| @ -1,15 +1,20 @@ | ||||
| #include "emu/cpu.h" | ||||
| #include "emu/loom.h" | ||||
| #include "common.h" | ||||
| 
 | ||||
| static void | ||||
| test_oversubscription(void) | ||||
| { | ||||
| 	struct loom loom; | ||||
| 	loom_init_begin(&loom, "loom.0"); | ||||
| 
 | ||||
| 	struct cpu cpu; | ||||
| 
 | ||||
| 	int phyid = 0; | ||||
| 	cpu_init_begin(&cpu, phyid, 0); | ||||
| 	cpu_set_name(&cpu, "cpu0"); | ||||
| 	int index = 0; | ||||
| 	cpu_init_begin(&cpu, index, phyid, 0); | ||||
| 	cpu_set_gindex(&cpu, 0); | ||||
| 	cpu_set_loom(&cpu, &loom); | ||||
| 	if (cpu_init_end(&cpu) != 0) | ||||
| 		die("cpu_init_end failed"); | ||||
| 
 | ||||
|  | ||||
| @ -53,7 +53,7 @@ test_negative_cpu(struct loom *loom) | ||||
| 		die("loom_init_begin failed"); | ||||
| 
 | ||||
| 	struct cpu cpu; | ||||
| 	cpu_init_begin(&cpu, -1, 0); | ||||
| 	cpu_init_begin(&cpu, -1, -1, 0); | ||||
| 
 | ||||
| 	if (loom_add_cpu(loom, &cpu) == 0) | ||||
| 		die("loom_add_cpu didn't fail"); | ||||
| @ -68,7 +68,7 @@ test_duplicate_cpus(struct loom *loom) | ||||
| 		die("loom_init_begin failed"); | ||||
| 
 | ||||
| 	struct cpu cpu; | ||||
| 	cpu_init_begin(&cpu, 123, 0); | ||||
| 	cpu_init_begin(&cpu, 123, 123, 0); | ||||
| 	if (loom_add_cpu(loom, &cpu) != 0) | ||||
| 		die("loom_add_cpu failed"); | ||||
| 
 | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user