To try to understand how the CMA is allocated - and what the problem
might be - I booted a HiSilicon D06 w/ plenty of cma cushion (cma=128M),
and looked at cma debugfs. In the upstream thread, Robin asked if this
was potentially an issue with lots of 1 page allocations - something for
which patches have been proposed. Here's a histogram of allocation
sizes:

$ dmesg | grep "cma: cma_alloc(cma" | sed -r 's/.*count
([0-9]+)\,.*/\1/' | sort -n | uniq -c
   2062 1
     32 2
    266 8
      2 24
      4 32
    256 33
      7 64
      2 128
      2 1024

So, there are 2062 1 page allocations. While that's the largest # of
allocations by page size, that's only really 13% of the allocated pages,
just over 8M. That would get us down to 53M. But we know that total
allocation size isn't the only problem - fragmentation must be playing a
role, as we're using ~61M, but still seeing errors w/ cma=64M.


To understand the fragmentation impact, I looked at the debugfs cma bitmap. I 
converted that map to binary, coalescing repeated lines, and got this:

11111111111111111111111111111111 x309
1111111111111111
11111111111111111111111111111111\__ x252
1                               /
11111111111111111111111111111111
0
11111111111111111111111111111111 x48
0 x412

I don't see any signs of fragmentation w/ the single page allocations.
What is concerning is the 252 33 page allocations (a subset of the 256
in the histogram). They are getting allocated on 64M boundaries, which
ends up leaving 31 free pages per allocation. 256 * 31 * 4K = 31M of
potentially wasted space.

-- 
You received this bug notification because you are a member of Kernel
Packages, which is subscribed to linux in Ubuntu.
https://bugs.launchpad.net/bugs/1823753

Title:
  arm64: cma_alloc errors at boot

Status in linux package in Ubuntu:
  Confirmed

Bug description:
  On some arm64 systems[*] we are seeing a spew of messages on the
  console:

  [   19.534097] cma: cma_alloc: alloc failed, req-size: 64 pages, ret: -12
  [   19.534109] cma: cma_alloc: alloc failed, req-size: 16 pages, ret: -12
  [   19.534113] cma: cma_alloc: alloc failed, req-size: 64 pages, ret: -12
  [   19.534126] cma: cma_alloc: alloc failed, req-size: 16 pages, ret: -12
  [   19.534130] cma: cma_alloc: alloc failed, req-size: 64 pages, ret: -12
  [   19.534142] cma: cma_alloc: alloc failed, req-size: 16 pages, ret: -12
  [   19.534146] cma: cma_alloc: alloc failed, req-size: 64 pages, ret: -12
  [   19.534157] cma: cma_alloc: alloc failed, req-size: 16 pages, ret: -12
  [   19.534161] cma: cma_alloc: alloc failed, req-size: 64 pages, ret: -12
  [   19.534173] cma: cma_alloc: alloc failed, req-size: 16 pages, ret: -12
  [   19.534177] cma: cma_alloc: alloc failed, req-size: 64 pages, ret: -12

  This appears to be non-fatal - impacted systems all eventually boot.
  But, at least in the case of the HP m400, it slows down boot enough
  that MAAS' default timeout will expire before completing deployment.

  [*] Observed on a HiSilicon D06 w/ SMMU disabled in the BIOS, as well
  as an HP m400 (APM X-Gene) cartridge - although, not on another one
  that - in theory - should be identical.

To manage notifications about this bug go to:
https://bugs.launchpad.net/ubuntu/+source/linux/+bug/1823753/+subscriptions

-- 
Mailing list: https://launchpad.net/~kernel-packages
Post to     : kernel-packages@lists.launchpad.net
Unsubscribe : https://launchpad.net/~kernel-packages
More help   : https://help.launchpad.net/ListHelp

Reply via email to