Re: [PATCH v4 2/4] drm/rockchip: add an common abstracted PSR driver

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

 



Doug,

On 07/23/2016 12:04 PM, Doug Anderson wrote:
Yakir,

On Wed, Jul 13, 2016 at 9:15 PM, Yakir Yang <ykk@xxxxxxxxxxxxxx> wrote:
+static void psr_set_state(struct psr_drv *psr, enum psr_state state)
+{
+       mutex_lock(&psr->state_mutex);
+
+       if (psr->state == state) {
+               mutex_unlock(&psr->state_mutex);
+               return;
+       }
+
+       psr->state = state;
+       switch (state) {
+       case PSR_ENABLE:
+               psr->set(psr->encoder, true);
+               break;
+
+       case PSR_DISABLE:
+       case PSR_FLUSH:
+               psr->set(psr->encoder, false);
+               break;
+       };
+
+       mutex_unlock(&psr->state_mutex);
+}
+
+static void psr_flush_handler(unsigned long data)
+{
+       struct psr_drv *psr = (struct psr_drv *)data;
+
+       if (!psr || psr->state != PSR_FLUSH)
+               return;
+
+       psr_set_state(psr, PSR_ENABLE);
As mentioned in a separate thread, this is probably not OK.
psr_set_state() grabs a mutex and that might sleep.  ...but
psr_flush_handler() is a timer.  I'm nearly certain that timers can't
sleep.

I believe this is the source of "sleeping function called from invalid
context" that I've seen at times.

Thanks for your reported, i have wrote a patch[0] to fix this problem in my v5. If you're happy to review, that would be great ;)

[0]: https://patchwork.kernel.org/patch/9244805/

- Yakir


-Doug





_______________________________________________
dri-devel mailing list
dri-devel@xxxxxxxxxxxxxxxxxxxxx
https://lists.freedesktop.org/mailman/listinfo/dri-devel




[Index of Archives]     [Linux DRI Users]     [Linux Intel Graphics]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]     [XFree86]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Linux Kernel]     [Linux SCSI]     [XFree86]
  Powered by Linux