読者です 読者をやめる 読者になる 読者になる

テストステ論

高テス協会会長が, テストステロンに関する情報をお届けします.

work_structをwork_fnの中で解放してはならない

リードキャッシングを実装していたら, ライトブーストの致命的なバグが見つかったのでFixした.

Fixする前, SSDへのライトはどうやって行われていたかというと,

  • work_structを含んだflush_jobという構造をmempool_alloc
  • 適切に初期化する
  • workqueueに突っ込む
  • work_fn(flush_proc)の中でdm_ioを使ってライトする
  • work_fnの最後にmempool_free // これがまずい

私の調査によると, work_structをwork_fnの中でfreeしてはならない. これをやると, 後々の処理でアクセス違反を起こす. なんか突然落ちるのでなぜかなぁと悩んでいたが, 今しがたふと気づいた.

修正すると, リードキャッシングは動作するようになった. 本格的なテストだとかはまだだが, 時間の問題だろう.

今までのコードが落ちなかったのが不思議だが, たまたまだと思う. リードキャッシングは, work_structの中からさらにwork_structをqueueするという構造になっている. 恐らくだが, これが問題を露見したのだと思う.