public inbox for linux-kernel@vger.kernel.org
 help / color / mirror / Atom feed
From: george anzinger <george@mvista.com>
To: Stephen Hemminger <shemminger@osdl.org>
Cc: Linus Torvalds <torvalds@transmeta.com>,
	Andrea Arcangeli <andrea@suse.de>, Andi Kleen <ak@suse.de>,
	Andrew Morton <akpm@digeo.com>,
	Linux Kernel Mailing List <linux-kernel@vger.kernel.org>
Subject: Re: [PATCH] (2/4) 2.5.59 fast reader/writer lock for gettimeofday
Date: Tue, 28 Jan 2003 16:24:50 -0800	[thread overview]
Message-ID: <3E371F52.370D1F77@mvista.com> (raw)
In-Reply-To: 1043797351.10150.302.camel@dell_ss3.pdx.osdl.net

One wonders if it wouldn't be better to put the div in
gettimeofday() outside of the lock region, see below...  It
makes the while condition even more unlikely.

-g

~snip~

> diff -urN -X dontdiff linux-2.5.59/arch/i386/kernel/time.c linux-2.5-frlock/arch/i386/kernel/time.c
> --- linux-2.5.59/arch/i386/kernel/time.c        2003-01-17 09:42:14.000000000 -0800
> +++ linux-2.5-frlock/arch/i386/kernel/time.c    2003-01-24 15:06:37.000000000 -0800
> @@ -70,7 +70,7 @@
> 
>  unsigned long cpu_khz; /* Detected as we calibrate the TSC */
> 
> -extern rwlock_t xtime_lock;
> +extern frlock_t xtime_lock;
>  extern unsigned long wall_jiffies;
> 
>  spinlock_t rtc_lock = SPIN_LOCK_UNLOCKED;
> @@ -87,19 +87,21 @@
>   */
>  void do_gettimeofday(struct timeval *tv)
>  {
> -       unsigned long flags;
> +       unsigned long seq;
++++>     unsigned long xtimensec;
>         unsigned long usec, sec;
> 
> -       read_lock_irqsave(&xtime_lock, flags);
> -       usec = timer->get_offset();
> -       {
> -               unsigned long lost = jiffies - wall_jiffies;
> -               if (lost)
> -                       usec += lost * (1000000 / HZ);
> -       }
> -       sec = xtime.tv_sec;
> -       usec += (xtime.tv_nsec / 1000);
> -       read_unlock_irqrestore(&xtime_lock, flags);
> +       do {
> +               seq = fr_read_begin(&xtime_lock);
> +
> +               usec = timer->get_offset();
> +               {
> +                       unsigned long lost = jiffies - wall_jiffies;
> +                       if (lost)
> +                               usec += lost * (1000000 / HZ);
> +               }
> +               sec = xtime.tv_sec;
----> +               usec += (xtime.tv_nsec / 1000);
++++> +               xtimensec = xtime.tv_nsec;
> +       } while (unlikely(seq != fr_read_end(&xtime_lock)));
> 
++++>     usec += xtimensec / 1000;
>         while (usec >= 1000000) {
>                 usec -= 1000000;
> @@ -112,7 +114,7 @@
> 
>  void do_settimeofday(struct timeval *tv)
>  {
> -       write_lock_irq(&xtime_lock);
> +       fr_write_lock_irq(&xtime_lock);
>         /*
>          * This is revolting. We need to set "xtime" correctly. However, the
>          * value in this location is the value at the most recent update of
> @@ -133,7 +135,7 @@
>         time_status |= STA_UNSYNC;
>         time_maxerror = NTP_PHASE_LIMIT;
>         time_esterror = NTP_PHASE_LIMIT;
> -       write_unlock_irq(&xtime_lock);
> +       fr_write_unlock_irq(&xtime_lock);
>  }
> 
>  /*
> @@ -279,12 +281,12 @@
>          * the irq version of write_lock because as just said we have irq
>          * locally disabled. -arca
>          */
> -       write_lock(&xtime_lock);
> +       fr_write_lock(&xtime_lock);
> 
>         timer->mark_offset();
> 
>         do_timer_interrupt(irq, NULL, regs);
> 
> -       write_unlock(&xtime_lock);
> +       fr_write_unlock(&xtime_lock);
> 
>  }

-- 
George Anzinger   george@mvista.com
High-res-timers: 
http://sourceforge.net/projects/high-res-timers/
Preemption patch:
http://www.kernel.org/pub/linux/kernel/people/rml

      reply	other threads:[~2003-01-29  0:16 UTC|newest]

Thread overview: 2+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2003-01-28 23:42 [PATCH] (2/4) 2.5.59 fast reader/writer lock for gettimeofday Stephen Hemminger
2003-01-29  0:24 ` george anzinger [this message]

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=3E371F52.370D1F77@mvista.com \
    --to=george@mvista.com \
    --cc=ak@suse.de \
    --cc=akpm@digeo.com \
    --cc=andrea@suse.de \
    --cc=linux-kernel@vger.kernel.org \
    --cc=shemminger@osdl.org \
    --cc=torvalds@transmeta.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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox