06.04.2020 23:55, Sowjanya Komatineni пишет: > > On 4/6/20 1:53 PM, Dmitry Osipenko wrote: >> External email: Use caution opening links or attachments >> >> >> 06.04.2020 23:50, Sowjanya Komatineni пишет: >>> On 4/6/20 1:45 PM, Dmitry Osipenko wrote: >>>> External email: Use caution opening links or attachments >>>> >>>> >>>> 04.04.2020 04:25, Sowjanya Komatineni пишет: >>>>> +static int chan_capture_kthread_start(void *data) >>>>> +{ >>>>> + struct tegra_vi_channel *chan = data; >>>>> + struct tegra_channel_buffer *buf; >>>>> + int err = 0; >>>>> + int caps_inflight; >>>>> + >>>>> + set_freezable(); >>>>> + >>>>> + while (1) { >>>>> + try_to_freeze(); >>>>> + >>>>> + wait_event_interruptible(chan->start_wait, >>>>> + !list_empty(&chan->capture) || >>>>> + kthread_should_stop()); >>>>> + /* >>>>> + * Frame start and MW_ACK_DONE syncpoint condition >>>>> FIFOs are >>>>> + * of max depth 2. So make sure max 2 capture >>>>> requests are >>>>> + * in process by the hardware at a time. >>>>> + */ >>>>> + while (!(kthread_should_stop() || >>>>> list_empty(&chan->capture))) { >>>>> + caps_inflight = chan->capture_reqs - >>>>> chan->sequence; >>>>> + /* >>>>> + * Source is not streaming if error is non-zero. >>>>> + * So, do not dequeue buffers on capture error >>>>> or when >>>>> + * syncpoint requests in FIFO are full. >>>>> + */ >>>>> + if (err || caps_inflight >= SYNCPT_FIFO_DEPTH) >>>>> + break; >>>> Am I understanding correctly that this thread will take 100% CPU, >>>> spinning here, if more than 2 frame-captures queued? >>> on more than 2 frames captures, it breaks thread and on next wakeup it >>> continues >> The wait_event() won't wait if condition is true. > condition is checked when waitqueue is woken up https://elixir.bootlin.com/linux/v5.6.2/source/include/linux/wait.h#L462