Messages in this thread | | | Date | Tue, 8 Mar 2016 18:52:06 +0100 | From | Sebastian Andrzej Siewior <> | Subject | Re: [RFC v0] Use swait in completion |
| |
* Daniel Wagner | 2016-03-08 16:59:13 [+0100]:
>Hi, Hi,
>As Peter correctly pointed out in [1] a simple conversion from >wait to swait in completion.c wont work. I played a bit around and >came up with this rather ugly idea.
besides all the things I mentioned privatly, here is what I have currently in -RT:
+void swake_up_all_locked(struct swait_queue_head *q) +{ + struct swait_queue *curr; + int wakes = 0; + + while (!list_empty(&q->task_list)) { + + curr = list_first_entry(&q->task_list, typeof(*curr), + task_list); + wake_up_process(curr->task); + list_del_init(&curr->task_list); + wakes++; + } + WARN_ON(wakes > 2); +} +EXPORT_SYMBOL(swake_up_all_locked);
the remaining part is what you have. The only user so far is complete() and currently I see ony complete_all() with zero or one waiter. If none of my boxes die over the night, I intend to release this tomorrow in -RT and see if someone else triggers the limit.
However I don't think if your DEFER flag solution is all that bad. I have also the block-mq in -RT using swait and they perform wakes with irqs-off. Not in -RT but mainline. So me might need something to make it work properly. But if we defer the wakeup they might come at us and complain about the latency…
Sebastian
| |