On 12/17/2012 23:40, Oleksandr Tymoshenko wrote:
> On 2012-12-08, at 1:21 PM, Alan Cox <a...@rice.edu> wrote:
>
>> On 12/08/2012 14:32, Andre Oppermann wrote:
> .. skipped ..
>
>>> The trouble seems to come from NSFBUFS which is (512 + maxusers * 16)
>>> resulting in a kernel map of (512 + 400 * 16) * PAGE_SIZE = 27MB.  This
>>> seem to be pushing it with the smaller ARM kmap layout.
>>>
>>> Does it boot and run when you set the tunable kern.ipc.nsfbufs=3500?
>>>
>>> ARM does have a direct map mode as well which doesn't require the
>>> allocation
>>> of sfbufs.  I'm not sure which other problems that approach has.
>>>
>>
>> Only a few (3?) platforms use it.  It reduces the size of the user
>> address space, and translation between physical addresses and direct map
>> addresses is not computationally trivial as it is on other
>> architectures, e.g., amd64, ia64.  However, it does try to use large
>> page mappings.
>>
>>
>>> Hopefully alc@ (added to cc) can answer that and also why the kmap of
>>> 27MB
>>> manages to wrench the ARM kernel.
>>>
>>
>> Arm does not define caps on either the buffer map size (param.h) or the
>> kmem map size (vmparam.h).  It would probably make sense to copy these
>> definitions from i386.
>
> Adding caps didn't help. I did some digging and found out that although 
> address range
> 0xc0000000 .. 0xffffffff is indeed valid for ARM in general actual KVA space 
> varies for
> each specific hardware platform. This "real" KVA is defined by 
> <virtual_avail, virtual_end>
> pair and ifI use them instead of <VM_MIN_KERNEL_ADDRESS, 
> VM_MAX_KERNEL_ADDRESS>
> in init_param2 function my pandaboard successfully boots. Since former pair 
> is used for defining 
> kernel_map boundaries I believe it should be used for auto tuning as well. 


That makes sense.  However, "virtual_avail" isn't the start of the
kernel address space.  The kernel map always starts at
VM_MIN_KERNEL_ADDRESS.  (See kmem_init().)  "virtual_avail" represents
the next unallocated virtual address in the kernel address space at an
early point in initialization.  "virtual_avail" and "virtual_end" aren't
used after that, or outside the VM system.  Please use
vm_map_min(kernel_map) and vm_map_max(kernel_map) instead.

That said, I would still add caps on the buffer map and kmem map size. 
As memory sizes on arm systems grow, you'll eventually need them, just
like we did on i386.

Alan

_______________________________________________
svn-src-all@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to