Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 26 Sep 2014 13:08:40 -0500
From:      Alan Cox <alan.l.cox@gmail.com>
To:        Svatopluk Kraus <onwahe@gmail.com>
Cc:        FreeBSD Arch <freebsd-arch@freebsd.org>
Subject:   Re: vm_page_array and VM_PHYSSEG_SPARSE
Message-ID:  <CAJUyCcPXBuLu0nvaCqpg8NJ6KzAX9BA1Rt%2BooD%2B3pzq%2BFV%2B%2BTQ@mail.gmail.com>
In-Reply-To: <CAFHCsPWkq09_RRDz7fy3UgsRFv8ZbNKdAH2Ft0x6aVSwLPi6BQ@mail.gmail.com>
References:  <CAFHCsPWkq09_RRDz7fy3UgsRFv8ZbNKdAH2Ft0x6aVSwLPi6BQ@mail.gmail.com>

next in thread | previous in thread | raw e-mail | index | archive | help
On Wed, Sep 24, 2014 at 7:27 AM, Svatopluk Kraus <onwahe@gmail.com> wrote:

> Hi,
>
> I and Michal are finishing new ARM pmap-v6 code. There is one problem we've
> dealt with somehow, but now we would like to do it better. It's about
> physical pages which are allocated before vm subsystem is initialized.
> While later on these pages could be found in vm_page_array when
> VM_PHYSSEG_DENSE memory model is used, it's not true for VM_PHYSSEG_SPARSE
> memory model. And ARM world uses VM_PHYSSEG_SPARSE model.
>
> It really would be nice to utilize vm_page_array for such preallocated
> physical pages even when VM_PHYSSEG_SPARSE memory model is used. Things
> could be much easier then. In our case, it's about pages which are used for
> level 2 page tables. In VM_PHYSSEG_SPARSE model, we have two sets of such
> pages. First ones are preallocated and second ones are allocated after vm
> subsystem was inited. We must deal with each set differently. So code is
> more complex and so is debugging.
>
> Thus we need some method how to say that some part of physical memory
> should be included in vm_page_array, but the pages from that region should
> not be put to free list during initialization. We think that such
> possibility could be utilized in general. There could be a need for some
> physical space which:
>
> (1) is needed only during boot and later on it can be freed and put to vm
> subsystem,
>
> (2) is needed for something else and vm_page_array code could be used
> without some kind of its duplication.
>
> There is already some code which deals with blacklisted pages in vm_page.c
> file. So the easiest way how to deal with presented situation is to add
> some callback to this part of code which will be able to either exclude
> whole phys_avail[i], phys_avail[i+1] region or single pages. As the biggest
> phys_avail region is used for vm subsystem allocations, there should be
> some more coding. (However, blacklisted pages are not dealt with on that
> part of region.)
>
> We would like to know if there is any objection:
>
> (1) to deal with presented problem,
> (2) to deal with the problem presented way.
> Some help is very appreciated. Thanks
>
>

As an experiment, try modifying vm_phys.c to use dump_avail instead of
phys_avail when sizing vm_page_array.  On amd64, where the same problem
exists, this allowed me to use VM_PHYSSEG_SPARSE.  Right now, this is
probably my preferred solution.  The catch being that not all architectures
implement dump_avail, but my recollection is that arm does.



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?CAJUyCcPXBuLu0nvaCqpg8NJ6KzAX9BA1Rt%2BooD%2B3pzq%2BFV%2B%2BTQ>