No subject
Sun Jun 6 12:36:48 EDT 2010
usage scenarios better or worse. This results in higher or lower memory
fragmentation. System use cases are something that kernel or drivers are
definitely not aware, so only user space can tune this parameter to get the
best possible system behavior.
> We can always add more complex scenarios later, but for an initial version
> I'd keep it simple.
>
> > +
> > + 2. CMA allows a run-time configuration of the memory regions it
> > + will use to allocate chunks of memory from. The set of memory
> > + regions is given on command line so it can be easily changed
> > + without the need for recompiling the kernel.
> > +
> > + Each region has it's own size, alignment demand, a start
> > + address (physical address where it should be placed) and an
> > + allocator algorithm assigned to the region.
> > +
> > + This means that there can be different algorithms running at
> > + the same time, if different devices on the platform have
> > + distinct memory usage characteristics and different algorithm
> > + match those the best way.
>
> Seems overengineering to me. Just ensure that the code can be extended
> later to such hypothetical scenarios. They are hypothetical, right?
Not really. Having the possibility to reconfigure memory configuration
without kernel recompilation is very handy when one is tuning the
configuration for the specific use case.
> > + 3. When requesting memory, devices have to introduce themselves.
> > + This way CMA knows who the memory is allocated for. This
> > + allows for the system architect to specify which memory regions
> > + each device should use.
> > +
> > + 3a. Devices can also specify a "kind" of memory they want.
> > + This makes it possible to configure the system in such
> > + a way, that a single device may get memory from different
> > + memory regions, depending on the "kind" of memory it
> > + requested. For example, a video codec driver might want to
> > + allocate some shared buffers from the first memory bank and
> > + the other from the second to get the highest possible
> > + memory throughput.
>
> Not sure I understand this. Isn't this just two regions, one for each
> memory bank,
> and the driver requests some buffers from one region and some from the
> other?
Right.
> Not sure how a 'kind of memory' features in this.
This 'kind' is a just cookie or a label used by the driver to distinguish
requests for both memory banks. This functionality is essential for our
hardware (just for hardware video codec we have 3 'kinds' of memory: memory
bank A, memory bank B and special region for the firmware).
> > + 4. For greater flexibility and extensibility, the framework allows
> > + device drivers to register private regions of reserved memory
> > + which then may be used only by them.
> > +
> > + As an effect, if a driver would not use the rest of the CMA
> > + interface, it can still use CMA allocators and other
> > + mechanisms.
>
> Why would you? Is there an actual driver that will need this?
This feature has been added after posting v1 of this rfc/patch. Jonathan
Corbet suggested in <http://article.gmane.org/gmane.linux.kernel.mm/50689>
that viafb driver might register its own private memory and use cma just
as an allocator. IMHO this is a good idea, this way we might remove a bunch
of custom allocators from the drivers (yes, there are such all over the
kernel).
> > + 4a. Early in boot process, device drivers can also request the
> > + CMA framework to a reserve a region of memory for them
> > + which then will be used as a private region.
> > +
> > + This way, drivers do not need to directly call bootmem,
> > + memblock or similar early allocator but merely register an
> > + early region and the framework will handle the rest
> > + including choosing the right early allocator.
>
> The whole concept of private regions seems unnecessary to me.
>
> <big snip>
>
> It looks to me as if you tried to think of all possible hypothetical
> situations
> and write a framework for that. Of course, you may know more than I do, and
> some of these situations actually happen.
Not exactly. We tried to design a solution that would cover all requirements
for OUR (quite specific) embedded hardware. However we didn't want to tie it
only to our platform. We just generalized most of our requirements so they can
be reused for other systems.
> The basic design ideas are solid, I think. But you should get rid of all
> the fancy features and go back to basics. We can always add those features
> later should that become necessary. But removing features is much, much
harder.
Well, please keep in mind that we cannot remove features that are essential
for our solution. We know that a simple framework have some advantages
(well, the most important one is the fact that it is easy to understand),
but making it too simple would render it useless from our point of view
(if it would not provide functionality required by our drivers and hardware).
Best regards
--
Marek Szyprowski
Samsung Poland R&D Center
More information about the linux-arm-kernel
mailing list