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

テストステ論

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

(writeboost report) 並列フラッシュの実装

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本体が余計なことをしていなければ問題は起きない.