svn commit: r352611 - head/sys/kern

Mateusz Guzik mjg at FreeBSD.org
Sun Sep 22 20:44:25 UTC 2019


Author: mjg
Date: Sun Sep 22 20:44:24 2019
New Revision: 352611
URL: https://svnweb.freebsd.org/changeset/base/352611

Log:
  lockprof: move per-cpu data to dpcpu
  
  Reviewed by:	kib
  Sponsored by:	The FreeBSD Foundation
  Differential Revision:	https://reviews.freebsd.org/D21747

Modified:
  head/sys/kern/subr_lock.c

Modified: head/sys/kern/subr_lock.c
==============================================================================
--- head/sys/kern/subr_lock.c	Sun Sep 22 20:03:25 2019	(r352610)
+++ head/sys/kern/subr_lock.c	Sun Sep 22 20:44:24 2019	(r352611)
@@ -241,7 +241,9 @@ struct lock_prof_cpu {
 	struct lock_prof_type	lpc_types[2]; /* One for spin one for other. */
 };
 
-struct lock_prof_cpu *lp_cpu[MAXCPU];
+DPCPU_DEFINE_STATIC(struct lock_prof_cpu, lp);
+#define	LP_CPU_SELF	(DPCPU_PTR(lp))
+#define	LP_CPU(cpu)	(DPCPU_ID_PTR((cpu), lp))
 
 volatile int __read_mostly lock_prof_enable;
 static volatile int lock_prof_resetting;
@@ -288,10 +290,8 @@ lock_prof_init(void *arg)
 	int cpu;
 
 	CPU_FOREACH(cpu) {
-		lp_cpu[cpu] = malloc(sizeof(*lp_cpu[cpu]), M_DEVBUF,
-		    M_WAITOK | M_ZERO);
-		lock_prof_init_type(&lp_cpu[cpu]->lpc_types[0]);
-		lock_prof_init_type(&lp_cpu[cpu]->lpc_types[1]);
+		lock_prof_init_type(&LP_CPU(cpu)->lpc_types[0]);
+		lock_prof_init_type(&LP_CPU(cpu)->lpc_types[1]);
 	}
 }
 SYSINIT(lockprof, SI_SUB_SMP, SI_ORDER_ANY, lock_prof_init, NULL);
@@ -331,14 +331,14 @@ lock_prof_reset(void)
 	 * into per-thread lists as well.
 	 */
 	CPU_FOREACH(cpu) {
-		lpc = lp_cpu[cpu];
+		lpc = LP_CPU(cpu);
 		for (i = 0; i < LPROF_CACHE_SIZE; i++) {
 			LIST_REMOVE(&lpc->lpc_types[0].lpt_objs[i], lpo_link);
 			LIST_REMOVE(&lpc->lpc_types[1].lpt_objs[i], lpo_link);
 		}
 	}
 	CPU_FOREACH(cpu) {
-		lpc = lp_cpu[cpu];
+		lpc = LP_CPU(cpu);
 		bzero(lpc, sizeof(*lpc));
 		lock_prof_init_type(&lpc->lpc_types[0]);
 		lock_prof_init_type(&lpc->lpc_types[1]);
@@ -379,7 +379,7 @@ lock_prof_sum(struct lock_prof *match, struct lock_pro
 	dst->name = match->name;
 
 	CPU_FOREACH(cpu) {
-		type = &lp_cpu[cpu]->lpc_types[spin];
+		type = &LP_CPU(cpu)->lpc_types[spin];
 		SLIST_FOREACH(l, &type->lpt_hash[hash], link) {
 			if (l->ticks == t)
 				continue;
@@ -436,8 +436,8 @@ dump_lock_prof_stats(SYSCTL_HANDLER_ARGS)
 	quiesce_all_cpus("profstat", 0);
 	t = ticks;
 	CPU_FOREACH(cpu) {
-		lock_prof_type_stats(&lp_cpu[cpu]->lpc_types[0], sb, 0, t);
-		lock_prof_type_stats(&lp_cpu[cpu]->lpc_types[1], sb, 1, t);
+		lock_prof_type_stats(&LP_CPU(cpu)->lpc_types[0], sb, 0, t);
+		lock_prof_type_stats(&LP_CPU(cpu)->lpc_types[1], sb, 1, t);
 	}
 	lock_prof_enable = enabled;
 
@@ -503,7 +503,7 @@ lock_profile_lookup(struct lock_object *lo, int spin, 
 		p = unknown;
 	hash = (uintptr_t)lo->lo_name * 31 + (uintptr_t)p * 31 + line;
 	hash &= LPROF_HASH_MASK;
-	type = &lp_cpu[PCPU_GET(cpuid)]->lpc_types[spin];
+	type = &LP_CPU_SELF->lpc_types[spin];
 	head = &type->lpt_hash[hash];
 	SLIST_FOREACH(lp, head, link) {
 		if (lp->line == line && lp->file == p &&
@@ -538,7 +538,7 @@ lock_profile_object_lookup(struct lock_object *lo, int
 		if (l->lpo_obj == lo && l->lpo_file == file &&
 		    l->lpo_line == line)
 			return (l);
-	type = &lp_cpu[PCPU_GET(cpuid)]->lpc_types[spin];
+	type = &LP_CPU_SELF->lpc_types[spin];
 	l = LIST_FIRST(&type->lpt_lpoalloc);
 	if (l == NULL) {
 		lock_prof_rejected++;
@@ -674,7 +674,7 @@ lock_profile_release_lock(struct lock_object *lo)
 	lp->cnt_cur += l->lpo_cnt;
 release:
 	LIST_REMOVE(l, lpo_link);
-	type = &lp_cpu[PCPU_GET(cpuid)]->lpc_types[spin];
+	type = &LP_CPU_SELF->lpc_types[spin];
 	LIST_INSERT_HEAD(&type->lpt_lpoalloc, l, lpo_link);
 out:
 	critical_exit();


More information about the svn-src-head mailing list