http://akiradeveloper.hatenadiary.com/entry/2013/12/21/111842
の続き. 並列フラッシュはどう実装するか.
現状は, kernel threadがloopしながら, キューからflush jobを刈り取ってフラッシュするという実装になっているが, これを並列にしたい.
workqueueを使う. 並列度の動的な変更には, workqueue_set_max_active
を使えば良いだろう. kernel threadの実装をworkqueueで実行するように変更することが必要である. 並列度は, messageによって変更するようにすればいい. statusも変更が必要になりそうだ. tunable parametersに入れたらよいだろう.
/** * workqueue_set_max_active - adjust max_active of a workqueue * @wq: target workqueue * @max_active: new max_active value. * * Set max_active of @wq to @max_active. * * CONTEXT: * Don't call from IRQ context. */ void workqueue_set_max_active(struct workqueue_struct *wq, int max_active) { struct pool_workqueue *pwq; /* disallow meddling with max_active for ordered workqueues */ if (WARN_ON(wq->flags & __WQ_ORDERED)) return; max_active = wq_clamp_max_active(max_active, wq->flags, wq->name); mutex_lock(&wq->mutex); wq->saved_max_active = max_active; for_each_pwq(pwq, wq) pwq_adjust_max_active(pwq); mutex_unlock(&wq->mutex); } EXPORT_SYMBOL_GPL(workqueue_set_max_active);
閉塞処理にも問題はたぶん生まれない. 今は「いずれかのデバイスが死んだら, 全デバイスを/dev/nullに切り替えてデータ破壊がないようにする」という発想であるから, たぶん, kthreadだろうがworkqueueだろうが関係はない. 並列フラッシュでもたぶん影響はない. そもそもworkqueueの実態はkthreadである. この点からも, workqueue本体が余計なことをしていなければ問題は起きない.