From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752023AbcGXHI7 (ORCPT ); Sun, 24 Jul 2016 03:08:59 -0400 Received: from lucky1.263xmail.com ([211.157.147.132]:55510 "EHLO lucky1.263xmail.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751562AbcGXHI5 (ORCPT ); Sun, 24 Jul 2016 03:08:57 -0400 X-263anti-spam: KSV:0; X-MAIL-GRAY: 1 X-MAIL-DELIVERY: 0 X-KSVirus-check: 0 X-ABS-CHECKED: 4 X-ADDR-CHECKED: 0 X-RL-SENDER: ykk@rock-chips.com X-FST-TO: linux-rockchip@lists.infradead.org X-SENDER-IP: 103.29.142.67 X-LOGIN-NAME: ykk@rock-chips.com X-UNIQUE-TAG: <31e1da94a8d3fa2de75628bbb84c2d41> X-ATTACHMENT-NUM: 0 X-DNS-TYPE: 0 Subject: Re: [PATCH v4 2/4] drm/rockchip: add an common abstracted PSR driver To: Doug Anderson References: <1468469704-12440-1-git-send-email-ykk@rock-chips.com> <1468469749-12636-1-git-send-email-ykk@rock-chips.com> Cc: Mark Yao , Inki Dae , Jingoo Han , Heiko Stuebner , Javier Martinez Canillas , =?UTF-8?Q?St=c3=a9phane_Marchesin?= , Sean Paul , Tomasz Figa , David Airlie , Daniel Vetter , Thierry Reding , Krzysztof Kozlowski , Emil Velikov , Dan Carpenter , "linux-kernel@vger.kernel.org" , "dri-devel@lists.freedesktop.org" , linux-samsung-soc , "open list:ARM/Rockchip SoC..." From: Yakir Yang Message-ID: <57946982.7050209@rock-chips.com> Date: Sun, 24 Jul 2016 15:08:50 +0800 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:38.0) Gecko/20100101 Thunderbird/38.8.0 MIME-Version: 1.0 In-Reply-To: Content-Type: text/plain; charset=utf-8; format=flowed Content-Transfer-Encoding: 7bit Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Doug, On 07/23/2016 12:04 PM, Doug Anderson wrote: > Yakir, > > On Wed, Jul 13, 2016 at 9:15 PM, Yakir Yang 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 > > >