All of lore.kernel.org
 help / color / mirror / Atom feed
From: Paolo Bonzini <pbonzini@redhat.com>
To: "Zhang, Yang Z" <yang.z.zhang@intel.com>
Cc: "qemu-devel@nongnu.org" <qemu-devel@nongnu.org>,
	"avi@redhat.com" <avi@redhat.com>,
	"aliguori@us.ibm.com" <aliguori@us.ibm.com>,
	"Zhang, Xiantao" <xiantao.zhang@intel.com>,
	"Shan, Haitao" <haitao.shan@intel.com>,
	"kvm@vger.kernel.org" <kvm@vger.kernel.org>
Subject: Re: [PATCH 3/3] stop the periodic RTC update timer
Date: Wed, 11 Jan 2012 08:24:45 +0100	[thread overview]
Message-ID: <4F0D393D.5090909@redhat.com> (raw)
In-Reply-To: <A9667DDFB95DB7438FA9D7D576C3D87E0240C7@SHSMSX102.ccr.corp.intel.com>

On 01/11/2012 01:56 AM, Zhang, Yang Z wrote:
>>>> Clients are supposed to wait for UIP=0 before reading the RTC,
>>>> and an update is supposed to be at least 220 microseconds away
>>>> when UIP=0.
>>> 
>>> Hardware need a period time to update clock and it would not
>>> provide the right value during the update. So it uses UIP to
>>> notify the software doesn't believe the value if the UIP is set.
>>> For emulation, you can read RTC at any time and it always gives
>>> you the right value. So there is no need to emulate UIP.
>> 
>> This is incorrect, for two reasons.  First, the UIP is in the spec,
>> and we have to implement it.  Second, reading the clock is not
>> atomic, and waiting for UIP=0 gives you 220 microseconds during
>> which you know that the read will appear atomic.
> 
> For a simulator, we need to follow the spec strictly and simulate
> hardware as precisely as possible. But QEMU is a generic machine
> emulator and virtualizer. It's not a hardware simulator. If there is
> an easy way we can provide the same function, why we chose the
> complicated one?

Because it's not in the spec because some engineer thought it was cool.
It's in the spec because it gives you a way to do atomic reads.

QEMU not being a simulator means that we always assume that the RTC
is programmed for a 32768 Hz clock, for example, because any other
setting would not make sense on a PC.  We can use a 1-second (or
higher, as in your patches) timer, rather than a 32768 Hz timer which
anyway would not work well.

So we're taking shortcuts, but each of them must be evaluated
separately, and _this_ shortcut is not acceptable.

> Also, is there an actual case that break with my patch?

Any decent unit test for the RTC would break.

>> It means that the (not externally visible) millisecond value is set
>> to 500 when you modify the current time of the RTC.  The next
>> update of the clock will happen exactly 500 ms after you reset bit
>> 7 of register B.
> 
> Same question, any reason need to complicate the current logic? Or
> any actual usage model need to add this?

Is it really so difficult to implement?

Note that this case is mentioned in drivers/rtc/rtc-cmos.c in the Linux
source code, even though it is not used.

Paolo

WARNING: multiple messages have this Message-ID (diff)
From: Paolo Bonzini <pbonzini@redhat.com>
To: "Zhang, Yang Z" <yang.z.zhang@intel.com>
Cc: "aliguori@us.ibm.com" <aliguori@us.ibm.com>,
	"kvm@vger.kernel.org" <kvm@vger.kernel.org>,
	"Shan, Haitao" <haitao.shan@intel.com>,
	"qemu-devel@nongnu.org" <qemu-devel@nongnu.org>,
	"avi@redhat.com" <avi@redhat.com>
Subject: Re: [Qemu-devel] [PATCH 3/3] stop the periodic RTC update timer
Date: Wed, 11 Jan 2012 08:24:45 +0100	[thread overview]
Message-ID: <4F0D393D.5090909@redhat.com> (raw)
In-Reply-To: <A9667DDFB95DB7438FA9D7D576C3D87E0240C7@SHSMSX102.ccr.corp.intel.com>

On 01/11/2012 01:56 AM, Zhang, Yang Z wrote:
>>>> Clients are supposed to wait for UIP=0 before reading the RTC,
>>>> and an update is supposed to be at least 220 microseconds away
>>>> when UIP=0.
>>> 
>>> Hardware need a period time to update clock and it would not
>>> provide the right value during the update. So it uses UIP to
>>> notify the software doesn't believe the value if the UIP is set.
>>> For emulation, you can read RTC at any time and it always gives
>>> you the right value. So there is no need to emulate UIP.
>> 
>> This is incorrect, for two reasons.  First, the UIP is in the spec,
>> and we have to implement it.  Second, reading the clock is not
>> atomic, and waiting for UIP=0 gives you 220 microseconds during
>> which you know that the read will appear atomic.
> 
> For a simulator, we need to follow the spec strictly and simulate
> hardware as precisely as possible. But QEMU is a generic machine
> emulator and virtualizer. It's not a hardware simulator. If there is
> an easy way we can provide the same function, why we chose the
> complicated one?

Because it's not in the spec because some engineer thought it was cool.
It's in the spec because it gives you a way to do atomic reads.

QEMU not being a simulator means that we always assume that the RTC
is programmed for a 32768 Hz clock, for example, because any other
setting would not make sense on a PC.  We can use a 1-second (or
higher, as in your patches) timer, rather than a 32768 Hz timer which
anyway would not work well.

So we're taking shortcuts, but each of them must be evaluated
separately, and _this_ shortcut is not acceptable.

> Also, is there an actual case that break with my patch?

Any decent unit test for the RTC would break.

>> It means that the (not externally visible) millisecond value is set
>> to 500 when you modify the current time of the RTC.  The next
>> update of the clock will happen exactly 500 ms after you reset bit
>> 7 of register B.
> 
> Same question, any reason need to complicate the current logic? Or
> any actual usage model need to add this?

Is it really so difficult to implement?

Note that this case is mentioned in drivers/rtc/rtc-cmos.c in the Linux
source code, even though it is not used.

Paolo

  reply	other threads:[~2012-01-11  7:24 UTC|newest]

Thread overview: 36+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2012-01-06  7:37 [PATCH 3/3] stop the periodic RTC update timer Zhang, Yang Z
2012-01-06  7:37 ` [Qemu-devel] " Zhang, Yang Z
2012-01-06 17:26 ` Jan Kiszka
2012-01-06 17:26   ` [Qemu-devel] " Jan Kiszka
2012-01-09  7:10   ` Zhang, Yang Z
2012-01-09  7:10     ` [Qemu-devel] " Zhang, Yang Z
2012-01-09  8:19 ` Paolo Bonzini
2012-01-09  8:19   ` [Qemu-devel] " Paolo Bonzini
2012-01-10  6:37   ` Zhang, Yang Z
2012-01-10  6:37     ` [Qemu-devel] " Zhang, Yang Z
2012-01-10  9:24     ` Paolo Bonzini
2012-01-10  9:24       ` [Qemu-devel] " Paolo Bonzini
2012-01-11  0:56       ` Zhang, Yang Z
2012-01-11  0:56         ` [Qemu-devel] " Zhang, Yang Z
2012-01-11  7:24         ` Paolo Bonzini [this message]
2012-01-11  7:24           ` Paolo Bonzini
2012-01-12  0:51           ` Zhang, Yang Z
2012-01-12  0:51             ` [Qemu-devel] " Zhang, Yang Z
2012-01-12  9:41             ` Paolo Bonzini
2012-01-11  7:25         ` [Qemu-devel] " Philipp Hahn
2012-01-11 13:10 ` Marcelo Tosatti
2012-01-11 13:10   ` [Qemu-devel] " Marcelo Tosatti
2012-01-12  0:00   ` Zhang, Yang Z
2012-01-12  0:00     ` [Qemu-devel] " Zhang, Yang Z
2012-01-12  9:26     ` Paolo Bonzini
2012-01-12  9:26       ` [Qemu-devel] " Paolo Bonzini
2012-01-12 10:20       ` Marcelo Tosatti
2012-01-12 10:20         ` [Qemu-devel] " Marcelo Tosatti
2012-01-12 10:43         ` Paolo Bonzini
2012-01-12 10:43           ` [Qemu-devel] " Paolo Bonzini
2012-01-12  9:59     ` Marcelo Tosatti
2012-01-12  9:59       ` [Qemu-devel] " Marcelo Tosatti
2012-01-12 10:03       ` Marcelo Tosatti
2012-01-12 10:03         ` [Qemu-devel] " Marcelo Tosatti
2012-01-12 10:12         ` Zhang, Yang Z
2012-01-12 10:12           ` [Qemu-devel] " Zhang, Yang Z

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=4F0D393D.5090909@redhat.com \
    --to=pbonzini@redhat.com \
    --cc=aliguori@us.ibm.com \
    --cc=avi@redhat.com \
    --cc=haitao.shan@intel.com \
    --cc=kvm@vger.kernel.org \
    --cc=qemu-devel@nongnu.org \
    --cc=xiantao.zhang@intel.com \
    --cc=yang.z.zhang@intel.com \
    /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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.