linux-clk.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Dirk Behme <dirk.behme@de.bosch.com>
To: Michael Turquette <mturquette@baylibre.com>,
	Julien Grall <julien.grall@arm.com>,
	<linux-arm-kernel@lists.infradead.org>,
	Mark Rutland <mark.rutland@arm.com>, <devicetree@vger.kernel.org>
Cc: <xen-devel@lists.xenproject.org>,
	Stefano Stabellini <sstabellini@kernel.org>,
	Stephen Boyd <sboyd@codeaurora.org>, <linux-clk@vger.kernel.org>
Subject: Re: [Xen-devel] [PATCH v2] xen/arm: register clocks used by the hypervisor
Date: Fri, 8 Jul 2016 07:51:35 +0200	[thread overview]
Message-ID: <373bf006-1a5e-0b2b-278d-d5ec0d8737fd@de.bosch.com> (raw)
In-Reply-To: <146794625655.73491.13497001485518368066@resonance>

On 08.07.2016 04:50, Michael Turquette wrote:
> Quoting Dirk Behme (2016-07-07 00:32:34)
>> Hi Michael,
>>
>> On 06.07.2016 22:42, Michael Turquette wrote:
>>> Hi Julien,
>>>
>>> Quoting Julien Grall (2016-07-06 06:10:52)
>>>> On 06/07/16 02:34, Michael Turquette wrote:
>>>>> Hi!
>>>>
>>>> Hello Michael,
>>>>
>>>>> Quoting Dirk Behme (2016-06-30 03:32:32)
>>>>>> Some clocks might be used by the Xen hypervisor and not by the Linux
>>>>>> kernel. If these are not registered by the Linux kernel, they might be
>>>>>> disabled by clk_disable_unused() as the kernel doesn't know that they
>>>>>> are used. The clock of the serial console handled by Xen is one
>>>>>> example for this. It might be disabled by clk_disable_unused() which
>>>>>> stops the whole serial output, even from Xen, then.
>>>>>
>>>>> This whole thread had me confused until I realized that it all boiled
>>>>> down to some nomenclature issues (for me).
>>>>>
>>>>> This code does not _register_ any clocks. It simply gets them and
>>>>> enables them, which is what every other clk consumer in the Linux kernel
>>>>> does. More details below.
>>>>>
>>>>>>
>>>>>> Up to now, the workaround for this has been to use the Linux kernel
>>>>>> command line parameter 'clk_ignore_unused'. See Xen bug
>>>>>>
>>>>>> http://bugs.xenproject.org/xen/bug/45
>>>>>
>>>>> clk_ignore_unused is a band-aid, not a proper medical solution. Setting
>>>>> that flag will not turn clocks on for you, nor will it guarantee that
>>>>> those clocks are never turned off in the future. It looks like you
>>>>> figured this out correctly in the patch below but it is worth repeating.
>>>>>
>>>>> Also the new CLK_IS_CRITICAL flag might be of interest to you, but that
>>>>> flag only exists as a way to enable clocks that must be enabled for the
>>>>> system to function (hence, "critical") AND when those same clocks do not
>>>>> have an accompanying Linux driver to consume them and enable them.
>>>>
>>>> I don't think we want the kernel to enable the clock for the hypervisor.
>>>> We want to tell the kernel "don't touch at all to this clock, it does
>>>> not belong to you".
>>>
>>> But the patch *does* touch the clock from the kernel. It enables the
>>> clock via a call clk_prepare_enable. I'm utterly confused.
>>
>>
>> Maybe we need some advice here :)
>
> Sure!
>
>>
>>
>> I've used clk_prepare_enable() 'just' to get the enable count incremented
>
> clk_prepare_enabled will *enable* the clock signal if it currently
> disabled or gated. In other words, if the physical line is not toggling
> before the call, it will be after the call returns.
>
>>
>> http://lxr.free-electrons.com/source/drivers/clk/clk.c#L751
>>
>> Because it's my understanding that enable_count is needed to prevent
>> clk_disable_unused() from disabling the clock.
>
> Having a positive enable_count will prevent the clock from being
> disabled by both clk_disable_unused AND from the Sneaky Sibling
> Attack(tm).
>
> The Sneaky Sibling Attack(tm) occurs when clock A and clock B are
> siblings and share the same parent, clock C. If clock A is enabled in
> hardware (by bootloader, firmware or hypervisor), but does NOT have a
> positive enable_count (in Linux), then it is possible that a driver
> might call clk_enable(clk_B) then clk_disable(clk_B), which will result
> in the disable action propagating up the parent chain and disabling
> clk_C, the shared parent. This will of course gate clk_A, which is
> clocked by clk_C, breaking things for you.
>
> So you need to be worried about more than just clk_disable_unused.
>
> The simple fact is is that if a piece of software knows that it needs
> for its clock to be enabled, it should actively enable it with
> clk_prepare_enable.
>
> Doing some weird stuff with CLK_IGNORE_UNUSED or anything else is just
> hoping that your clock will not be disabled, and that is the wrong
> strategy.
>
>>
>>
>> If there is an other / better / correct way to achieve that, please let
>> us know.
>
> Well, you should not "try to prevent a clock from being disabled", you
> should "enable the clock that you need to use".
>
>>
>>
>> I've had a look to use the CLK_IGNORE_UNUSED flag, too. But couldn't
>> find a function exported by the clock framework to set that flag (?)
>
> Right, the flags are immutable and must be set by the clock provider
> driver before registering the clock. Toggling flags at run-time is a
> misuse of the flags, and clock consumer drivers should never care about
> the flags. They are internal to the clock framework.
>
> In conclusion, I think that your patch does the right thing. The Xen
> node consumes the clocks that it needs to manage and it calls
> clk_prepare_enable on them.


Ok, thanks!


> The two issues to resolve are:
>
> 1) does consuming these hardware resources from the Linux kernel fit
> correctly with the Xen model?


I think so. Julien, what do you think?


> 2) the language of the binding description makes this way more confusing
> than it needs to be. Just claim the resources you need and enable them,
> which is an OS-agnostic action.


I'll post a v3 patch trying to update the description with your proposals.


Best regards

Dirk

  reply	other threads:[~2016-07-08  5:51 UTC|newest]

Thread overview: 23+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2016-06-30 10:32 [PATCH v2] xen/arm: register clocks used by the hypervisor Dirk Behme
2016-06-30 14:21 ` Mark Rutland
2016-06-30 14:56   ` [Xen-devel] " Dirk Behme
2016-06-30 15:18     ` Mark Rutland
2016-06-30 15:33       ` Julien Grall
2016-07-05 13:53 ` Stefano Stabellini
2016-07-05 13:54   ` Julien Grall
2016-07-05 14:02     ` Julien Grall
2016-07-05 14:04     ` Stefano Stabellini
2016-07-05 14:08       ` Julien Grall
2016-07-05 14:37         ` Stefano Stabellini
2016-07-06  1:34 ` Michael Turquette
2016-07-06 13:10   ` Julien Grall
2016-07-06 13:16     ` Stefano Stabellini
2016-07-06 13:26       ` Julien Grall
2016-07-06 13:48       ` Mark Rutland
2016-07-06 20:42     ` Michael Turquette
2016-07-07  7:32       ` Dirk Behme
2016-07-08  2:50         ` Michael Turquette
2016-07-08  5:51           ` Dirk Behme [this message]
2016-07-08  9:21             ` [Xen-devel] " Julien Grall
2016-07-08  6:48   ` Dirk Behme
2016-07-08  9:35     ` Julien Grall

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=373bf006-1a5e-0b2b-278d-d5ec0d8737fd@de.bosch.com \
    --to=dirk.behme@de.bosch.com \
    --cc=devicetree@vger.kernel.org \
    --cc=julien.grall@arm.com \
    --cc=linux-arm-kernel@lists.infradead.org \
    --cc=linux-clk@vger.kernel.org \
    --cc=mark.rutland@arm.com \
    --cc=mturquette@baylibre.com \
    --cc=sboyd@codeaurora.org \
    --cc=sstabellini@kernel.org \
    --cc=xen-devel@lists.xenproject.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).