linux

cgroup: プロセスが所属しているmemoryサブシステムが使用しているメモリの使用量を見るツール

pythonでなんとなく。 show memory usage in memcg. memoryサブシステムにtest1を作ってメモリの上限を100Mで設定。 root@saga:/sys/fs/cgroup/memory/test1# cat memory.limit_in_bytes 104857600 root@saga:/sys/fs/cgroup/memory/test1# cat memory.memsw…

memory cgroupとpageのLRUめも

カーネルは4.1系です。 include/linux/mm_inline.hにLRUへの登録・削除処理の実装があります。 static __always_inline void add_page_to_lru_list(struct page *page, struct lruvec *lruvec, enum lru_list lru) { int nr_pages = hpage_nr_pages(page); m…

Linuxのsystem call fuzzer「syzkaller」めも

Linuxのシステムコールのファジングツールとしてsyzkallerというのがあって、これはコードカバレッジを見つつ入力を変えていってくれるというファジングするツールです。 試してみたのでどんな感じなのかを簡単にめも。 まず、ツール自体はgolangで書かれて…

cgroupでタスクの移動処理

cgroupでタスクの移動というのは例えば、/sys/fs/cgroup/cpusetにfooとbarというディレクトリがあって、fooに所属しているタスクをbarに移動するとかです。 タスクの移動といってもcgroupのコアと呼ばれてるcgroupの基本機能側での処理とサブシステム(cpuse…

/proc/<pid>にファイルをおいてデータを読みたい

/proc/<pid>/ にファイルを作ってデータを読めると便利なときがあったりするのでめも。 今回はcgroup.cで処理を実装して、その関数をcgroup.hにて宣言。fs/proc/base.cでcgroupのほうに追加した関数を登録する形です。/proc/<pid> にあるファイルに対する関数はここで</pid></pid>…

try_charge()めも2

前回の続き 前回はここの2238行目のpage_counter_try_charge()を読んだのでその下からです。 2236 if (!do_swap_account || 2237 !page_counter_try_charge(&memcg->memsw, batch, &counter)) { 2238 if (!page_counter_try_charge(&memcg->memory, batch, &…

try_charge()の処理めも(1)

chargeの処理としてはこの辺が重要だろうと思われる(要出典)try_charge()の処理を読みましょう。 早速処理を見ていきますが、まず対象のmemcgがルートのmemcgだった場合は何もしません。このチェックはmem_cgroup_is_root()で行えます。次にconsume_stock(…

mem_cgroup_try_charge()の処理めも

commitの前にmem_cgroup_try_charge()を呼んでいるので、commitの処理では重要な関数。 mem_cgroup_try_charge()自体はそんなに処理はなくて、メインなのはtry_charge()関数。mem_cgroup_try_charge()の処理は memcgが無効なら何もしないで終了。 5468 if (m…

Linux 4.11から入った参照カウンタのAPIめも

security things in Linux v4.11を読んでて参照カウンタ用のAPIが4.11に入ったとのことなので軽くめもです。 利用にはinclude/refcount.hをインクルードします。実装はlib/refcount.cです。 機能的には変数は実態はatomic_t型のrefcount_tという型が作られて…

memcgで実際に課金してるところめも

mm/memcontorl.cのmem_cgroup_charge_statistics()のとこです。カーネルは毎度ながら4.1.15。 mem_cgroup_charge_statistics()のコードはこんな感じです。見たままですね。 828 static void mem_cgroup_charge_statistics(struct mem_cgroup *memcg, 829 str…

commit_charge()の処理

mem_cgroup_commit_charge()から呼ばれるcommit_charge()の処理のめも。 呼び出しはこうですね。mem_cgroup_commit_charge()で渡された引数がそのまま渡ります。 5522 void mem_cgroup_commit_charge(struct page *page, struct mem_cgroup *memcg, 5523 boo…

mem_cgroup_commit_charge()の処理

カーネルは4.1.15。mem_cgroup_commit_charge()はchargeの処理で呼ばれる関数。 今回はここで使われる関数の詳細は調べないで、大まかな流れを把握するのが目標。 LXRで検索するとmm/filemap.cとかmm/swapfile.c、mm/memory.cなんかから呼ばれてます。 mem_c…

mem_cgroup_charge_common()はだいぶ前に消えていた (; ・`д・´) ナ、ナンダッテー !! (`・д´・ (`・д´・ ;)

昨日の続きです。 4.10にあるドキュメントには課金の処理ではmem_cgroup_charge_common()を使うよーなんて書いてあったんですが、この関数はだいぶ昔になくなってました。 3.15で消えたようです。さらに言うと、このパッチで使用している__mem_cgroup_commit…

Documentation/cgroup-v1/memory.txtのめも

コードではなくてドキュメントもたまには読みましょうということで、Documentation/cgroup-v1/memory.txtです。 accounting == 課金です。以下のめもは本文を自分が分かれば良い程度に大雑把に意訳した感じです。 機械翻訳はとかしてないので安心ですね? 2.…

memory cgroupの初期化処理辺りを読む

誰得なめも。バージョンは4.1.15。 __initがついているのは以下の3関数。 mem_cgroup_init() enable_swap_account() mem_cgroup_swap_init() 当たり前だけど、__initがあるのでカーネル起動時の初期化で呼ばれる。 mem_cgroup_init()はこのような関数。 577…

cgroupのv1とv2の切り分け的なところ

cgroupはv1とv2という2つの実装(と言っていいのか?)があってそれらはkernel/cgroup.cで一つのコードベースにまとまっているのでコード読んでで混乱するなーというところで、誰得なめもを。 特に、4.1とかのカーネルだとv2のコードはまだ正式版となってな…

Linuxカーネルのコードネームの扱いが不憫なので/proc/sys/kernel/codenameで読めるようにした

たぶん、この辺の会話から Linuxカーネルのコードネームって気にした事無いな— int $0x03@SNS部 (@masami256) 2017年1月30日 この記事に繋がってたりするのかな?なんて思ったりということで、 さらに話を続けてみてですね、こんなpatchを書きました。4.10.0…

Docker + GNU GLOBALで手軽にソースコードリーディング環境を作る

Kia Ora! この記事はプロ生ちゃん Advent Calendar 2016の16日目の記事です。 2015年はbash-completionでコマンド補完するときにプロ生ちゃんに何か言ってもらう - φ(・・*)ゞ ウーン カーネルとか弄ったりのメモなんて記事を書きました。2014年はプロ生ちゃん …

Linuxカーネルのライブパッチを使ってテスト用のstubを作る

この記事はLinux Advent Calendar 2016の1日目の記事です。 テストする時にstubって便利ですよね。最近はnodejsで仕事のコードを書いているのでsinon便利だなとか思ってます。じゃあ、Linuxカーネルでもstub作れたら便利だよねという思うわけです。そうする…

作成したファイル(struct dentry *)の読み書き用バッファをプロセス等固有に持たせるめも

たとえば、debugfsのディレクトリとファイルをプロセス毎に作って、ファイルの中身はプロセスごとに変えたいってことをしたい場合にどうするかというメモです。 foobarという機能がdebugfsのルートディレクトリにディレクトリを作成して、piyoというプロセス…

Linuxのカーネルモジュールがロードされるアドレス範囲

カーネルモジュールがロードされるアドレスって範囲決まってたはずだけど、自分で言っといてホントそうだったけ?とか思ったので確認。 @RKX1209 たしかmodule mapping spaceだと思った… https://t.co/4rH8h4G3rS— int $0x03 (@masami256) 2016年10月4日 調…

pid cgroupのコードを読む

この記事はLinuxカーネルもくもく会 #24 - connpassで書いてます。今日は前に追加されたcgroupsのpid管理のコードを読んでみます。 ファイルはcgroup_pids.cです。Linux 4.7のコードを対象にします。 最初にデータ構造です。pidの場合はpids_cgroup構造体が…

bccめも:bpf_probe_read()

bpf_probe_read()は3番目の引数を安全に読み出すためのものという認識で間違ってないとは思うけど。 linuxカーネルのsamples/bpf/bpf_helpers.hを見ると引数名はunsafe_ptrとかなってるし。strpcyとかだとinvalid opcode的なエラーになったので、この辺を使…

Linux 2.0.40の頃のkmalloc()

たまには古いカーネルでも読んでみましょう的なところで、Linux 2.0.40の頃はkmalloc()はどんな実装だったのかというところでも見てみましょう。最近のkmalloc()の実装は使用しているディストーションが採用しているスラブアローケータの__kmalloc()の実装を…

Linux 4.7の新機能「perf trace calls stack」めも

kernelnewbies.orgのLinux Changesを見てて良さげだなと思った「perf trace calls stack」のめもを。 基本的な使い方は説明が書かれているので、 perfでread、open、closeシステムコールを指定する場合。 masami@saga:~/tmp$ sudo perf trace -e read,open,c…

linux 4.7でライブパッチ用のカーネルモジュールにelfのセクションチェックが入ったのでめも

Linux 4.7からライブパッチ用のカーネルモジュールをロードする時にELFのセクションをチェックするようになりました。 このチェックが入ったこととで、今までのモジュールを再コンパイルするだけだと以下のようなエラーになってロードに失敗します。 [ 153.8…

elfファイルのdebugセクション分割とgdbの分割されたデバッグ情報のサポート機能めも

rpmパッケージとかは通常のパッケージとデバッグ用のパッケージを分けて、debugしたいときはデバッグ情報付きのパッケージをインストールしますよね。あれがどんな感じで動いているのか確認したのでメモです。 使っている機能としては、gdbのデバッグ情報の…

linux kernelのlivepatchにライブパッチを適用する・しないの判断機能を入れて遊ぶ

2016年7月13日〜15日で行われたLinuxCon Japan 2016のセッションでカーネルハックの一環でカーネルのlivepatchの機能を使って、FreeBSDのバイナリをLinuxで動かすってセッションに参加して、そういう使い方もありだなと思ったのでちょっと試してみました。ア…

docker-machine createする時に、provisioning先のLinuxディストーションにはnetstatが必要

2時間位ハマったのでメモしときましょう φ(..)メモメモ KVMでCentOS7の仮想環境を作って、そこにdocker-machine create -d generic ~とやっていたんですが、sshでエラーコード127が返ってきていて、何がおきてるのかさっぱりわからずでハマりました。 こんな…

Linuxカーネルのコードを読んで勉強になったこと

Linuxカーネルのコードを読んでて、なるほど〜と思うことはよくあるけど、その中でも特に今までの考え方をぶち壊してくれたのはなんだっけと思ったところ、やっぱりリスト構造かなと言うところ。 c言語でリスト構造を作る場合、一般的な教科書方式だと↓のよ…