From owner-svn-src-projects@FreeBSD.ORG Tue May 24 15:02:42 2011 Return-Path: Delivered-To: svn-src-projects@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id C86421065672; Tue, 24 May 2011 15:02:42 +0000 (UTC) (envelope-from nwhitehorn@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id 9FB158FC16; Tue, 24 May 2011 15:02:42 +0000 (UTC) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.4/8.14.4) with ESMTP id p4OF2gNJ073254; Tue, 24 May 2011 15:02:42 GMT (envelope-from nwhitehorn@svn.freebsd.org) Received: (from nwhitehorn@localhost) by svn.freebsd.org (8.14.4/8.14.4/Submit) id p4OF2gU7073251; Tue, 24 May 2011 15:02:42 GMT (envelope-from nwhitehorn@svn.freebsd.org) Message-Id: <201105241502.p4OF2gU7073251@svn.freebsd.org> From: Nathan Whitehorn Date: Tue, 24 May 2011 15:02:42 +0000 (UTC) To: src-committers@freebsd.org, svn-src-projects@freebsd.org X-SVN-Group: projects MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r222258 - in projects/pseries/powerpc: include pseries X-BeenThere: svn-src-projects@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "SVN commit messages for the src " projects" tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 24 May 2011 15:02:42 -0000 Author: nwhitehorn Date: Tue May 24 15:02:42 2011 New Revision: 222258 URL: http://svn.freebsd.org/changeset/base/222258 Log: Provide SMP topology detection and bump MAXCPU to match other platforms. Modified: projects/pseries/powerpc/include/param.h projects/pseries/powerpc/pseries/platform_chrp.c Modified: projects/pseries/powerpc/include/param.h ============================================================================== --- projects/pseries/powerpc/include/param.h Tue May 24 14:36:32 2011 (r222257) +++ projects/pseries/powerpc/include/param.h Tue May 24 15:02:42 2011 (r222258) @@ -68,7 +68,7 @@ #endif #if defined(SMP) || defined(KLD_MODULE) -#define MAXCPU 4 +#define MAXCPU 32 #else #define MAXCPU 1 #endif /* SMP || KLD_MODULE */ Modified: projects/pseries/powerpc/pseries/platform_chrp.c ============================================================================== --- projects/pseries/powerpc/pseries/platform_chrp.c Tue May 24 14:36:32 2011 (r222257) +++ projects/pseries/powerpc/pseries/platform_chrp.c Tue May 24 15:02:42 2011 (r222258) @@ -69,6 +69,9 @@ static int chrp_smp_first_cpu(platform_t static int chrp_smp_next_cpu(platform_t, struct cpuref *cpuref); static int chrp_smp_get_bsp(platform_t, struct cpuref *cpuref); static int chrp_smp_start_cpu(platform_t, struct pcpu *cpu); +#ifdef SMP +static struct cpu_group *chrp_smp_topo(platform_t plat); +#endif static void chrp_reset(platform_t); static platform_method_t chrp_methods[] = { @@ -82,6 +85,9 @@ static platform_method_t chrp_methods[] PLATFORMMETHOD(platform_smp_next_cpu, chrp_smp_next_cpu), PLATFORMMETHOD(platform_smp_get_bsp, chrp_smp_get_bsp), PLATFORMMETHOD(platform_smp_start_cpu, chrp_smp_start_cpu), +#ifdef SMP + PLATFORMMETHOD(platform_smp_topo, chrp_smp_topo), +#endif PLATFORMMETHOD(platform_reset, chrp_reset), @@ -312,6 +318,39 @@ chrp_smp_start_cpu(platform_t plat, stru return ((pc->pc_awake) ? 0 : EBUSY); } +#ifdef SMP +static struct cpu_group * +chrp_smp_topo(platform_t plat) +{ + struct pcpu *pc, *last_pc; + int i, ncores, ncpus; + + ncores = ncpus = 0; + last_pc = NULL; + for (i = 0; i <= mp_maxid; i++) { + pc = pcpu_find(i); + if (pc == NULL) + continue; + if (last_pc == NULL || pc->pc_hwref != last_pc->pc_hwref) + ncores++; + last_pc = pc; + ncpus++; + } + + if (ncpus % ncores != 0) { + printf("WARNING: Irregular SMP topology. Performance may be " + "suboptimal (%d CPUS, %d cores)\n", ncpus, ncores); + return (smp_topo_none()); + } + + /* Don't do anything fancier for non-threaded SMP */ + if (ncpus == ncores) + return (smp_topo_none()); + + return (smp_topo_1level(CG_SHARE_L1, ncpus / ncores, CG_FLAG_SMT)); +} +#endif + static void chrp_reset(platform_t platform) {