Re: [PATCH] UBI: new module ubiblk: block layer on top of UBI

David Wagner
2011-06-28T11:35:26Z

Hi,

On 06/27/2011 09:26 PM, Artem Bityutskiy wrote:
> On Fri, 2011-06-24 at 15:34 +0200, david.wagner@free-electrons.com
> wrote:
>> + /* Stolen from mtd_blkdevs.c */
>> + /* Create processing thread */
>> + dev->thread = kthread_run(ubi_ubiblk_thread, dev, "%s%d_%d",
>> + "kubiblkd", dev->ubi_num, dev->vol_id);
>> + if (IS_ERR(dev->thread)) {
>> + ret = PTR_ERR(dev->thread);
>> + goto out_thread;
>> + }
>
> Why we need a kernel thread? Could you please describe when exactly it
> is needed and why we cannot avoid having it?

Do you mean that there could be another/better way ?
I read that workqueues could be used for that but since they seem to
internally use kthreads, I don't see the advantage yet. Simpler API ?

I also tried without a kthread altogether (and call do_ubiblk_request
directly within the callback registered with blk_init_queue) but got
lost in locks/context debugging ...

It seems that do_ubiblk_request needs to be in process context because
there are thousands causes for blocking (locking, page fault, for
instance, are the one I encountered). And on the other hand,
blk_run_queue must not block ; So we need to wake the thread up and
return (what ubi_ubiblk_request does).
So, would this be a sufficient justification ?

It's probably possible, however, to have only one thread for the whole
module instead of having one for each volume ; but that seemed good
enough on first approach.

I fixed the read errors issue with filesystems != SquashFS, so they
should all work, now.
I'll send the next iteration, probably later today.

--
David Wagner, Free Electrons
Kernel, drivers, real-time and embedded Linux
development, consulting, training and support.