All of lore.kernel.org
 help / color / mirror / Atom feed
From: Paolo Bonzini <pbonzini@redhat.com>
To: Marcelo Tosatti <mtosatti@redhat.com>
Cc: kvm@vger.kernel.org, qemu-devel@nongnu.org
Subject: Re: [PATCH 3/3] stop the periodic RTC update timer
Date: Thu, 12 Jan 2012 11:43:10 +0100	[thread overview]
Message-ID: <4F0EB93E.9090908@redhat.com> (raw)
In-Reply-To: <20120112102031.GA31635@amt.cnet>

On 01/12/2012 11:20 AM, Marcelo Tosatti wrote:
>> >
>> >  The point is not_correctness_.  It is_atomicity_.
> Quoting you earlier
>
> "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."

(The actual figure is 244, not 220; my mistake).

> Agree with the first point, but the second, the emulated RTC never
> returns a bogus read.

That's true: the update cycle takes 1984 us on the real RTC, and 0 us on 
QEMU.

However, the data sheet says that the update cycle begins 244 us _after_ 
the rising edge of UIP.  In other words, UIP is set for 1984 + 244 us on 
the real RTC, and should be set for 0 + 244 us on the emulated RTC.

This is done on purpose: the data sheet says, "if a low is read on the 
UIP bit, the user has at least 244 us before the time/calendar data will 
be changed".  As long as you read the time within 244 us, the following 
cannot happen:

    read UIP     => 0
    read HOURS   => 10
    read MINUTES => 59
    read SECONDS => 59
    ...
    read UIP     => 0
    read HOURS   => 10
    read MINUTES => 59
                       update happens! (on real RTC: update cycle starts)
    read SECONDS => 0                  (on real RTC: undefined)

You are a kernel junkie and as such you are too much accustomed to 
seqlocks. ;)

If you know the read will take more than 244 us, the data sheet suggests 
that you use the update-ended interrupt.  But you can also wait for the 
falling edge of UIP, like Xen does.  The falling edge of UIP will never 
happen if the emulated RTC always returns 0 for UIP.

Paolo

WARNING: multiple messages have this Message-ID (diff)
From: Paolo Bonzini <pbonzini@redhat.com>
To: Marcelo Tosatti <mtosatti@redhat.com>
Cc: qemu-devel@nongnu.org, kvm@vger.kernel.org
Subject: Re: [Qemu-devel] [PATCH 3/3] stop the periodic RTC update timer
Date: Thu, 12 Jan 2012 11:43:10 +0100	[thread overview]
Message-ID: <4F0EB93E.9090908@redhat.com> (raw)
In-Reply-To: <20120112102031.GA31635@amt.cnet>

On 01/12/2012 11:20 AM, Marcelo Tosatti wrote:
>> >
>> >  The point is not_correctness_.  It is_atomicity_.
> Quoting you earlier
>
> "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."

(The actual figure is 244, not 220; my mistake).

> Agree with the first point, but the second, the emulated RTC never
> returns a bogus read.

That's true: the update cycle takes 1984 us on the real RTC, and 0 us on 
QEMU.

However, the data sheet says that the update cycle begins 244 us _after_ 
the rising edge of UIP.  In other words, UIP is set for 1984 + 244 us on 
the real RTC, and should be set for 0 + 244 us on the emulated RTC.

This is done on purpose: the data sheet says, "if a low is read on the 
UIP bit, the user has at least 244 us before the time/calendar data will 
be changed".  As long as you read the time within 244 us, the following 
cannot happen:

    read UIP     => 0
    read HOURS   => 10
    read MINUTES => 59
    read SECONDS => 59
    ...
    read UIP     => 0
    read HOURS   => 10
    read MINUTES => 59
                       update happens! (on real RTC: update cycle starts)
    read SECONDS => 0                  (on real RTC: undefined)

You are a kernel junkie and as such you are too much accustomed to 
seqlocks. ;)

If you know the read will take more than 244 us, the data sheet suggests 
that you use the update-ended interrupt.  But you can also wait for the 
falling edge of UIP, like Xen does.  The falling edge of UIP will never 
happen if the emulated RTC always returns 0 for UIP.

Paolo

  reply	other threads:[~2012-01-12 10:43 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
2012-01-11  7:24           ` [Qemu-devel] " 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 [this message]
2012-01-12 10:43           ` 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=4F0EB93E.9090908@redhat.com \
    --to=pbonzini@redhat.com \
    --cc=kvm@vger.kernel.org \
    --cc=mtosatti@redhat.com \
    --cc=qemu-devel@nongnu.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 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.