On Thu, Nov 23 2017 at 5:27pm -0500, Mikulas Patocka <mpato...@redhat.com> wrote:
> > > On Thu, 23 Nov 2017, Christoph Hellwig wrote: > > > Please run this past the swait authors. It is supposed to be a simple > > and self-contained API so I'd expect this patch to be seen critical. > > I already sent it to Peter Zijlstra and didn't get a response yet. > > > You might be better off to just use the normal complex waitqueues if > > you want to micro-optimize like this. > > If we wanted to micro-optimize, we should use the simpler wait queue > variant. > > > If these functions are not supposed to be used by others, then > - why are they in in file swait.h? > - why does the implementation export swake_up_locked which assumes that > someone else will lock the spinlock before calling it? Hi, I'd like to get this patch upstream. I'm happy to send it to Linus via linux-dm.git but I wanted to check with others who might care more deeply about swait interfaces to get their Ack (or otherwise): https://git.kernel.org/pub/scm/linux/kernel/git/device-mapper/linux-dm.git/commit/?h=dm-4.18&id=4a2ec3f321f83db09da4824025420586c9ef1612 Here is Mikulas' DM driver code that makes use of __prepare_to_swait() and __finish_swait(): static int writecache_endio_thread(void *data) { struct dm_writecache *wc = data; while (1) { DECLARE_SWAITQUEUE(wait); struct list_head list; raw_spin_lock_irq(&wc->endio_thread_wait.lock); continue_locked: if (!list_empty(&wc->endio_list)) goto pop_from_list; set_current_state(TASK_INTERRUPTIBLE); __prepare_to_swait(&wc->endio_thread_wait, &wait); raw_spin_unlock_irq(&wc->endio_thread_wait.lock); if (unlikely(kthread_should_stop())) { finish_swait(&wc->endio_thread_wait, &wait); break; } schedule(); raw_spin_lock_irq(&wc->endio_thread_wait.lock); __finish_swait(&wc->endio_thread_wait, &wait); goto continue_locked; pop_from_list: list = wc->endio_list; list.next->prev = list.prev->next = &list; INIT_LIST_HEAD(&wc->endio_list); raw_spin_unlock_irq(&wc->endio_thread_wait.lock); ...