Re: [RFC PATCH v6 6/9] media: tegra: Add Tegra210 Video input driver

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 




On 4/6/20 1:02 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());
Is it really okay that list_empty() isn't protected with a lock?

Why wait_event is "interruptible"?

To allow it to sleep until wakeup on thread it to avoid constant checking for condition even when no buffers are ready, basically to prevent blocking.


+             /*
+              * 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;
+
+                     /* dequeue the buffer and start capture */
+                     spin_lock(&chan->start_lock);
+                     if (list_empty(&chan->capture))
+                             break;
+                     buf = list_entry(chan->capture.next,
+                                      struct tegra_channel_buffer, queue);
list_first_entry()

+                     list_del_init(&buf->queue);
+                     spin_unlock(&chan->start_lock);
+
+                     err = tegra_channel_capture_frame(chan, buf);
+                     if (err)
+                             vb2_queue_error(&chan->queue);
+             }
+
+             if (kthread_should_stop())
+                     break;
+     }
+
+     return 0;
+}




[Index of Archives]     [ARM Kernel]     [Linux ARM]     [Linux ARM MSM]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux