termboxで出せる色を調べるツール

この記事はまたまた!ぴょこりんクラスタAdvent Calendarのために書いたものです。

これは何か

termbox-goで出せる色見本を見るためのツール。 背景色がその番号で出せる色である。一部番号が見づらいところがあるが、並びでわかるからいいやというくらいの適当ツールである。

f:id:nbisco:20171214222948p:plain

ソースコード

今年買ってよかったもの

この記事はまたまた!ぴょこりんクラスタAdvent Calendarのために書いたものです。

はじめに

今年もいろいろ買い物をした。そのなかでよかったと思うもの、印象に残っている物を書く。

ドンキの4K 50型テレビ

これの前機種を発売日に買った。安すぎるから不安だったけど、買って本当によかった。

www.donki.com

PCで4K表示させようとすると文字が滲む問題があったけど、HDMI-DP変換ケーブルをはさむとなぜか滲まずに表示された。原因は不明。 このテレビ、PCとつないで等倍表示させると、文字が細かすぎて作業には向かないけども、ゲームやるとすごく楽しい。大画面でやるBAYONETTAは最高に楽しかった。その後、Splatoon2やマリオオデッセイ、マリオカートでも大活躍している。なお、テレビとしての機能は使っていない。

xbox360の無線コントローラ

Steamを楽しむために買った。これのあるなしではSteamの楽しみ具合が全く違うので、Steamやってる人はぜひ買うべき。なかなか捨てられなかったPS3を投げ捨てられたのはこのコントローラのおかげと言っても過言ではない。 自分が買ったときは3000円くらいだったのがいつの間にか値上がりしており厳しい。。。

Amazon CAPTCHA

Ankerの充電器とモバイルバッテリー

USB充電できる機器が増えてきたので買った。Ankerは見た目もシンプルでよいし、実績もあるので安心して使える。友達と旅行に行ったとき、各人がそれぞれ同じようなAnker充電器出してきて笑ったのをよく覚えている。 バッテリは結構小さいのにスマホ3回分も充電できてありがたい限りだ。今後もよろしくお願いします。

Amazon CAPTCHA

Amazon CAPTCHA

水切りマット

これまで食器かごをシンクの上に橋渡しする感じで設置していたが、これがまた大変に邪魔。ただでさえやりたくない洗い物が輪をかけて億劫になるという最悪な状態だった。 これを買ってからは、水切りマットの上に食器かごを置き、そこに食器を入れて乾かすようになった。これの何がいいかというと、シンク以外で食器を乾かせるという点だ。邪魔にならないところに食器かごごと追いやっておいて、乾いたら片付ければよいし、使ったら洗濯すれば清潔さを保てる。量が少ないときは食器かごすらいらない。 今はこれと色違いを合わせて4枚買って、ローテ組んで使っている。

https://www.amazon.co.jp/gp/product/B00DUVTO4Y/ref=oh_aui_detailpage_o09_s00?ie=UTF8&psc=1

Nintendo Switchゼルダの伝説BotW、Splatoon2、マリオオデッセイ、マリオカート8

無限に時間を溶かす素晴らしいゲームを買った。やはりSteamが面白いと言っても、コンシューマ機の完成度と面白さにはかなわないものがある。 しばらく品薄が続いてたので、予約してよかったなと思った。

ドラム式洗濯乾燥機

僕のライフスタイルを変えた圧倒的文明の利器。初期投資を補って余りある効果を発揮してくれる。

これまで、帰宅→洗濯物を放り込む→洗い終わるまで待つ→浴室乾燥なり外干しする→寝るという流れだったのが、帰宅→洗濯物を放り込む→寝るという流れに変わった。いちばん面倒な干す工程を落とせるのは本当にうれしい。外干しは結構リスキーで、やれ天気が悪くて洗えないだの、やれ風に吹き飛ばされて泥だらけだの事件が多かったが、いつでも好きなときに安心して洗って乾かせるようになった。 これまで上げたのはドラム式洗濯乾燥機のよいところだけど、この洗濯機のいいところを1つあげるとすれば、それは乾燥後の洗濯物がバリバリにならないところである。

kakaku.com

電子レンジ

最近の電子レンジは食パンと目玉焼きを同時に作れるのはもちろんのこと、からあげ、焼き魚、焼きそば、チャーハンなどまでできてしまう多機能調理器になっている。 何より魚がかりっと焼けて、しかも掃除が楽なのがうれしい。これまで掃除が面倒という1点で魚を避けていたんだけど、これならできる。脱臭機能もついているし、 キッチンペーパーを鉄板の上に引いたら洗い物すらなくなるのである。 取扱い説明書の半分くらいがレシピなのは笑った。

panasonic.jp

焼き魚を作るとこんな感じ。干物が干物としてきちんと焼ける、これはすごいことだ。

f:id:nbisco:20171210185609j:plain

イヤフォンマイク

電話をかけるたびに「お電話遠いようなんですが~」と毎回言われていたのを何とかするために購入。 喋るのも楽だし、聞くのも楽になったのでよかった。音質については特に気にしていないけど、まあ問題ないんじゃないでしょうか。

Amazon CAPTCHA

エルゴノミクスキーボードとマウス

形がぐにゃっているキーボード。これのJIS配列のものを買った。 このカーブが案外快適で、指に任せて打つと素直にキーが押せる感じがよい。腕を広げて打つのは快適だ。 マウスも手に馴染んでいる。

僕は家でも職場でもHHKBで、キーピッチが広いキーボードは苦手なんだけど、これは割とすんなり使えてよかった。 ただ、未だに@とか「」とか打ち間違えているので、なんとかしたい。

www.microsoft.com

ニトリのビーズクッション

人間をダメにするソファで有名なあれのニトリ版。無印よりもガワが柔らかくて頼りないが 安いという点でよい一品。これを枕代わりにブランケットで寝っ転がると気持ちよく寝られるのがよい。

ビーズソファ 本体(Nストレッチ) | ニトリ公式通販 家具・インテリア・生活雑貨通販のニトリネット

おわりに

今年は衝動的だったり計画的だったりでいろいろ買い物したが、概ね満足できる結果になって大変よかった。 来年もいい買い物ができますように。

犬との生活 その2

この記事はまたまた!ぴょこりんクラスタ Advent Calendarのために書かれたものです。

犬と寝る

トイレの躾ができているとは言え、犬がベッドに乗るというのは違和感と不安感があった。頭でわかっていて、心が全くついていってない事案である。そもそも、僕のあげた座布団で寝るんじゃないのかと思っていたが、飼い主の寝るのを察知してベッドに飛び乗ってきた。これを引きずりおろすほどの精神力はなかった。「きれい好きだから寝床は絶対に汚さないよ」を信じるしかない。

ベッドの上を少しうろうろしたあと、羽毛布団を踏み固めて寝床を作り、寝たようだ。新飼い主は体を少し曲げてやった。翌朝、体が痛かった。犬は何かあったのという顔をしており、ふてぶてしさを感じた。

散歩

僕にとっての散歩はたいしたことない日常だが*1、犬にとって散歩は喜びそのものである。それくらい喜ぶのだ。普段ほとんど吠えないのに吠えだしたり、しっぽを振りながらせわしなく行ったり来たりするのをみて、喜んでないと誰が言えようか。

散歩という言葉を理解しているらしく、散歩にいくよと声をかけるとはしゃぎ始めるのがわかった。リードをつけようとすると、テンションが上がりすぎたのかリードに噛みついてきて5分くらい離してくれなかった。

昔、何かで「散歩のときは犬の行きたい方向ではなく、飼い主の行きたい方向に向かいましょう。さもないと犬が飼い主の言うことを聞かなくなります」と聞いたのを覚えていたので、頑張ってリードを引っ張りながら歩いた。小型犬なのにやたら力強く引っ張られるので、全く気が抜けない。黒くて大きな犬を連れた方とすれ違ったときは気が気でなかったが、犬同志興味がなかったのか特に何も起こらなかった。トイプードルがすれ違ったときはさすがに何かあることを期待したが、自分を犬だと思ってないのか、完全無視であった。相手の犬はこっちに吠えながら向かって突進してこようとしていたのに、だ。 犬に興味がないくせに、人間、特に中年男性に興味があるようで、すれ違う人に突っ込んでいこうとするのには閉口した。何故なのか。 帰ってきてご飯(カリカリのドッグフード)をあげたが、ほとんど食べない。好物の犬用とりささみをあげてみたら、犬用とりささみだけ食べていた。悪い犬である。

お菓子とおもちゃ

新飼い主は犬に媚びを売るために犬用お菓子と犬用ボールを買った。犬用お菓子と言えばジャーキーかと思いきやたまごボーロだった。見た目、手触りとも人間用と変わらないが、食いつきが異様によかったので、犬用の何かやばいのがまざっているのかもしれない。犬には表情がないので、お菓子がおいしいのかどうかわからなかった。しっぽは振ってなかったように思う。 食後に犬用ボールを転がしたら、野生を思い出したのか、ものすごい素速さでボールに噛みつき、捕らえて振り回していた。なまけものなのか、振り回した拍子にボールが飛んでいくと途端に通常モードになり、こちらを向いた。取ってこいということなのか?転がしてやるとまた野生味溢れる動きをしていた。ひとしきり遊んだあと、疲れたのか座布団で寝ていた。

現在

ひと月たち、ずいぶん犬が慣れてきた。ごみ箱からはみ出ているビニール袋をびりびりに破っていたり、机の上に置いておいたリッツをこっそり全部食べられたりするくらいには慣れたようだ。 新飼い主に対しては下というか大きな子犬として見ているようで、飼い主と新飼い主が並ぶと必ず飼い主のほうに飛びついたり、新飼い主の腕を入念に舐めたり*2、新飼い主が帰ってきても座布団から動かずに「おっ帰ってきたか」みたいな顔で見てたりしている*3

おとなしく座っているときでも、撫でてるときでも、ふと気が付くとドアのほうを見て、飼い主がくるのを待っている。こうなると呼んでも全く無視である。きっとこれからもずっとこの犬はこうやって暮らすのだろう。今更というか、この短期間でもってもっと自分を見てほしいというのは叶わぬ願いだというのはわかっているが、このかわいい呪いの前に新飼い主は無力であり、今日も少し拗ねながら暮らしている。

なお、今日の帰宅時もごみ箱からはみ出ているビニール袋はびりびりになっていた。私知らないみたいな顔が憎らしく、またかわいい。

*1:通勤で往復1時間くらい歩いているので喜びがあまりない

*2:明らかに自分の前足の毛繕いよりも入念

*3:飼い主が来ると喜んで飛びついていく

犬との生活 その1

この記事はまたまた!ぴょこりんクラスタ Advent Calendar 2017のために書いたものです。

はじめに

突然犬(トイプードル)を飼うことになったので、犬との生活についてもろもろやったことなど書いておく。

まずは家探しから

何はともあれ犬を飼うには、犬を飼える部屋が必要である。

それなりの期間独居生活を送っていて、何回か引っ越しているので、家賃の相場などはおおよそわかるのだけれど、それでもペット可の物件はほとんど見たことがない。仲介業者も「ペット可物件は神出鬼没なので気長に待ってください」「猫は不可ってところが多いので犬はまだましですよ*1」というくらいなので時間がかかるかと不安だったが、突然Suumoにちょうどいい物件が湧いて出て来るという幸運に出くわし、部屋探しはあっけなく終わった。

ペット可というくらいなのでにおいが気になるかと思ったが、きれいに清掃されているのか、全く気にならなかった。他の犬の吠えも聞こえないので、防音もちゃんとしているようだ。

犬を迎える前準備

犬用のトイレスペースと食事用深皿を用意した。トイレスペースと食事用深皿の下にアクリルマットを引いておき、事件が起こってもリカバリー可なようにした。また、絨毯は撤去した。フローリングは拭き取れるが、絨毯は洗濯になってしまって面倒だ。

家具に加えて、犬を連れてくるために犬が入れるリュックを買った。背面以外は一部網になっており、中を覗くことができる。犬も暗がりでは怖かろうということなのか、はたまた犬を覗けないと人間が不安になるのかはわからなかった。おそらく両方だろう。 果たしてこんなリュックにおとなしく入ってくれるだろうか?吠えて暴れたらどうすればいい?何かの拍子に逃げ出さないか?不安に思うことはいくつかあるが、一旦置いておくことにした。

犬を連れて帰ってくる

リュックに入れる際も入った後も期待通りの大暴れだった。しかし化学繊維の前には野生は無力であった。

大暴れよりも、さらには悲しげな声で鳴きだすのには困った。ワンワン、ではなく、キューンキューンと鳴いていた。これが本当に悲しさを訴えてくるので、電車の中で思わず何度も出してやろうかと思ったが、そんなことをすると事態は悪化することが明確だったので、つらい気持ちで耐えた。お互いつらい。20分くらいすると諦めたのかおとなしくなった。犬にも無力感というものがあるのだろう。もしくは単に疲れただけなのかもしれない。

トイプードルということもあってか、中身に気づくとみんな視線が釘付けになっていた。概して表情が緩かったので、かわいさでうるささを中和しきった感があった。

なお、トイプードルに限らず動物を電車にのせるときは特別に切符を買う必要がある。犬は物として扱われるのだ。

駅からうちまでの帰り道、おとなしくなった犬をリュックに入れて歩くと、いつもとずいぶん違って見えた。歩くときの振動がともかく大きく感じるのだ。犬は相変わらずおとなしいので、それだけが救いである。

うちについてから

ベッドルームを封印してからリュックから出した。体を振るわせたあと、においを嗅ぎまわっていた。いかにも犬である。かわいいトイプードルでも犬であることには変わりない。緊張しているのか、用意したごはんは食べなかった。ひとしきり嗅ぎ回ったあと、普段使っているはずの座布団を後目に僕の座布団の上で寝転がった。新飼い主からのプレゼントということにしておこう。幸いにも座布団は3枚ある。

もともと躾ができているだけあって、トイレは特に問題なかった。命中率は改善の余地があるが、どうすればいいのかはよくわからなかった。ともかく、トイレがきちんとできてしまえば、僕としては満足である。この分だと絨毯は出せないにしても、日常生活に支障はなさそうだ。

その2に続く

*1:壁とかひっかくし資産価値が下がりやすいかららしい

2048p

サマリ

  • 2048をgolangで書いてみた
  • せっかくなので新ルールも追加してみた

はじめに

2048とは一昔前に流行ったパズルゲームで、さっと検索かけてみればいくらでもクローンがひっかかるような人気のゲームである。Wikipedia)を見るとなかなか業が深い感じがあるが、それはさておきこれは楽しいゲームで、やっていると時間を忘れてしまう。パズルゲームのご多分にもれず、ルールが大変にシンプルであり、手を動かす練習に適しているというわけ。そこで、golangの勉強も兼ねて作ってみた。特に立派なGUIなどはなく、もくもくとCUIで動くような殺風景な感じのものになった。

2048pと2048の違い

2048pは基本は2048と同じものだが、Pタイルがあるという点で違っている。 Pタイルは数値のタイルとは違い、マージすると隣接マス上のタイルの数値を倍にしてくれて消滅するという便利なタイルである。ただし、そんなに頻繁に生成されないので、結構邪魔。

成果物

https://github.com/bisco/2048p-go

バイナリはここからどうぞ。Windows版バイナリも簡単に作れるあたりgolangは偉大ですね。

おわりに

※この記事はまたまた!ぴょこりんクラスタ Advent Calendar 2017のために書かれたものです

SystemTapのprobeにおける"!"とは何か?

SystemTapのtapsetのソースコードを読んでいると、以下のような記述が出てくる。

# systemtap/tapset/linux/x86_64/sysc_mmap.stp 
probe syscall.mmap = dw_syscall.mmap !, nd_syscall.mmap ? {}

このびっくりマークというかexclamation markは、"probe pointが見つかったらそこで評価しろ"の意味。 IBMのRedbook(http://www.redbooks.ibm.com/redpapers/pdfs/redp4469.pdf)にわかりやすい例が載っていたので、引用しておく。

# SystemTap:  Instrumenting the Linux Kernel for Analyzing Performance and Functional Problems
# P16より
kernel.function(“this_might_exist”) !,
kernel.function(“if_not_then_this_should”) !,
kernel.function(“if_all_else_fails”) { ... }

この例では、kernel.function(“this_might_exits”)があれば、そこで{…}を評価する。 なければ、kernel.function(“if_not_then_this_should”)を探し、存在すれば{…}を評価する。 どちらもなければ、kernel.function(“if_all_else_fails”)を探す。

この例、SystemTap開発元のLanguage Referenceに載っていないのでつらい。

Systemtapを使ってKernelのWarningメッセージを止めた(かったがダメだった)

サマリ

  • オンボードUSB3.0コントローラとUSB ICカードリーダの相性が悪いのか、使っているとWarningが出続けてつらい
  • Systemtapを使って抑止しようとしたが、一部止めきれず。何が悪いのかは不明。
  • 試したスクリプトは以下。

gist.github.com

はじめに

うちのICカードリーダ*1ルネサス製と思しきUSB3.0コントローラ *2 の相性が悪く、使っていると以下のようなメッセージが2秒おきに出続ける。

xhci_hcd 0000:03:00.0: WARN Successful completion on short TX: needs XHCI_TRUST_TX_LENGTH quirk?
xhci_hcd 0000:03:00.0: WARN Event TRB for slot 1 ep 8 with no TDs queued?  

前者は、ソースコードをみた感じだと、前者はデータ転送に成功しているけど、 期待したよりも転送長が長くないときに出るもののようだ。

// drivers/usb/host/xhci-ring.c
2300 static int handle_tx_event(struct xhci_hcd *xhci,
2301         struct xhci_transfer_event *event)
<snipped...>
2373     switch (trb_comp_code) {
2374     /* Skip codes that require special handling depending on
2375      * transfer type
2376      */
2377     case COMP_SUCCESS:
2378         if (EVENT_TRB_LEN(le32_to_cpu(event->transfer_len)) == 0)
2379             break;
2380         if (xhci->quirks & XHCI_TRUST_TX_LENGTH)
2381             trb_comp_code = COMP_SHORT_TX;
2382         else
2383             xhci_warn_ratelimited(xhci,
2384                     "WARN Successful completion on short TX: needs XHCI_TRUST_TX_LENGTH quirk?\n"); ★これ

後者はというと、2483行目と2484行目にひっかかっているらしい。 リストが空っぽなのにSTOPじゃないのがダメとか、そういう感じなんだろうか。

// drivers/usb/host/xhci-ring.c
2477         if (list_empty(&ep_ring->td_list)) {
2478             /*
2479              * A stopped endpoint may generate an extra completion
2480              * event if the device was suspended.  Don't print
2481              * warnings.
2482              */
2483             if (!(trb_comp_code == COMP_STOP ||
2484                         trb_comp_code == COMP_STOP_INVAL)) {
2485                 xhci_warn(xhci, "WARN Event TRB for slot %d ep %d with no TDs queued?\n",
2486                         TRB_TO_SLOT_ID(le32_to_cpu(event->flags)),
2487                         ep_index);
2488                 xhci_dbg(xhci, "Event TRB with TRB type ID %u\n",
2489                         (le32_to_cpu(event->flags) &
2490                          TRB_TYPE_BITMASK)>>10);
2491                 xhci_print_trb_offsets(xhci, (union xhci_trb *) event);
2492             }

出続けたから何だというわけでもないが、dmesgが埋め尽くされるのはなんとなく嫌なので*3、 これをKernelを改変せずに抑止したい。どうすればよいか?今回は、Systemtapを使ってみる。

実行環境

MOCHI /home/bisco% uname -r
4.4.0-78-generic

MOCHI /home/bisco% cat /etc/lsb-release
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=16.04
DISTRIB_CODENAME=xenial
DISTRIB_DESCRIPTION="Ubuntu 16.04.2 LTS"

Systemtapとは何か

具体的にはここ。 ざっくり言うと、動作中のKernelやユーザプロセスに対し、動的に情報を取ったりメモリを書き換えたりできるツール*4

Systemtapのインストー

今回はKernelをいじるので、Systemtapバイナリに加えてKernelのデバッグ情報をインストールする。 全部まとめてここに書いてあることに従えばよい。

ソースコードの取得

Systemtapで変数を書き換える行を特定するためにソースコードを取得する必要がある。 ソースコードもaptで取得できる。

$ sudo vim /etc/apt/sources.list # deb-srcから始まる行のコメントを外す
$ sudo apt update
$ sudo apt source linux-image-$(uname -r) # カレントディレクトリにソースコードをダウンロードする

書き換え箇所の特定

needs XHCI_TRUST_TX_LENGTH quirk?に関しては、以下の2ステップ。

  1. 2380行目でxhci->quirksXHCI_TRUST_TX_LENGTH bitを立てる
  2. 2477行目でtrb_comp_codeをCOMP_SUCCESSに戻す

Systemtapは、tapした行が実行される前に効果を発揮するようなので、 2381行目で変数を書き換えても期待した結果が得られない。

// drivers/usb/host/xhci-ring.c(再掲)
2300 static int handle_tx_event(struct xhci_hcd *xhci,
2301         struct xhci_transfer_event *event)
<snipped...>
2373     switch (trb_comp_code) {
2374     /* Skip codes that require special handling depending on
2375      * transfer type
2376      */
2377     case COMP_SUCCESS:
2378         if (EVENT_TRB_LEN(le32_to_cpu(event->transfer_len)) == 0)
2379             break;
2380         if (xhci->quirks & XHCI_TRUST_TX_LENGTH) ★ここ
2381             trb_comp_code = COMP_SHORT_TX;
2382         else
2383             xhci_warn_ratelimited(xhci,
2384                     "WARN Successful completion on short TX: needs XHCI_TRUST_TX_LENGTH quirk?\n"); 
<snipped...>
2463     default:
2464         if (xhci_is_vendor_info_code(xhci, trb_comp_code)) {
2465             status = 0;
2466             break;
2467         }
2468         xhci_warn(xhci, "ERROR Unknown event condition %u, HC probably busted\n",
2469               trb_comp_code);
2470         goto cleanup;
2471     }
2472
2473     do {
2474         /* This TRB should be in the TD at the head of this ring's
2475          * TD list.
2476          */
2477         if (list_empty(&ep_ring->td_list)) { ★ここ

with no TDs queued?に関しては、以下の2ステップ。

  1. 2477行目の条件がTRUEなら、trb_comp_codeをCOMP_STOPに書き換える
  2. 2493行目でtrb_comp_codeを戻す

ここでは2483行目でtrb_comp_codeを書き換えたいんだけど、 2483行目からはtrb_comp_codeにアクセスできないので、しょうがなくこうする。

2473     do {
2474         /* This TRB should be in the TD at the head of this ring's
2475          * TD list.
2476          */
2477         if (list_empty(&ep_ring->td_list)) {
2478             /*
2479              * A stopped endpoint may generate an extra completion
2480              * event if the device was suspended.  Don't print
2481              * warnings.
2482              */
2483             if (!(trb_comp_code == COMP_STOP ||
2484                         trb_comp_code == COMP_STOP_INVAL)) {
2485                 xhci_warn(xhci, "WARN Event TRB for slot %d ep %d with no TDs queued?\n",
2486                         TRB_TO_SLOT_ID(le32_to_cpu(event->flags)),
2487                         ep_index);
2488                 xhci_dbg(xhci, "Event TRB with TRB type ID %u\n",
2489                         (le32_to_cpu(event->flags) &
2490                          TRB_TYPE_BITMASK)>>10);
2491                 xhci_print_trb_offsets(xhci, (union xhci_trb *) event);
2492             }
2493             if (ep->skip) {
2494                 ep->skip = false;
2495                 xhci_dbg(xhci, "td_list is empty while skip "
2496                         "flag set. Clear skip flag.\n");
2497             }

ちなみに、アクセスできる/できない変数は、-Lオプションで調べることができる。 アクセスできる変数は$xxxxと表示されるんだけど、2483行目にはtrb_comp_codeがない。

$ stap -L 'kernel.statement("handle_tx_event@drivers/usb/host/xhci-ring.c:*")' | grep 248
kernel.statement("handle_tx_event@/build/linux-0XAgc4/linux-4.4.0/drivers/usb/host/xhci-ring.c:2483") $xhci:struct xhci_hcd* $event:struct xhci_transfer_event* $xdev:struct xhci_virt_device* $ep_ring:struct xhci_ring* $event_trb:union xhci_trb* $status:int $td_num:int $__func__:char const[] const
kernel.statement("handle_tx_event@/build/linux-0XAgc4/linux-4.4.0/drivers/usb/host/xhci-ring.c:2485") $xhci:struct xhci_hcd* $event:struct xhci_transfer_event* $xdev:struct xhci_virt_device* $ep_ring:struct xhci_ring* $event_trb:union xhci_trb* $status:int $trb_comp_code:u32 $td_num:int $__func__:char const[] const
kernel.statement("handle_tx_event@/build/linux-0XAgc4/linux-4.4.0/drivers/usb/host/xhci-ring.c:2488") $descriptor:struct _ddebug $xhci:struct xhci_hcd* $event:struct xhci_transfer_event* $xdev:struct xhci_virt_device* $ep_ring:struct xhci_ring* $status:int $__func__:char const[] const

Systemtapスクリプト

上記の変更をSystemtapスクリプトにすると、こうなる。

  • kernel.statement(<PATH>) で、ソースコードの位置を指定する。<PATH>のフォーマットは関数名@ファイルへのパス(ビルドしたときのルートディレクトリからの相対パスでよい)
  • $xxxxでKernel内の変数アクセス。構造体メンバへのアクセスは->を使う。
  • グローバル変数globalをつけて宣言すると使える

gist.github.com

このスクリプト-gオプションを付けて実行する。 -gオプションを渡すと、guruモードと呼ばれている変数を書き換えられるモードにしてくれる。

$ sudo stap -gv usb.stp

結果

quirks?のほうは抑止できたけど、with no TDs queued?はなぜか抑止できなかった。うーん、原因がわからん。

その他

Systemtapスクリプトの実行をCtrl-C止めても、quirks?のメッセージが出なくなった。何か残ってるのか・・・?

[2017/05/22 23:11追記]

このコードに対して

2473     do {
2474         /* This TRB should be in the TD at the head of this ring's
2475          * TD list.
2476          */
2477         if (list_empty(&ep_ring->td_list)) {
2478             /*
2479              * A stopped endpoint may generate an extra completion
2480              * event if the device was suspended.  Don't print
2481              * warnings.
2482              */
2483             if (!(trb_comp_code == COMP_STOP ||
2484                         trb_comp_code == COMP_STOP_INVAL)) {
2485                 xhci_warn(xhci, "WARN Event TRB for slot %d ep %d with no TDs queued?\n",
2486                         TRB_TO_SLOT_ID(le32_to_cpu(event->flags)),
2487                         ep_index);
2488                 xhci_dbg(xhci, "Event TRB with TRB type ID %u\n",
2489                         (le32_to_cpu(event->flags) &
2490                          TRB_TYPE_BITMASK)>>10);
2491                 xhci_print_trb_offsets(xhci, (union xhci_trb *) event);
2492             }

このtap

 probe begin {                                                                         
     printf("force stop warning short TX\n")                                           
 }                                                                                     
                                                                                       
 probe end {                                                                           
     printf("stop probe\n")                                                            
 }                                                                                     
                                                                                       
 probe kernel.statement("handle_tx_event@drivers/usb/host/xhci-ring.c:2477") {         
     next_addr = @cast(&$ep_ring->td_list, "list_head", "kernel")->next                
     list_addr = &$ep_ring->td_list                                                    
     if(next_addr == list_addr) {                                                      
         $trb_comp_code = 26                                                           
         printf(">> trb_comp_code = %d\n", $trb_comp_code)                             
     }                                                                                 
 }                                                                                     
                                                                                       
 probe kernel.statement("handle_tx_event@drivers/usb/host/xhci-ring.c:2485") {         
     printf("trb_comp_code = %d\n", $trb_comp_code)                                    
 }                                                                                     

結果がこれ

Pass 1: parsed user script and 110 library script(s) using 109624virt/43860res/6236shr/37692data kb, in 320usr/40sys/359real ms.
Pass 2: analyzed script: 4 probe(s), 4 function(s), 0 embed(s), 0 global(s) using 302812virt/236012res/7292shr/230880data kb, in 3640usr/130sys/3774real ms.
Pass 3: translated to C into "/tmp/stapdRn9iB/stap_072980ba0aa3ed0cb26e4f8ce5aa1922_3963_src.c" using 302812virt/236140res/7420shr/230880data kb, in 10usr/10sys/12real ms.
Pass 4: compiled C into "stap_072980ba0aa3ed0cb26e4f8ce5aa1922_3963.ko" in 3850usr/440sys/4690real ms.
Pass 5: starting run.
force stop warning short TX
>> trb_comp_code = 26
trb_comp_code = 26
>> trb_comp_code = 26
trb_comp_code = 26
>> trb_comp_code = 26
trb_comp_code = 26
>> trb_comp_code = 26
trb_comp_code = 26

COMP_STOP = 26という事実からすると、systemtapがおかしいようにも思うし、 自分の理解が間違っているのではという感もあり、よくわからなくなった。

*1:SCR3310-NTTCom

*2:lspciによるとRenesas Technology Corp. uPD720201 USB 3.0 Host Controller

*3:実害は多分ない

*4:文字通り"tap"である