ss で UNIX domain socket のバックログのサイズと accept(2) 待ちのソケット数を取る

UNIX domain socket での net.core.somaxconn や sk->sk_max_ack_backlog の実装を調べていた際に、 ss コマンドでソケットのバックログのサイズと accept(2) 待ちのソケット数を取れることを知った

以下、検証と実装を追いかけた記録

続きを読む

__GFP_ZERO と 0 初期化

kvm のソースを読んでたら kvm_kvzalloc() なる関数が出てきた

/*
 * Avoid using vmalloc for a small buffer.
 * Should not be used when the size is statically known.
 */
void *kvm_kvzalloc(unsigned long size)
{
    if (size > PAGE_SIZE)
        return vzalloc(size);
    else
        return kzalloc(size, GFP_KERNEL);
}

割り当てたいサイズによって vzalloc() と kzalloc() を使い分ける。 kzalloc() は下記のような感じ

/**
 * kzalloc - allocate memory. The memory is set to zero.
 * @size: how many bytes of memory are required.
 * @flags: the type of memory to allocate (see kmalloc).
 */
static inline void *kzalloc(size_t size, gfp_t flags)
{
    return kmalloc(size, flags | __GFP_ZERO);

__GFP_ZERO を指定すると 割り当てた領域は 0 で初期化済みで返してくれる。

#define __GFP_ZERO  ((__force gfp_t)___GFP_ZERO)    /* Return zeroed page on success */

疑問

ここんところの実装がどうなってるかを追ってみた

github.com

といっても memset() しているだけだった。ちょっと面白みがないので下記のような検証を加えた

続きを読む

荒川サイクリングロード (2)

11/23 友人と荒川サイクリングロードに行ってきた ( 11/20 にもいったのに!)

秋ヶ瀬公園

友人の自転車は 2011年くらいの Cannondale SuperSix で ULTEGRA 6700 系。一世代前のモデルだけど、昨年からロードに乗りはじめた newbie な自分にとって逆に新鮮。

続きを読む

Linux カーネル API: anon_inode_getfd, misc_register

KVM のソースを呼んでる中で anon_inode_getfd という API を知ったので、 KVMソースコードを写経しながらカーネルモジュールを作ってみた

github.com

... といってもユーザランドに向けて ioctl(2) のインタフェースを作るだけのモジュールで実用的なものでない。KVM API を理解するための写経 📝

続きを読む

ソースコードリーディング: KVM_GET_API_VERSION

前回 の続き。KVMAPI を読んでいる

KVM_GET_API_VERSION

github.com

定数を返すだけの非常にシンプルな APIユーザランド側でどう扱うかが疑問になったので、qemu のソースも一緒に読んだ

qemu と一緒に読む

KVM_GET_API_VERSION といった定数は qemu でも同名で定義されているので、

  1. APIのドキュメントKVM_FOO_BAR の 説明を読む
  2. Linux kernel のソース で KVM_FOO_BAR が参照されている箇所を gtags で探して読み進める
  3. qemu のソースで KVM_FOO_BAR が参照されている箇所を gtags で探して読み進める

として、ユーザランドから見る KVM のインタフェースとカーネルでの KVM の実装を筋立ててソースを読んでいける ( a, b, c の順序は問わない )

Using the KVM API [LWN.net]

加えて、他の API と組み合わせて KVM を操作していく術について、骨格を掴むには lwn.net の過去記事を読むとよい

Using the KVM API [LWN.net]