public inbox for linux-i2c@vger.kernel.org
 help / color / mirror / Atom feed
From: David Brownell <david-b-yBeKhBN/0LDR7s880joybQ@public.gmane.org>
To: Trent Piepho <xyzzy-zY4eFNvK5D+xbKUeIHjxjQ@public.gmane.org>
Cc: i2c-GZX6beZjE8VD60Wz+7aTrA@public.gmane.org
Subject: Re: [PATCH] Add a new-style driver for most I2C EEPROMs
Date: Fri, 18 Apr 2008 09:48:15 -0700	[thread overview]
Message-ID: <200804180948.15298.david-b@pacbell.net> (raw)
In-Reply-To: <Pine.LNX.4.58.0804172346580.10592-nuiHJn5p267P3RPoUHIrnuTW4wlIGRCZ@public.gmane.org>

On Friday 18 April 2008, Trent Piepho wrote:
> On Thu, 17 Apr 2008, David Brownell wrote:
> > > are left-overs from earlier revisions and can be thrown out?
> >
> > Both of those tests should be moved into the for() test,
> > so the tail end of the loop always does an msleep.  It'd
> > be clearer as:
> >
> > 	timeout = ... ;
> > 	retries = 0;
> > 	while (retries++ < 3 || time_before(jiffies, timeout)) {
> > 		... try write, quit loop on success ...
> > 		msleep(1);
> > 	}
> >
> > Yes, that loop has lots of leftovers.  :(
> 
> Certainly did.
> 
> Note that your loop has a flaw that can cause it to timeout incorrectly.

Well, a "do ... while (...)" would obviously be better; and that's
not actually a "re"try.

But also remember that the specified "timeout" is already way beyond
what most chips need ... and that it's currently measured starting
at some point *well after* the relevant (previous) write returned.
So there's limited practical significance to problems with that loop.
It can/should be improved, sure; I'll wait to see what Wolfram does.


> So the loop tries the write for the first time, fails (which is perfectly
> acceptable), then sleeps for more than timeout jiffies.  The timeout
> expires and the write is never tried again.

That specific scenario can't happen.  It's forced to "re"try a few times,
even if the vagaries of scheduling make it sleep "too long".


> Generally, if you want to wait at least a certain amount time for a
> condition to become true, you must be sure to check the condition at
> least once AFTER the time limit.

Fair enough.  But if you're going to be concerned about that, you
should also be concerned about the start point for this "timeout".
It should begin closer to when the previous write's STOP got to the
chip.


> Though it's less likely, on a preemptable kernel, you could be preempted
> between setting timeout and the loop check, in which case the write might
> never even be attempted at all!

Again, you overlook the "re"try count, which ensures there
will be at least a few attempts.


> Here's two examples of a good way to do this, depending on how you want
> the control flow to go.
> 
> 	unsigned long timeout = ... ;
> 	for (;;) {
> 		unsigned long wtime = jiffies;

Given preemption and other scheduling delays, "wtime" can be
arbitrarily long before the bytes start to arrive at the chip.
This suffers the same flaw you mentioned above.

> 		if (write() == success)
> 			break;
> 		if (time_after_eq(wtime, timeout)) {
> 			... failure ...
> 			return -ESOMETHING;
> 		}
> 		msleep(1);
> 	}
> 	... success ...
> 
> 
> 	unsigned long timeout = ... ;
> 	for (wtime = timeout; time_after(wtime, timeout);) {
> 		wtime = jiffies;
> 		if (write() == success) {
> 			... success ...
> 			return 0;
> 		}
> 		msleep(1);
> 	}
> 	... failure ...

Neither of those loops ever tries more than once, note.

- Dave




_______________________________________________
i2c mailing list
i2c-GZX6beZjE8VD60Wz+7aTrA@public.gmane.org
http://lists.lm-sensors.org/mailman/listinfo/i2c

  parent reply	other threads:[~2008-04-18 16:48 UTC|newest]

Thread overview: 37+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2008-04-11 11:43 [PATCH] Add a new-style driver for most I2C EEPROMs Wolfram Sang
     [not found] ` <1207914198-8561-1-git-send-email-w.sang-bIcnvbaLZ9MEGnE8C9+IrQ@public.gmane.org>
2008-04-11 12:24   ` Wolfram Sang
2008-04-14  7:22     ` Robert Schwebel
     [not found]       ` <20080414072227.GU13814-bIcnvbaLZ9MEGnE8C9+IrQ@public.gmane.org>
2008-04-14 12:39         ` Jean Delvare
     [not found]           ` <20080414143925.31b55b39-ig7AzVSIIG7kN2dkZ6Wm7A@public.gmane.org>
2008-04-14 15:57             ` David Brownell
     [not found]               ` <200804140857.33732.david-b-yBeKhBN/0LDR7s880joybQ@public.gmane.org>
2008-04-17 21:17                 ` David Brownell
     [not found]                   ` <200804171417.23753.david-b-yBeKhBN/0LDR7s880joybQ@public.gmane.org>
2008-04-18  8:07                     ` Trent Piepho
     [not found]                       ` <Pine.LNX.4.58.0804172346580.10592-nuiHJn5p267P3RPoUHIrnuTW4wlIGRCZ@public.gmane.org>
2008-04-18 10:31                         ` Wolfram Sang
     [not found]                           ` <20080418103149.GA4245-bIcnvbaLZ9MEGnE8C9+IrQ@public.gmane.org>
2008-04-18 23:06                             ` Trent Piepho
     [not found]                               ` <Pine.LNX.4.58.0804181555560.15372-13q4cmjDBaTP3RPoUHIrnuTW4wlIGRCZ@public.gmane.org>
2008-04-21  9:17                                 ` Wolfram Sang
2008-04-21 17:20                                   ` Trent Piepho
     [not found]                                     ` <Pine.LNX.4.58.0804211005410.15697-nuiHJn5p267P3RPoUHIrnuTW4wlIGRCZ@public.gmane.org>
2008-04-24 10:47                                       ` Wolfram Sang
     [not found]                                         ` <20080424104740.GB4201-bIcnvbaLZ9MEGnE8C9+IrQ@public.gmane.org>
2008-04-27  1:28                                           ` Trent Piepho
2008-04-18 16:48                         ` David Brownell [this message]
     [not found]                           ` <200804180948.15298.david-b-yBeKhBN/0LDR7s880joybQ@public.gmane.org>
2008-04-18 23:26                             ` Trent Piepho
2008-04-18  8:59                     ` Wolfram Sang
2008-04-15 10:13             ` Wolfram Sang
2008-04-17 16:05   ` Wolfram Sang
2008-04-17 16:24     ` Jean Delvare
  -- strict thread matches above, loose matches on Subject: below --
2008-05-15 20:36 Wolfram Sang
     [not found] ` <1210883799-25188-1-git-send-email-w.sang-bIcnvbaLZ9MEGnE8C9+IrQ@public.gmane.org>
2008-05-22 20:20   ` Jean Delvare
     [not found]     ` <20080522222022.68d65cd7-ig7AzVSIIG7kN2dkZ6Wm7A@public.gmane.org>
2008-05-22 21:35       ` David Brownell
     [not found]         ` <200805221435.36829.david-b-yBeKhBN/0LDR7s880joybQ@public.gmane.org>
2008-05-23  7:17           ` Jean Delvare
     [not found]             ` <20080523091703.2ba86bb1-ig7AzVSIIG7kN2dkZ6Wm7A@public.gmane.org>
2008-05-24 21:11               ` David Brownell
2008-05-30  9:15       ` Wolfram Sang
     [not found]         ` <20080530091534.GB727-bIcnvbaLZ9MEGnE8C9+IrQ@public.gmane.org>
2008-05-30  9:51           ` Jean Delvare
     [not found]             ` <20080530115131.0e111fdb-ig7AzVSIIG7kN2dkZ6Wm7A@public.gmane.org>
2008-05-30 10:45               ` Wolfram Sang
2008-06-02 16:21       ` Wolfram Sang
     [not found]         ` <20080602162154.GA11141-bIcnvbaLZ9MEGnE8C9+IrQ@public.gmane.org>
2008-06-02 18:50           ` Jean Delvare
     [not found]             ` <20080602205034.3e2b392b-ig7AzVSIIG7kN2dkZ6Wm7A@public.gmane.org>
2008-06-02 19:33               ` David Brownell
     [not found]                 ` <200806021233.46781.david-b-yBeKhBN/0LDR7s880joybQ@public.gmane.org>
2008-06-02 19:48                   ` Jean Delvare
     [not found]                     ` <20080602214823.15ca190b-ig7AzVSIIG7kN2dkZ6Wm7A@public.gmane.org>
2008-06-03 20:36                       ` David Brownell
     [not found]                         ` <200806031336.35678.david-b-yBeKhBN/0LDR7s880joybQ@public.gmane.org>
2008-06-03 21:19                           ` Jean Delvare
     [not found]                             ` <20080603231927.61f9eb61-ig7AzVSIIG7kN2dkZ6Wm7A@public.gmane.org>
2008-06-04 11:51                               ` Wolfram Sang
2008-06-08  8:40                           ` Jean Delvare
     [not found]                             ` <20080608104038.006be072-ig7AzVSIIG7kN2dkZ6Wm7A@public.gmane.org>
2008-06-08 20:26                               ` David Brownell
2008-05-23  7:21   ` Jean Delvare

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=200804180948.15298.david-b@pacbell.net \
    --to=david-b-ybekhbn/0ldr7s880joybq@public.gmane.org \
    --cc=i2c-GZX6beZjE8VD60Wz+7aTrA@public.gmane.org \
    --cc=xyzzy-zY4eFNvK5D+xbKUeIHjxjQ@public.gmane.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