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