All of lore.kernel.org
 help / color / mirror / Atom feed
From: "Ville Syrjälä" <ville.syrjala-VuQAYsv1563Yd54FQh9/CA@public.gmane.org>
To: Jean Delvare <khali-PUYAD+kWke1g9hUCZPvPmw@public.gmane.org>
Cc: "Ville Syrjälä" <syrjala-ORSVBvAovxo@public.gmane.org>,
	ben-linux-elnMNo+KYs3YtjvyW6yDsg@public.gmane.org,
	linux-i2c-u79uwXL29TY76Z2rM5mHXA@public.gmane.org,
	dri-devel-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW@public.gmane.org,
	linux-kernel-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
Subject: Re: [PATCH] i2c-algo-bit: Fix spurious SCL timeouts under heavy load
Date: Thu, 15 Mar 2012 18:39:27 +0200	[thread overview]
Message-ID: <20120315163927.GK4917@intel.com> (raw)
In-Reply-To: <20120315153240.75efc254-R0o5gVi9kd7kN2dkZ6Wm7A@public.gmane.org>

On Thu, Mar 15, 2012 at 03:32:40PM +0100, Jean Delvare wrote:
> Hi Ville,
> 
> On Wed, 14 Mar 2012 10:32:52 +0200, Ville Syrjälä wrote:
> > When the system is under heavy load, there can be a significant delay
> > between the getscl() and time_after() calls inside sclhi(). That delay
> > may cause the time_after() check to trigger after SCL has gone high,
> > causing sclhi() to return -ETIMEDOUT.
> > 
> > To fix the problem, double check that SCL is still low after the
> > timeout has been reached, before deciding to return -ETIMEDOUT.
> > 
> > Signed-off-by: Ville Syrjälä <syrjala-ORSVBvAovxo@public.gmane.org>
> > ---
> > I can easily reproduce these spurious timeouts on my HP-compaq nc6000
> > laptop with the radeon kms driver. It's enough to have a -j2 kernel
> > build running, and simultaneosly issue xrandr commands in a
> > terminal. Calling xrandr will cause the driver to re-read the EDID
> > from the display. A significant number of the EDID reads will fail.
> > With this fix I have yet to see any failed EDID reads.
> 
> Thanks for describing a test case, I was able to reproduce the problem
> easily by following your instructions. The problem is real, even with
> the pending fixes I have to radeon's I2C implementation.
> 
> I only have one concern about your implementation:
> 
> > 
> >  drivers/i2c/algos/i2c-algo-bit.c |    4 +++-
> >  1 files changed, 3 insertions(+), 1 deletions(-)
> > 
> > diff --git a/drivers/i2c/algos/i2c-algo-bit.c b/drivers/i2c/algos/i2c-algo-bit.c
> > index 525c734..d25112e 100644
> > --- a/drivers/i2c/algos/i2c-algo-bit.c
> > +++ b/drivers/i2c/algos/i2c-algo-bit.c
> > @@ -104,9 +104,11 @@ static int sclhi(struct i2c_algo_bit_data *adap)
> >  		 * are processing data internally.
> >  		 */
> >  		if (time_after(jiffies, start + adap->timeout))
> > -			return -ETIMEDOUT;
> > +			break;
> >  		cond_resched();
> >  	}
> > +	if (!getscl(adap))
> > +		return -ETIMEDOUT;
> 
> This means double-check even in the most common case where time_after()
> didn't cause the loop break. From a performance perspective, this seems
> undesirable. What would you think of the alternative fix below?

Yeah that fact also occured to today. IIRC I did post an another version
of the patch to some bugzilla quite a while ago that didn't suffer from
this issue. Ah here [1] it is. By that time I no longer had access to the
machine (a Thinkpad T400) where I initially saw the problem, so I didn't
pursue it further.

[1] https://bugs.freedesktop.org/show_bug.cgi?id=29787

> --- linux-3.3-rc7.orig/drivers/i2c/algos/i2c-algo-bit.c	2012-03-15 09:33:10.232176790 +0100
> +++ linux-3.3-rc7/drivers/i2c/algos/i2c-algo-bit.c	2012-03-15 14:52:48.127778459 +0100
> @@ -103,8 +103,14 @@ static int sclhi(struct i2c_algo_bit_dat
>  		 * chips may hold it low ("clock stretching") while they
>  		 * are processing data internally.
>  		 */
> -		if (time_after(jiffies, start + adap->timeout))
> +		if (time_after(jiffies, start + adap->timeout)) {
> +			/* Test one last time, as we may have been preempted
> +			 * between last check and timeout test.
> +			 */
> +			if (getscl(adap))
> +				break;
>  			return -ETIMEDOUT;
> +		}
>  		cond_resched();
>  	}
>  #ifdef DEBUG
>
> Functionally it should be equivalent to your proposal, but faster. I'll
> apply that (and send for stable inclusion.)

Looks good. Thanks for taking care of it.

-- 
Ville Syrjälä
Intel OTC

WARNING: multiple messages have this Message-ID (diff)
From: "Ville Syrjälä" <ville.syrjala@linux.intel.com>
To: Jean Delvare <khali@linux-fr.org>
Cc: "Ville Syrjälä" <syrjala@sci.fi>,
	ben-linux@fluff.org, linux-i2c@vger.kernel.org,
	dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org
Subject: Re: [PATCH] i2c-algo-bit: Fix spurious SCL timeouts under heavy load
Date: Thu, 15 Mar 2012 18:39:27 +0200	[thread overview]
Message-ID: <20120315163927.GK4917@intel.com> (raw)
In-Reply-To: <20120315153240.75efc254@endymion.delvare>

On Thu, Mar 15, 2012 at 03:32:40PM +0100, Jean Delvare wrote:
> Hi Ville,
> 
> On Wed, 14 Mar 2012 10:32:52 +0200, Ville Syrjälä wrote:
> > When the system is under heavy load, there can be a significant delay
> > between the getscl() and time_after() calls inside sclhi(). That delay
> > may cause the time_after() check to trigger after SCL has gone high,
> > causing sclhi() to return -ETIMEDOUT.
> > 
> > To fix the problem, double check that SCL is still low after the
> > timeout has been reached, before deciding to return -ETIMEDOUT.
> > 
> > Signed-off-by: Ville Syrjälä <syrjala@sci.fi>
> > ---
> > I can easily reproduce these spurious timeouts on my HP-compaq nc6000
> > laptop with the radeon kms driver. It's enough to have a -j2 kernel
> > build running, and simultaneosly issue xrandr commands in a
> > terminal. Calling xrandr will cause the driver to re-read the EDID
> > from the display. A significant number of the EDID reads will fail.
> > With this fix I have yet to see any failed EDID reads.
> 
> Thanks for describing a test case, I was able to reproduce the problem
> easily by following your instructions. The problem is real, even with
> the pending fixes I have to radeon's I2C implementation.
> 
> I only have one concern about your implementation:
> 
> > 
> >  drivers/i2c/algos/i2c-algo-bit.c |    4 +++-
> >  1 files changed, 3 insertions(+), 1 deletions(-)
> > 
> > diff --git a/drivers/i2c/algos/i2c-algo-bit.c b/drivers/i2c/algos/i2c-algo-bit.c
> > index 525c734..d25112e 100644
> > --- a/drivers/i2c/algos/i2c-algo-bit.c
> > +++ b/drivers/i2c/algos/i2c-algo-bit.c
> > @@ -104,9 +104,11 @@ static int sclhi(struct i2c_algo_bit_data *adap)
> >  		 * are processing data internally.
> >  		 */
> >  		if (time_after(jiffies, start + adap->timeout))
> > -			return -ETIMEDOUT;
> > +			break;
> >  		cond_resched();
> >  	}
> > +	if (!getscl(adap))
> > +		return -ETIMEDOUT;
> 
> This means double-check even in the most common case where time_after()
> didn't cause the loop break. From a performance perspective, this seems
> undesirable. What would you think of the alternative fix below?

Yeah that fact also occured to today. IIRC I did post an another version
of the patch to some bugzilla quite a while ago that didn't suffer from
this issue. Ah here [1] it is. By that time I no longer had access to the
machine (a Thinkpad T400) where I initially saw the problem, so I didn't
pursue it further.

[1] https://bugs.freedesktop.org/show_bug.cgi?id=29787

> --- linux-3.3-rc7.orig/drivers/i2c/algos/i2c-algo-bit.c	2012-03-15 09:33:10.232176790 +0100
> +++ linux-3.3-rc7/drivers/i2c/algos/i2c-algo-bit.c	2012-03-15 14:52:48.127778459 +0100
> @@ -103,8 +103,14 @@ static int sclhi(struct i2c_algo_bit_dat
>  		 * chips may hold it low ("clock stretching") while they
>  		 * are processing data internally.
>  		 */
> -		if (time_after(jiffies, start + adap->timeout))
> +		if (time_after(jiffies, start + adap->timeout)) {
> +			/* Test one last time, as we may have been preempted
> +			 * between last check and timeout test.
> +			 */
> +			if (getscl(adap))
> +				break;
>  			return -ETIMEDOUT;
> +		}
>  		cond_resched();
>  	}
>  #ifdef DEBUG
>
> Functionally it should be equivalent to your proposal, but faster. I'll
> apply that (and send for stable inclusion.)

Looks good. Thanks for taking care of it.

-- 
Ville Syrjälä
Intel OTC

  parent reply	other threads:[~2012-03-15 16:39 UTC|newest]

Thread overview: 8+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2012-03-14  8:32 [PATCH] i2c-algo-bit: Fix spurious SCL timeouts under heavy load Ville Syrjälä
2012-03-14  8:32 ` Ville Syrjälä
     [not found] ` <1331713973-7711-1-git-send-email-syrjala-ORSVBvAovxo@public.gmane.org>
2012-03-14  8:32   ` [DEBUG PATCH] Print a message when a spurious i2c SCL timeout occurs Ville Syrjälä
2012-03-14  8:32     ` Ville Syrjälä
2012-03-15 14:32   ` [PATCH] i2c-algo-bit: Fix spurious SCL timeouts under heavy load Jean Delvare
2012-03-15 14:32     ` Jean Delvare
     [not found]     ` <20120315153240.75efc254-R0o5gVi9kd7kN2dkZ6Wm7A@public.gmane.org>
2012-03-15 16:39       ` Ville Syrjälä [this message]
2012-03-15 16:39         ` Ville Syrjälä

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=20120315163927.GK4917@intel.com \
    --to=ville.syrjala-vuqaysv1563yd54fqh9/ca@public.gmane.org \
    --cc=ben-linux-elnMNo+KYs3YtjvyW6yDsg@public.gmane.org \
    --cc=dri-devel-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW@public.gmane.org \
    --cc=khali-PUYAD+kWke1g9hUCZPvPmw@public.gmane.org \
    --cc=linux-i2c-u79uwXL29TY76Z2rM5mHXA@public.gmane.org \
    --cc=linux-kernel-u79uwXL29TY76Z2rM5mHXA@public.gmane.org \
    --cc=syrjala-ORSVBvAovxo@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 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.