lists.openwall.net   lists  /  announce  owl-users  owl-dev  john-users  john-dev  passwdqc-users  yescrypt  popa3d-users  /  oss-security  kernel-hardening  musl  sabotage  tlsify  passwords  /  crypt-dev  xvendor  /  Bugtraq  Full-Disclosure  linux-kernel  linux-netdev  linux-ext4  linux-hardening  linux-cve-announce  PHC 
Open Source and information security mailing list archives
 
Hash Suite: Windows password security audit tool. GUI, reports in PDF.
[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <c2efeb24-0da0-ee25-7cb9-2b9b05523f25@redhat.com>
Date:   Mon, 19 Sep 2022 13:03:25 +0200
From:   David Hildenbrand <david@...hat.com>
To:     Michael Nazzareno Trimarchi <michael@...rulasolutions.com>
Cc:     Mike Rapoport <rppt@...nel.org>,
        LKML <linux-kernel@...r.kernel.org>,
        Andrew Morton <akpm@...ux-foundation.org>
Subject: Re: Correlation CMA size and FORCE_MAX_ZONEORDER

On 19.09.22 11:57, Michael Nazzareno Trimarchi wrote:
> Hi
> 
> On Mon, Sep 19, 2022 at 11:31 AM David Hildenbrand <david@...hat.com> wrote:
>>
>> On 19.09.22 11:17, Michael Nazzareno Trimarchi wrote:
>>> Hi David
>>>
>>> On Mon, Sep 19, 2022 at 10:38 AM David Hildenbrand <david@...hat.com> wrote:
>>>>
>>>> On 15.09.22 23:36, Michael Nazzareno Trimarchi wrote:
>>>>> Hi all
>>>>
>>>> Hi,
>>>>
>>>>>
>>>>> Working on a small device with 128MB of memory and using imx_v6_v7
>>>>> defconfig I found that CMA_SIZE_MBYTES, CMA_SIZE_PERCENTAGE
>>>>> are not respected. The calculation done does not allow the requested
>>>>> size. I think that this should be somehow documented and described but
>>>>> I did not
>>>>> find the documentation. Does it work this way?
>>>>>
>>>>> With CMA_SIZE of 8MB I need to have FORCE_MAX_ZONEORDER=12 if I have
>>>>> the default FORCE_MAX_ZONEORDER=14 the min size is 32Mb
>>>>
>>>> The underlying constraint is that CMA regions require a certain minimum
>>>> alignment+size. They cannot be arbitrarily in size.
>>>>
>>>> CMA_MIN_ALIGNMENT_BYTES expresses that, and corresponds in upstream
>>>> kernels to the size of a single pageblock.
>>>>
>>>> In previous kernels, it used to be the size of the largest buddy
>>>> allocation granularity (derived from MAX_ORDER, derived from
>>>> FORCE_MAX_ZONEORDER).
>>>>
>>>> On upstream kernels, the FORCE_MAX_ZONEORDER constraint should no longer
>>>> apply. On most archs, the minimum alignment+size should be 2 MiB
>>>> (x86-64, aarch64 with 4k base pages) -- the size of a single pageblock.
>>>>
>>>> So far the theory. Are you still running into this limitation on
>>>> upstream kernels?
>>>>
>>>
>>> I can run 6-rc2 on my board. I test again but according to it, if I
>>> put 4M as CMA in cma=4M in boot
>>> parameters, the result is 32Mb of CMA. Apart of that seems that
>>> process lime tiny membench can not even start
>>> to mblock memory
>>>
>>
>> The CMA alignemnt change went into v5.19. If "cma=4M" still gives you >
>> 4M, can you post /proc/meminfo and the early console output?
>>
> 
> cat /proc/cmdline
> cma=4M mtdparts=gpmi-nand:4m(nandboot),1m(env),24m(kernel),1m(nanddtb),-(rootfs)
> root=ubi0:root rw ubi.mtd=ro
> otfs rootfstype=ubifs rootwait=1
> # cat /proc/meminfo
> MemTotal:         109560 kB
> MemFree:           56084 kB
> MemAvailable:      56820 kB
> Buffers:               0 kB
> Cached:            39680 kB
> SwapCached:            0 kB
> Active:               44 kB
> Inactive:            644 kB
> Active(anon):         44 kB
> Inactive(anon):      644 kB
> Active(file):          0 kB
> Inactive(file):        0 kB
> Unevictable:       39596 kB
> Mlocked:               0 kB
> HighTotal:             0 kB
> HighFree:              0 kB
> LowTotal:         109560 kB
> LowFree:           56084 kB
> SwapTotal:             0 kB
> SwapFree:              0 kB
> Dirty:                 0 kB
> Writeback:             0 kB
> AnonPages:           628 kB
> Mapped:             1480 kB
> Shmem:                84 kB
> KReclaimable:       4268 kB
> Slab:               8456 kB
> SReclaimable:       4268 kB
> SUnreclaim:         4188 kB
> KernelStack:         392 kB
> PageTables:           88 kB
> NFS_Unstable:          0 kB
> Bounce:                0 kB
> WritebackTmp:          0 kB
> CommitLimit:       54780 kB
> Committed_AS:       1876 kB
> VmallocTotal:     901120 kB
> VmallocUsed:        2776 kB
> VmallocChunk:          0 kB
> Percpu:               72 kB
> CmaTotal:          32768 kB
> CmaFree:           32484 kB
> # uname -a
> Linux buildroot 6.0.0-rc5 #20 SMP Mon Sep 19 11:51:26 CEST 2022 armv7l GNU/Linux
> #
> 
> Then here https://pastebin.com/6MUB2VBM dmesg
> 
> CONFIG_ARM_MODULE_PLTS=y
> CONFIG_FORCE_MAX_ZONEORDER=14
> CONFIG_ALIGNMENT_TRAP=y
> ...
> CONFIG_CMA
> CONFIG_CMA_AREAS=7
> ...
> 
> CONFIG_CMA_SIZE_MBYTES=8
> CONFIG_CMA_SIZE_SEL_MBYTES=y
> 

Thanks!

I assume that in your setup, the pageblock size depends on MAX_ORDER 
and, therefore, FORCE_MAX_ZONEORDER.

This should be the case especially if CONFIG_HUGETLB_PAGE is not defined 
(include/linux/pageblock-flags.h).

In contrast to what I remember, the pageblock size does not seem to 
depend on the THP size (weird) as well.


So, yes, that limitation is still in effect for some kernel configs.

One could make the pageblock size configurable (similar to 
CONFIG_HUGETLB_PAGE_SIZE_VARIABLE) or simply default to a smaller 
pageblock size as default with CONFIG_CMA and !CONFIG_HUGETLB_PAGE.

I imagine something reasonable might be to set the pageblock size to 
2MiB without CONFIG_HUGETLB_PAGE but with CONFIG_CMA.

-- 
Thanks,

David / dhildenb

Powered by blists - more mailing lists

Powered by Openwall GNU/*/Linux Powered by OpenVZ