livaの雑記帳(2017/01)

1/26

  • initスクリプトをmake時に環境ごとに変えられるようにした。複数のビルド環境下でも毎回initスクリプトを編集する必要がないので、gitログが綺麗になる
  • 某所で、つい「本手法使うと10倍高速になりました!」って喋ってしまったのだけど、グラフをどう見ても10倍に見えない(実際は4.5倍)んだけど、なんで誰にもつっこまれなかったんだろう。。。
    • 10倍は別の場所での話でした
    • あと勘違いの結果、紹介したグラフは本当は8倍高速でした

 

1/25

  • 低遅延Ethernetをやってるプロジェクトを自称しておきながらUDPパケットの一つも書いた事がないのはどうなのよ、と思ったので、UDPパケットを送ってみた
    • IPv4チェックサム計算部分で少し詰まった(データグラム長を入れる前に計算してしまった&チェックサムが入る場所をゼロクリアし忘れ)が、結構すんなりできた
  • Xeon Phiマシンについてるの、e1000eだと思ってたらigbだった。。。Xeon Phiマシンからudpパケットが出せる!と思ってたのに・・・トホホ
    • ここにixgbeのネットワークカードがあるじゃろ?後はわかるな?

 

1/24

  • PCIのデバイス存在チェックって各functionごとにやらなければならないのだろうか
    • F0を見るだけで良いのかどうか・・・
  • スマートポインタの実装ミスのデバッグで夜が明けた
  • 起動時に自動実行されるスクリプトを追加した
  • lspciが文字列検索できるようになった。でも、キーボードドライバが現状Shift入力を解釈してないので、ひとまずスクリプトから実行するのが良い

 

1/20

  • slank君向けメモ
    • パケット送信の際、ixgbe_mq_start内でixgbe_mq_start_lockedが呼ばれずにenqueueされているっぽい。ARP replyが遅いのはたぶんそのため

    • ついでにこの周囲でバグるので、全部まとめて修正して欲しい(正確にはバグから逆に上記の問題が発覚した)
      • 流石にバグは修正した(たぶん

1/16

  • 性能が出ないときは、まずSpinLockを疑おう。特にLock()内でハードウェアレジスタアクセスをしてはいけない
    • という事案が前にもあったのだけど、今回もバグ特定に数時間掛かったので、自分への戒めとして記しておく

1/14

  • ついにweak pointerまで実装する必要が出てきたが、weak pointerの原理がよくわからない

1/13

  • ここ数日かけてシェル周りの改善をいろいろしている
    • ネットワークデバッグでチマチマキーボードを叩くのがダルくなったので
    • まずは今まで使えなかったバックスペースキーを使えるように
    • 次に、カーネルシェルでシェルスクリプトを使えるようにしようと作業中
      • その前段階としてコマンドが並行処理されるようにする
        • その前段階としてポインタ周りの扱いを改善
          • スマートポインタとか
          •  カーネルタスク周りのコードをスマートポインタによって置き換えてメモリ安全にしている
            • dlmalloc導入のお陰で、newを気兼ねなく呼び出せるの本当に良い(導入したのは割と前だけども)
            • dlmalloc導入に限らず、過去の進捗非カウント分をもっと活かしていきたい
    • 全然本質的じゃなくて進捗カウントできないけど、これがないと作業効率落ちるからなぁ。。。

1/11

  • 10Gスイッチだとデッドロックが発生する件、freebsd互換関数の戻り値とRaph Kernelの関数の戻り値が違うからだった
    • めちゃくちゃ時間を掛けた割にはくだらない理由だった。もう少し早くデバッグできるようになりたい
  • 10Gスイッチと1Gスイッチのリンクアップのタイミングが違うためか、1Gスイッチだと動くのに、10Gスイッチだと動かないバグが発生
    • ケーブルを挿し直すと動く
    • たぶん初期化時のリンクアップチェックの部分の移植が事故ってる
      • ポーリングの中でリンクアップチェックをやってないのがまずいので修正したら動いた
  • ネットワークブートしていると、時々自分の今走らせてるカーネルイメージがどのタイミングでビルドした物かわからなくなる(正確には疑心暗鬼になる)事がよくある
    • そこで、ビルド時にビルド時刻を吐き、カーネルの起動画面に表示するようにした
    • これで僕の精神の安寧が保たれた

1/10

  • software developer’s manualとdatasheetの違いって何なのだろう
    • 10G NICのドライバを実装するにはdatasheetを読めば良いのだけど、8254や8257の頃のdatasheetはhardware specificationで、ドライバを実装するにはsoftware developer’s manualを読まなければいけなかったような
    • まあそんな感じでixgbeのドライバのデバッグをしてる
  • ixgbeのドライバのデバッグの中で大きなハマりポイントは記事化するのでさておくとして、細かい話をいろいろ
    • 検証機、Intel NICがいっぱい積まれている!
      • e1000が2ポート、ixgbeが2ポート
        • e1000はiPXEブートに必要なのでdisableするわけにもいかない
      • 検証時にインターフェースを指定できるようにした
    • ARPが届かないと思ったら、ドライバがぶっ壊れたパケットを渡していた
      • リングバッファの初期化忘れ
    • ドライバは正しいパケットを渡しているのに、ARPが届かない
      • プロトコルスタックに幾つかバグ。プロトコルスタックごとdisableにしてとりあえず解決
    • 10Gスイッチで試したらデッドロックが発生した
      • 1Gスイッチでは動く
      • わけがわからないので、とりあえずスピンロック周りのデバッグ出力を改善中。ロックを離さない奴の情報(CPUID、スタックトレース)も表示するようにした。
    • INT48が発生して起動できない
      • 8259のINT#8につながっているので、恐らくRTCが割り込みを掛けているのだけど、そもそもIO APIC使ってるし、8259は無効化してあるつもりなんだけどなぁ
        • とりあえず空の割り込みハンドラを作成して対応した。

1/6

  • Vagrantはローカルのルートがリモートの/vagrantのsmb共有されるから、ソース編集はローカルでやれば良いのではないか、と言われて、「確かに〜」となったので、各種修正を入れた
    • yasuo-ozuさんからの指摘
      • thx
    • yasuo-ozuさんの調査曰く、smb共有ディレクトリ内のディスクイメージはループバックデバイスに登録する辺りで挙動が変わるため、正常にマウントできないとの事
      • ディスクイメージの生成先を/tmp以下にする事で対応
    • いよいよ環境構築のページの記載が古くなってきたから、書き直さねば

1/4

  • sysretのお話
    • sysretは64bitオペランドかそうでないかでreturnした後のモードが変わる。64bit modeで返したいなら、アセンブリコードとしては、sysretqと書こうな

1/3

  • とあるコードの抜粋
    • /* This simple GRUB implementation of EHCI driver: 

      *      – assumes no IRQ

      *      – is not supporting isochronous transfers (iTD, siTD)

      *      – is not supporting interrupt transfers

      */

      • interrupt transferをサポートしてないってどういう事???

1/2

  • vagrantの接続が時々切れて息をしなくなる問題(VirtualBox GUIからはつながる)
    • どうやらe1000 NICのリセットが掛かってる気がする
    • 調べたら、Intel NIC以外を使え、と
    • ということでvirtioに切り替え

1/1

  • あけましておめでとうございます
広告