目次: Android
半年くらい前(2017年9月30日の日記参照)にCMAを調べたときはわからなかった問題が一つ解決しました。
悩みはこの3つで、1つ目はほぼ解決(THPを使わない)していて、2つ目は未だに良くわからないままです。今回は3つ目の問題が解消しました。
前回の調査では/proc/meminfoを調べていて、CmaFreeの項目がなかったため、誰もCMAを使っていないのではないかと思っていました。
MemTotal: 3687912 kB MemFree: 380032 kB MemAvailable: 1527068 kB Buffers: 51344 kB Cached: 1137352 kB SwapCached: 5848 kB Active: 1483616 kB Inactive: 784324 kB Active(anon): 897704 kB Inactive(anon): 203852 kB Active(file): 585912 kB Inactive(file): 580472 kB Unevictable: 3632 kB Mlocked: 3632 kB SwapTotal: 524284 kB SwapFree: 70164 kB Dirty: 0 kB Writeback: 0 kB AnonPages: 1080040 kB Mapped: 587568 kB Shmem: 22300 kB Slab: 210492 kB SReclaimable: 79676 kB SUnreclaim: 130816 kB KernelStack: 39184 kB PageTables: 43764 kB NFS_Unstable: 0 kB Bounce: 0 kB WritebackTmp: 0 kB CommitLimit: 2368240 kB Committed_AS: 71185752 kB VmallocTotal: 258998208 kB VmallocUsed: 157168 kB VmallocChunk: 258691972 kB ★★CmaTotalやCmaFreeが無いのに…★★
ふと/proc/pagetypeinfoを見たところCMAの項目が出ました。meminfoには出ないのにpagetypeinfoには出てくるの??
Page block order: 10 Pages per block: 1024 Free pages count per migrate type at order 0 1 2 3 4 5 6 7 8 9 10 Node 0, zone DMA, type Unmovable 53146 18233 851 1 0 0 0 0 0 0 0 Node 0, zone DMA, type Reclaimable 1938 120 9 3 0 0 0 0 0 0 0 Node 0, zone DMA, type Movable 195 17 12 3 0 0 0 0 0 0 0 Node 0, zone DMA, type CMA 0 0 0 0 0 0 0 0 0 0 0 Node 0, zone DMA, type Reserve 0 1 16 0 0 0 0 0 0 0 0 Node 0, zone DMA, type Isolate 0 0 0 0 0 0 0 0 0 0 0 Number of blocks type Unmovable Reclaimable Movable CMA Reserve Isolate Node 0, zone DMA 539 35 298 51 2 0 ★★MIGRATE_CMAがカウントされている★★
他の機種を見てもmeminfoにはCMAの項目はなくpagetypeinfoにCMAの項目が出ていました。なぜmeminfoに表示されないのかわかりませんが、理由は後で考えるとして、一番下に出てくるNumber of blocksが知りたかった情報です。
行がZoneを表します。ZenFoneはZone DMAしかありません。機種によってはZone DMAとZone Normalの2本立てになっていることもあります。
列がMIGRATE_TYPEです。数値の単位はページでは無くブロックです。ブロックはpagetypeinfoの先頭に「Pages per block: 1024」とある通り、1ブロック=1024ページです。ARMは1ページ4KBなので1ブロックは4MBになります。1ブロックのページ数はカーネルコンフィグによって変わりますので、どの機種でも常に4MBではないことに注意です。
さてZenFone 3 Deluxe ZS550KLというかQualcomm Snapdragon 625のシステム構成という方が近いかもしれませんが…、Linuxが管理している全体のブロック数は925ブロック(3788800KB)で、CMAは51ブロック(208896KB)のようです。
物理的に搭載されているRAMが4GBらしいのでLinuxの管理外となっている領域は、4194304 - 3788800 = 405504KBだと思われます。かなり大きいです。もしかするとデコード/エンコード用の領域はこちらから取っているのかもしれません。
またmeminfoによればMemTotalが3687912KBですので、Linux管理内だけど使うことができないReserved領域は、3788800 - 3687912 = 100888KBだと思われます。内訳はわかりませんが、多くも少なくもないと思います。たぶん。
1. 物理搭載メモリ | 4194304KB |
---|---|
2. Linux管理内 | 3788800KB |
3. Linux管理外(1. - 2.) | 405504KB |
4. MemTotal | 3687912KB |
5. Reserved領域(2. - 4.) | 100888KB |
私の推測としてはCMA領域(204MB)では4K動画をデコード/エンコードするには足りなさそうなので、Linux管理外の領域を使っているんだろうなーと思います。
どうしてpagetypeinfoにはCMAの項目があって、meminfoにはCMAの項目がないのか?カーネルのコードを見る限りCONFIG_CMAが有効になっていたら必ずmeminfoに項目が出るはずなのに、出てこない理由が良くわかりません。
手持ちのAndroid機器を見ていたら、カーネルバージョンがやたら古いことに気づきました。Android機器ってほとんどLinux 3.18とか3.10とか…、とかく3.x系のバージョンが多くないですか?
ああ、これまさか、古いバージョンのカーネルだとmeminfoにCMAの項目が出ないのか??と思って、3.x系のカーネルのコードを見ると、meminfoにCMAが表示されるようになったのが3.19以降であることがわかりました。
道理でmeminfoにCMAの項目が出ない訳ですよ。こんな単純なことに気づかなかったとは……orz
< | 2018 | > | ||||
<< | < | 01 | > | >> | ||
日 | 月 | 火 | 水 | 木 | 金 | 土 |
- | 1 | 2 | 3 | 4 | 5 | 6 |
7 | 8 | 9 | 10 | 11 | 12 | 13 |
14 | 15 | 16 | 17 | 18 | 19 | 20 |
21 | 22 | 23 | 24 | 25 | 26 | 27 |
28 | 29 | 30 | 31 | - | - | - |
合計:
本日:
管理者: Katsuhiro Suzuki(katsuhiro( a t )katsuster.net)
This is Simple Diary 1.0
Copyright(C) Katsuhiro Suzuki 2006-2023.
Powered by PHP 8.2.18.
using GD 2.3.3(png support.)