Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 17 Jun 2009 21:03:18 -0600 (MDT)
From:      "M. Warner Losh" <imp@bsdimp.com>
To:        jroberson@jroberson.net
Cc:        arch@FreeBSD.org, grehan@FreeBSD.org, marius@alchemy.franken.de
Subject:   Re: Dynamic pcpu, arm, mips, powerpc, sun, etc. help needed
Message-ID:  <20090617.210318.1878034641.imp@bsdimp.com>
In-Reply-To: <alpine.BSF.2.00.0906171231540.1025@desktop>
References:  <20090609201127.GA50903@alchemy.franken.de> <4A2F1148.9090706@freebsd.org> <alpine.BSF.2.00.0906171231540.1025@desktop>

next in thread | previous in thread | raw e-mail | index | archive | help
In message: <alpine.BSF.2.00.0906171231540.1025@desktop>
            Jeff Roberson <jroberson@jroberson.net> writes:
: 
: On Tue, 9 Jun 2009, Peter Grehan wrote:
: 
: >> As for sparc64 allocating the storage for the dynamic area
: >> from end probably isn't a good idea as the pmap code assumes
: >> that the range from KERNBASE to end is covered by the pages
: >> allocated by and locked into the TLB for the kernel by the
: >> loader
: >
: > Ditto for ppc. It's possible to get the additional space from within or 
: > after return from pmap_bootstrap() (like thread0's kstack, or the msgbuf).
: 
: http://people.freebsd.org/~jeff/dpcpu.diff
: 
: I have updated this patch based on feedback relating to various 
: architectures md code.  I tried to model most architectures after the way 
: msgbuf memory was taken.  I have no capacity to test anything other than 
: i386 and amd64.  ARM is reported to work with one minor diff.  Apparently 
: sparc64 worked with the earlier diff but this should be cleaner.  If 
: anyone can report back on sparc64, mips, or powerpc, I'd appreciate it.


I don't understand this part of the patch:

Index: mips/mips/mp_machdep.c
===================================================================
--- mips/mips/mp_machdep.c	(revision 194275)
+++ mips/mips/mp_machdep.c	(working copy)
@@ -224,12 +224,15 @@ static int
 smp_start_secondary(int cpuid)
 {
 	struct pcpu *pcpu;
+	void *dpcpu;
 	int i;
 
 	if (bootverbose)
 		printf("smp_start_secondary: starting cpu %d\n", cpuid);
 
+	dpcpu = (void *)kmem_alloc(kernel_map, DPCPU_SIZE);
 	pcpu_init(&__pcpu[cpuid], cpuid, sizeof(struct pcpu));
+	dpcpu_init(dpcpu, cpuid);
 
 	if (bootverbose)
 		printf("smp_start_secondary: cpu %d started\n", cpuid);

So were adding a dynamic per-cpu area, in addition to the fixed part?

Warner



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20090617.210318.1878034641.imp>