Dynamic pcpu, arm, mips, powerpc, sun, etc. help needed

Jeff Roberson jroberson at jroberson.net
Mon Jun 22 00:10:00 UTC 2009


On Sun, 21 Jun 2009, Marius Strobl wrote:

> On Wed, Jun 17, 2009 at 12:55:52PM -1000, Jeff Roberson wrote:
>>
>> 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.
>>
>
> The earlier patch worked on sparc64 as long as the kernel
> happened to leave enough room in the last 4MB page allocated
> for it.
> The new version unfortunately doesn't compile on sparc64 as
> pmap_bootstrap_alloc() is static to its pmap.c (I think it
> should also stay that way). Also the memory allocated with
> it isn't safe to be used before we've taken over the trap
> table. A kernel built with the sparc64 bits replaced with
> the following patch boots fine:
> http://people.freebsd.org/~marius/sparc64_dpcpu.diff
> Do you have some simple test case for DPCPU which can be
> used to verify that it actually works?

Thanks very much Marius.  I have updated the patch at:

http://people.freebsd.org/~jeff/dpcpu.diff

I intend to commit this, minus the kern_synch.c diff tomorrow.  There was 
an id in the previous patch that caused each area to be accessed as it was 
added but you'd have to have done a 'show pcpu' in ddb after boot to 
access the area.  I added a counter in kern_synch.c as a better test.

new in this diff:

1)  I made each access cheaper by one instruction by making the pc_dynamic 
pointer relative to the start of the percpu area.

2)  I added two helper functions for sysctl ints and quads that can be 
used for stats.  See the temporary kern_synch.c diff for an example.

3)  sparc64/sun4v by marius

4)  ia64 fixes suggested by marcel.

Thanks,
Jeff

>
> Marius
>


More information about the freebsd-arch mailing list