週刊? Linux Kernel Patch Watch 20180511

前書き

(´-`).oO(ほんとに小ネタが多いな

今週のpatch

vdsoの未使用ファイル削除

[PATCH] x86/vdso: remove unused fileです。読まなくて良いファイルが消えるのは良いことですね。

gcc8でobjtoolのワーニングがたくさん出る問題

Kernel build with gcc 8 a lot of warningsで相談が始まり、[PATCH 0/3] objtool: GCC 8 supportでpatchが投げられてます。こちらのレスポンスで具体的な問題の内容とか修正内容の説明もされてます。 Fedora 28、Archあたりはgcc8なので影響受けている人いますね。

フォーマット指定しのチェックをするのに__printf()が良いよ

[PATCH] slub: add printf verification to ‘slab err’:で、__printfでチェックすると良いよという感じのpatchです。

--
 mm/slub.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/mm/slub.c b/mm/slub.c
index 44aa7847324a..7d38cfb6a619 100644
--- a/mm/slub.c
+++ b/mm/slub.c
@@ -711,7 +711,7 @@ void object_err(struct kmem_cache *s, struct page *page,
    print_trailer(s, page, object);
 }
 
-static void slab_err(struct kmem_cache *s, struct page *page,
+static __printf(3, 4) void slab_err(struct kmem_cache *s, struct page *page,
            const char *fmt, ...)
 {
    va_list args;

__printfは以下のようなマクロです。

#define __printf(a, b)  __attribute__((format(printf, a, b)))

gccのマニュアルにformat attributeの説明があります。

CVE-2018-8897のテストコード

[PATCH] selftests/x86: Add mov_to_ssです。 POP SS debug exception - CVE-2018-8897 [Moderate] & CVE-2018-1087 [Important] - Red Hat Customer Portalのテストコードです。

その他

printfデバッグではなくてftraceを使おう

Re: [PATCH] staging: most: video: use func instead of function nameです。printfデバッグじゃなくてftrace使えば良いじゃんって話です。

3.2系カーネルのEOLはいつ?

EOL for the 3.2 kernel?です。後一回は最低でもリリースするとのこと。

あとがき

(´-`).oO(kernelのコードネームが変更されましたね(ー_ー)!!

週刊? Linux Kernel Patch Watch 20180504

前書き

今週もなんとか小ネタを集めて。。。

今週のpatch

IRQのon/off切り替わり時のトレースポイントでパフォーマンス劣化してた

[PATCH RFC] tracepoint: Introduce tracepoint callbacks executing with preempt onです。hackbenchで〜10%のパフォーマンス劣化があったということです。RCUからSRCUを使うような修正になっています。

kdumpで大きなサイズのメモリを確保する時の処理を修正

[PATCH 1/2] kdump/x86: crashkernel=X try to reserve below 896M first then below 4G and MAXMEMです。crashkernelオプションに指定するメモリサイズが〜896MB以下のアドレス範囲から取得できなかった場合の処理が追加されています。内容としては〜896MB以下から取得できなければ〜4GBの範囲から、それでもダメならMAXMEMの範囲まで含めて確保しにいくようになってます。

GCCデバッグ向けの最適化オプションを使うようにする

[PATCH 0/5] kernel hacking: GCC optimization for debug experience (-Og)です。GCCの最適化オプション(-O2とか-Os)に-Ogというのもあって、ドキュメントにはOptimize debugging experience. -Og enables optimizations that do not interfere with debugging. と説明されています。これを使うようにしては?というpatchですね。やはり多少のパフォーマンス劣化はあるみたいです。

boot処理の早い段階でvsprintf()の%pでhash値を出せるようにする

[PATCH 0/3] enable early printing of hashed pointersです。boot処理の早い段階でフォーマット指定子の%pが使われるときに乱数のキーが決まっていない場合は、hash地ではなくて(ptrval)という文字列になるけど、これはデバッグしにくいのでカーネルコマンドラインオプションにキーを渡せるようにしてはどうかというpatchです。

lib/vsprintf.cにあるptr_to_id()の以下の部分が文字列返しているとこです。

 if (unlikely(!have_filled_random_ptr_key)) {
        spec.field_width = default_width;
        /* string length must be less than default_width */
        return string(buf, end, "(ptrval)", spec);
    }

printk()の%p系のフォーマット指定子を処理しているのはpointer()という関数です。

nanoMIPSアーキテクチャ

Introducing a nanoMIPS port for Linuxです。New MIPS I7200 Processor Core Delivers Unmatched Performance and Efficiency For Advanced LTE/5G Communications And Networking IC Designs – MIPSでアナウンスされたCPUのportingです。このCPUについてはMIPS、初のnanoMIPS命令セット対応CPUコア「I7200」 - PC Watchでも取り上げられてます。

その他

rt-testsの最新版リリース

[ANNOUNCE]rt-tests-1.3 New Devlopment version of rt-testsです。realtime:documentation:howto:tools:rt-tests [Linux Foundation Wiki]に説明があります。hackbenchとかのテストツールのコレクションですかね。fedoradebianubuntuなどはパッケージもあります。

あとがき

(´-`).。oO(hash値のアドレスを使ってうまくデバッグするのはどうやるんだろ?

例解UNIX/Linuxプログラミング教室: システムコールを使いこなすための12講

例解UNIX/Linuxプログラミング教室: システムコールを使いこなすための12講

GRUB2(UEFI)のコンソールからの起動メモ

たまにやる必要があったりするのでメモです。

まずは。。。 pagerを1に設定することで、出力内容が多い時に(catとかで)moreとlessみたいに1ページ毎にページ送り出来ます。これないと辛い。。

f:id:masami256:20180502235845j:plain

setコマンドで引数渡さなければ現在の設定が見れます。これで今の設定を確認。

f:id:masami256:20180502235919j:plain

ここで知りたいのはrootがどこかというとこです。このPCだと(hd1,gpt1)。

f:id:masami256:20180502235928j:plain

このrootは/bootではなくて/boo/efiです。

/dev/sda1 on /boot/efi type vfat (rw,relatime,fmask=0077,dmask=0077,codepage=437,iocharset=ascii,shortname=winnt,errors=remount-ro)

よって、ls (hd1,gpt1)/をするとこうなります。efiディレクトリとかがあります。 f:id:masami256:20180503000058j:plain

Linux上で見るとこうなってます。

masami@saga:~$ sudo ls -al /boot/efi/
total 44
drwx------. 3 root root 16384 Jan  1  1970 .
dr-xr-xr-x. 5 root root  4096 May  3 01:57 ..
drwx------. 4 root root  4096 Mar  7 04:23 EFI
-rwx------. 1 root root 12288 Jan  1  1980 FSCK0000.REC
-rwx------. 1 root root  8192 Jan  1  1980 FSCK0001.REC

grubの設定ファイルであるgrub.cfgはfedoraなら/boot/efi/EFI/fedora/grub.cfgにあるので、grubでのpathは(hd1,gpt1)/efl/fedora/grub.cfgとなります。

f:id:masami256:20180503000205j:plain

次にLinuxカーネルコマンドラインに渡すroot=オプションの値を調べます。fedoraはrootには/dev/sda2とかのデバイスファイル名を渡さずにroot=UUID=uuidの文字列という感じでオプション渡しますが、これを入力するのは大変なのでデバイスファイル名で渡します。 まずはgrub.cfgをcatで開いて、grubのsetコマンドでrootを指定しているところを調べます。(hd0,gpt2)がsetされてます。

f:id:masami256:20180503000253j:plain

Linuxカーネルの設定はbios版はlinuxでしたが、uefi版はlinuxefiです。initrdのほうもefiが後ろに付きます。/bootは(hd1,gpt2)/だったので、(hd1,gpt2)/vmlinuz〜のようになります。

f:id:masami256:20180503214622j:plain

あとはbootコマンドで起動します。

( ´ー`)フゥー...

まんがでわかるLinux シス管系女子(日経BP Next ICT選書)

まんがでわかるLinux シス管系女子(日経BP Next ICT選書)

週刊? Linux Kernel Patch Watch 20180427

前書き

2018 Linux Storage, Filesystem, and Memory-Management Summit関連の記事でlwn.netに面白そうな記事が増えてる今日この頃ですヽ(=´▽`=)ノ

今週のpatch

メモリを確保してデータを書き込んだあとはR/Oにするpmalloc()

前にlwn.netでも紹介されてたかも。24日の時点で[RFC PATCH v23 0/6] mm: security: write protection for dynamic dataのpatchが流れてました。メモリは専用のpoolを作って管理して、alloc時はそのpoolからメモリを取得します。このpoolはスラブアロケータみたいに特定のサイズ毎にチャンクを作るのではなくて、pmalloc()でサイズを指定して確保するようになっています。 一番メインであろうpmalloc()とかの実装があるpatchはこれっぽいです。R/Oに設定するのはpmalloc()で取得した領域を個別にと言うか、pmalloc_protect_pool()でpool全体に対して行うようです。

virtioにpersistent memoryのデバイス追加

[RFC v2] qemu: Add virtio pmem deviceです。RFCなんですぐに入ることはないと思いますが。kvmのゲストからはpersistent memoryっぽく使えるという感じです。

profcfsでseq_fileを使ったファイル処理の改善

simplify procfs code for seq_file instances V2が一連のpatchです。これの3番目のpatchが改善のメイン箇所っぽいです。

その他カーネルねた

vmallocとGFP_NOFS

vmalloc with GFP_NOFSで議論されています。vmalloc()にGFP_NOFSフラグを使っても意味ないけど、実際使ってるところあるし・・・という話のようです。単純に直せるものでもなさそうですね。 ちなみに、vmalloc()はサイズしか引数無いけど、アンダースコアが複数付くタイプのvmallocはGFPフラグを受け取るのでそれらの場合ですね。vmallocの処理で実はGFP_KERNELをハードコードしているところがあるので、渡したフラグが使われない箇所があるということのようです。

あまりメンテされていないファイルシステム

Moving unmaintained filesystems to stagingでどこかに移動しませんか?という提案が出てました。気持ちはなんとなくわかりますね。 まあ安定しているからコードが変更されていないのか?とか実際にどれくらいに人が使ってるのか?とかが出てきますね。

2038年対応

カーネルの方でも2038年対応が着々と進められているようです。最近のステータスがy2038 kernel status updateで投稿されてました。

あとがき

(´-`).。oO(ubuntuとかfedoraの新バージョンがそろそろ出ますね

まんがでわかるLinux シス管系女子3

まんがでわかるLinux シス管系女子3

週刊? Linux Kernel Patch Watch 20180420

前書き

今週も細かいネタを拾っていきます。重要そうなpatchはLWN.netをチェックしましょう。lwnはSubscriberになると最新の記事がすぐに読めて快適ですΣ(゚∀゚ノ)ノキャー

今週のpatch

cpuタイマーのバグフィックス

LKML: Laura Abbott: [PATCH] posix-cpu-timers: Ensure set_process_cpu_timer is always evaluatedというpatchです。fedoraのbugzillaでBug 1568337 – kernel: prlimit64 with RLIMIT_CPU ignored]と報告されたものの修正ですね。バグの内容はsetrlimit(2)でRLIMIT_CPUを使ってcpu時間の上限をセットしてもプロセスが終了しないということでした。

vm_fault_t

patchはmm: change return type to vm_fault_tだけではないんですが、戻り値にintを使っていたところが新しく追加されたvm_fault_t型になってます。これ関連のpatchはいくつか流れていました。VM_FAULT_ 系のエラーを返すところに使われる感じですね。

Variable Length Arraysは使わない

VLAはこんな感じの配列のサイズに定数以外を使うやつですね。GCCのドキュメントはUsing the GNU Compiler Collection (GCC): Variable Lengthです。

void foo(char str)
{
    char s[strlen(str) + 1];
}

特定のpatchというかいくつかこの系統のpatchが流れてました。Re: VLA removal (was Re: [RFC 2/2] lustre: use VLA_SAFE)がきっかけみたいです。

その他カーネルねた

CONFIG_SLAB_FREELIST_RANDOMがvm環境であまりランダムにならないという話し

こちらでCONFIG_SLAB_FREELIST_RANDOMを有効にしててもあまりランダムになってないんだけどという話が出てました。VM環境でブートの初期段階だとエントロピーはこの機能に関わらず問題になりやすいとか、qemu-system-x86_64はデフォルトではRDRAND機能を使わないから、RDRANDを使う場合は-cpu hostオプションが必要だよとか、virtio-rngはこの場合には使えないよーなんて話がでてました。

Fedoraのkernel Test Day

Test Day:2018-04-13 Kernel 4.16 Test Day - Fedora Project Wikiというカーネルのテストをするイベントがありました。 テストは基本的にQA:Testcase kernel regression - Fedora Project Wikiの手順で行います。実行自体は特に難しいことはありません。これ以外にも人によっては任意のテストを実行したりもしてます。結果のページに結果があります。カーネルに限らず特定の機能のテストイベントはよく開かれているのでFedoraを使ってる人は参加しておくと、良いことがあるかもしれません。

あとがき

4.17系のrc1が出ましたね。

まんがでわかるLinux シス管系女子3 (日経BPパソコンベストムック)

まんがでわかるLinux シス管系女子3 (日経BPパソコンベストムック)

週刊? Linux Kernel Patch Watch 20180413

まえがき

週刊Railsウォッチというrailsを中心とした記事がとても良い感じで、これのカーネル版あったら嬉しなということで自分でやってみました(*´Д`) どれくらいのボリュームでとか、毎週ちゃんと書くのかは全く不明でございます。

我々にはWelcome to LWN.net [LWN.net]Linux Hardware Reviews, Open-Source Benchmarks & Linux Performance - Phoronixがあるし、基本的にこれらを読めば事足りる気はしますが。まあ、小ネタを拾っていこう的な感じです。 読むpatchについてはマージされるかどうかは別として、気になったものとかを取り上げようと思います。

今週のpatch

sl*bでコンストラクタ使う場合にスラブオブジェクトの取得時に__GFP_ZEROフラグ使わない

[PATCH v2 2/2] slab: __GFP_ZERO is incompatible with a constructor — Linux Kernelというpatchのお話です。4/12時点ではマージされてませんが。 sl*bではページを確保してスラブオブジェクトを新規に作る時にコンストラクタを渡して、作成時に処理を行うことができます。スラブの作成でkmem_cache_create()系の関数を使うとコンストラクタを渡せます。

struct kmem_cache *kmem_cache_create(const char *name, size_t size,
            size_t align, slab_flags_t flags,
            void (*ctor)(void *));
struct kmem_cache *kmem_cache_create_usercopy(const char *name,
            size_t size, size_t align, slab_flags_t flags,
            size_t useroffset, size_t usersize,
            void (*ctor)(void *));

slubだとsetup_object()で1オブジェクト毎に指定されたコンストラクタを実行します。

static void setup_object(struct kmem_cache *s, struct page *page,
                void *object)
{
    setup_object_debug(s, page, object);
    kasan_init_slab_obj(s, object);
    if (unlikely(s->ctor)) {
        kasan_unpoison_object_data(s, object);
        s->ctor(object);
        kasan_poison_object_data(s, object);
    }
}

そして、kmem_cache_alloc()でスラブオブジェクトを取得する時にgfpフラグを渡して、メモリの確保方法を指定できます。

void *kmem_cache_alloc(struct kmem_cache *, gfp_t flags) __assume_slab_alignment __malloc;

ここで、flagsにGFP_ZEROを渡した場合ですが、オブジェクトを確保してそのオブジェクトをmemset()で0クリアするのがslubでの処理です。そうすると、コンストラクタで何かしらの処理をオブジェクトにしていてもそれが0で上書きされてしまうので、その場合の対応が今回のpatchでした。 簡単なテストコードを書いて試してみましょう。コードはこんな感じです。kmem_cache_alloc()にGFP_ZEROを渡さない場合と渡す場合の2関数を作って呼びます。

#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt

#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/slab.h>
#include <linux/types.h>
#include <linux/gfp.h>
#include <linux/string.h>

MODULE_DESCRIPTION("slab constructor test");
MODULE_AUTHOR("masami256");
MODULE_LICENSE("GPL");

#define SCT_SLAB_NAME "sct"

static struct kmem_cache *sct_cache;

struct sct_test_struct {
    int n;
    char s[16];
};

static void sct_constructor(void *data)
{
    struct sct_test_struct *p = (struct sct_test_struct *) data;
    memset(p->s, 0x0, sizeof(p->s));

    p->n = 0xffff;
    strcpy(p->s, "hello");
}

static void sct_test(void)
{
    struct sct_test_struct *p = kmem_cache_alloc(sct_cache, GFP_KERNEL);

    pr_info("%s: %d, %s\n", __func__, p->n, p->s);

    kmem_cache_free(sct_cache, p);
}

static void sct_test_with_gfp_zero(void)
{
    struct sct_test_struct *p = kmem_cache_alloc(sct_cache, __GFP_ZERO);

    pr_info("%s: %d, %s\n", __func__, p->n, p->s);

    kmem_cache_free(sct_cache, p);
}

static int slab_ctor_test_init(void)
{
    slab_flags_t flags = SLAB_PANIC;

    pr_info("%s start\n", __func__);

    sct_cache = kmem_cache_create(SCT_SLAB_NAME,
                      sizeof(struct sct_test_struct),
                      __alignof__(struct sct_test_struct),
                      flags,
                      &sct_constructor);
    if (!sct_cache) {
        pr_info("failed to create slab cache\n");
        return -ENOMEM;
    }

    sct_test();
    sct_test_with_gfp_zero();

    return 0;
}

static void slab_ctor_test_cleanup(void)
{
    if (sct_cache)
        kmem_cache_destroy(sct_cache);

    pr_info("%s bye\n", __func__);
}

module_init(slab_ctor_test_init);
module_exit(slab_ctor_test_cleanup);

実行結果はこうなります。__GFP_ZEROを付けた方はコンストラクタ設定した値が0で上書きされてますね/(^o^)\

masami@kerntest:~/slab_ctor_test$ dmesg
[  225.077109] slab_ctor_test: slab_ctor_test_init start
[  225.077156] slab_ctor_test: sct_test: 65535, hello
[  225.077157] slab_ctor_test: sct_test_with_gfp_zero: 0, 

(´-`).。oO(言われてみればその通りで、コンストラクタと__GFP_ZEROが共存するような使い方はあまり意味がないんだけどシステム的にはノーチェックだったんですね。ちなみに、これはf2fsの方で見つかったバグが発端になってるようです

アドレスを定義するときはunsigned longを使おう

[PATCH] x86/mm: vmemmap and vmalloc base addressess are usngined longs — Linux Kernelのpatchです。

こんな感じでULを付けましょうということです。

-#define __VMEMMAP_BASE_L4   0xffffea0000000000
-#define __VMEMMAP_BASE_L5  0xffd4000000000000
+#define __VMEMMAP_BASE_L4  0xffffea0000000000UL
+#define __VMEMMAP_BASE_L5  0xffd4000000000000UL

(´-`).。oO(忘れずにULをつけましょう

sizeof(void)とgccのワーニング

www.spinics.netのpatchです。gccのオプションで-Wpointer-arithを付けると c sizeof(void) を使ってる時に警告がでます。この警告-Wallではでません。sparseがこの警告を大量に出してくるので警告のon/off切り替えをできるようにしたようです。

#include <stdio.h>

int main(int argc, char **argv)
{
        sizeof(void);
        return 0;
}
masami@saga:~$ gcc sizeof_void.c -Wpointer-arith
sizeof_void.c: In function ‘main’:
sizeof_void.c:5:9: warning: invalid application of ‘sizeof’ to a void type [-Wpointer-arith]
  sizeof(void);
         ^~~~

(´-`).。oO(sizeof(void)は1です

あとがき

来週も書けるかな?

gccのインラインアセンブラ内からcのラベルにgotoでジャンプ

最近のgccインラインアセンブラ内からcのgotoラベルに飛べる仕組みがあるのでそれのメモです。

ドキュメントはUsing the GNU Compiler Collection (GCC): Extended AsmUsing the GNU Compiler Collection (GCC): Extended Asmです。たしかLKMLに送られてたpatchにもこれを使ったコードがあった気がします。

それはさておき、gotoを使う場合の書式は以下のようになっていて、asm gotoという形式です。

asm [volatile] goto ( AssemblerTemplate 
                      : 
                      : InputOperands
                      : Clobbers
                      : GotoLabels)

ドキュメントには-ansiオプションを付けてコンパイルする場合はasmではなくてasmを使うようにと書かれています。また、出力のオペランドは指定できないようです。そのため、計算の途中経過を保持したいときとかはClobbersのところでメモリに書き出すようにするみたいです。

以下が簡単なサンプルです。argcの数が3かどうか調べて3だったらsameラベルにジャンプしてます。

#include <stdio.h>

int main(int argc, char **argv)
{
    __asm__ goto("cmpl $0x3, %[argc]\n\t"
             "je %l[same]\n\t"
             :
             : [argc] "r"(argc)
             :
             :same);

    printf("argc is %d\n", argc);

    return 0;
same:
    printf("argc == 3\n");
    return 0;
}

機械語になるとこんな感じです。

0000000000400527 <main>:                                                                                                                                                                                           
  400527:       55                      push   %rbp                                                                                                                                                                
  400528:       48 89 e5                mov    %rsp,%rbp                                                                                                                                                           
  40052b:       48 83 ec 10             sub    $0x10,%rsp                                                                                                                                                          
  40052f:       89 7d fc                mov    %edi,-0x4(%rbp)                                                                                                                                                     
  400532:       48 89 75 f0             mov    %rsi,-0x10(%rbp)                                                                                                                                                    
  400536:       8b 45 fc                mov    -0x4(%rbp),%eax                                                                                                                                                     
  400539:       83 f8 03                cmp    $0x3,%eax                                                                                                                                                           
  40053c:       74 1b                   je     400559 <main+0x32>                                                                                                                                                  
  40053e:       8b 45 fc                mov    -0x4(%rbp),%eax                                                                                                                                                     
  400541:       89 c6                   mov    %eax,%esi                                                                                                                                                           
  400543:       bf 00 06 40 00          mov    $0x400600,%edi                                                                                                                                                      
  400548:       b8 00 00 00 00          mov    $0x0,%eax                                                                                                                                                           
  40054d:       e8 ee fe ff ff          callq  400440 <printf@plt>                                                                                                                                                 
  400552:       b8 00 00 00 00          mov    $0x0,%eax                                                                                                                                                           
  400557:       eb 0f                   jmp    400568 <main+0x41>                                                                                                                                                  
  400559:       bf 0c 06 40 00          mov    $0x40060c,%edi                                                                                                                                                      
  40055e:       e8 cd fe ff ff          callq  400430 <puts@plt>                                                                                                                                                   
  400563:       b8 00 00 00 00          mov    $0x0,%eax
  400568:       c9                      leaveq
  400569:       c3                      retq
  40056a:       66 0f 1f 44 00 00       nopw   0x0(%rax,%rax,1)

低レベルプログラミング

低レベルプログラミング