Re: [PATCH] [media] [pvrusb2]: remove dead retry cmd code

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Well this is an interesting one.

It makes an incorrect assumption about the behavior of "do { ... } 
while(0)", that being issuance of a "continue" within the loop would 
force execution to go back to the top of the loop.  But what it really 
does is force a jump to the bottom, where the false condition causes the 
loop to always exit.  Effectively "continue" is the same as "break" 
here.

The intent here is that "continue" would cause the code to restart, i.e. 
go to the top of the block.  It was attempting to co-opt the behavior of 
the outer do-while loop, incorrect.

The reason for the "do { ... } while(0)" idiom was to help avoid 
accidentally jumping out of that block without freeing the lock along 
the way.  I did things like that back in 2005 when this code originated.

This is a bug, not dead code.  Shockingly enough this has gone unnoticed 
since forever, and given that it has gone unnoticed then either the 
retry functionality is not needed or it has been failing to retry when 
it should.

I need to dig into the validity of this test.  I will deal with this.

  -Mike



On Sat, 24 Jan 2015, Mike Isely wrote:

> 
> Sorry been asleep at the wheel here.  I'll take a look.
> 
> Please realize that the code path being talked about here HAS worked - 
> because the encoder does tend to fail and this is how the driver 
> recovers.
> 
>   -Mike
> 
> 
> On Fri, 16 Jan 2015, Hans Verkuil wrote:
> 
> > On 01/16/2015 12:29 PM, Haim Daniel wrote:
> > > It looks that "if (try_count < 20) continue" jumps to end of the  do ...
> > > while(0) loop and goes out.
> > 
> > Ah, you are right. But that is obviously not what was intended, so just removing
> > it is not a proper 'fix'.
> > 
> > Mike, can you take a look at this?
> > 
> > Regards,
> > 
> > 	Hans
> > 
> > > 
> > > --hd.
> > > On Fri, 2015-01-16 at 11:57 +0100, Hans Verkuil wrote:
> > >> On 01/05/2015 11:38 PM, Haim Daniel wrote:
> > >>> In case a command is timed out, current flow sets the retry_flag
> > >>> and does nothing.
> > >>
> > >> Really? That's not how I read the code: it retries up to 20 times before
> > >> bailing out.
> > >>
> > >> Perhaps you missed the "if (try_count < 20) continue;" line?
> > >>
> > >> Regards,
> > >>
> > >> 	Hans
> > >>
> > >>>
> > >>> Signed-off-by: Haim Daniel <haim.daniel@xxxxxxxxx>
> > >>> ---
> > >>>  drivers/media/usb/pvrusb2/pvrusb2-encoder.c | 15 +--------------
> > >>>  1 file changed, 1 insertion(+), 14 deletions(-)
> > >>>
> > >>> diff --git a/drivers/media/usb/pvrusb2/pvrusb2-encoder.c b/drivers/media/usb/pvrusb2/pvrusb2-encoder.c
> > >>> index f7702ae..02028aa 100644
> > >>> --- a/drivers/media/usb/pvrusb2/pvrusb2-encoder.c
> > >>> +++ b/drivers/media/usb/pvrusb2/pvrusb2-encoder.c
> > >>> @@ -145,8 +145,6 @@ static int pvr2_encoder_cmd(void *ctxt,
> > >>>  			    u32 *argp)
> > >>>  {
> > >>>  	unsigned int poll_count;
> > >>> -	unsigned int try_count = 0;
> > >>> -	int retry_flag;
> > >>>  	int ret = 0;
> > >>>  	unsigned int idx;
> > >>>  	/* These sizes look to be limited by the FX2 firmware implementation */
> > >>> @@ -213,8 +211,6 @@ static int pvr2_encoder_cmd(void *ctxt,
> > >>>  			break;
> > >>>  		}
> > >>>  
> > >>> -		retry_flag = 0;
> > >>> -		try_count++;
> > >>>  		ret = 0;
> > >>>  		wrData[0] = 0;
> > >>>  		wrData[1] = cmd;
> > >>> @@ -245,11 +241,9 @@ static int pvr2_encoder_cmd(void *ctxt,
> > >>>  			}
> > >>>  			if (rdData[0] && (poll_count < 1000)) continue;
> > >>>  			if (!rdData[0]) {
> > >>> -				retry_flag = !0;
> > >>>  				pvr2_trace(
> > >>>  					PVR2_TRACE_ERROR_LEGS,
> > >>> -					"Encoder timed out waiting for us"
> > >>> -					"; arranging to retry");
> > >>> +					"Encoder timed out waiting for us");
> > >>>  			} else {
> > >>>  				pvr2_trace(
> > >>>  					PVR2_TRACE_ERROR_LEGS,
> > >>> @@ -269,13 +263,6 @@ static int pvr2_encoder_cmd(void *ctxt,
> > >>>  			ret = -EBUSY;
> > >>>  			break;
> > >>>  		}
> > >>> -		if (retry_flag) {
> > >>> -			if (try_count < 20) continue;
> > >>> -			pvr2_trace(
> > >>> -				PVR2_TRACE_ERROR_LEGS,
> > >>> -				"Too many retries...");
> > >>> -			ret = -EBUSY;
> > >>> -		}
> > >>>  		if (ret) {
> > >>>  			del_timer_sync(&hdw->encoder_run_timer);
> > >>>  			hdw->state_encoder_ok = 0;
> > >>>
> > >>
> > > 
> > > 
> > 
> > --
> > To unsubscribe from this list: send the line "unsubscribe linux-media" in
> > the body of a message to majordomo@xxxxxxxxxxxxxxx
> > More majordomo info at  http://vger.kernel.org/majordomo-info.html
> > 
> 
> 

-- 

Mike Isely
isely @ isely (dot) net
PGP: 03 54 43 4D 75 E5 CC 92 71 16 01 E2 B5 F5 C1 E8
--
To unsubscribe from this list: send the line "unsubscribe linux-media" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html




[Index of Archives]     [Linux Input]     [Video for Linux]     [Gstreamer Embedded]     [Mplayer Users]     [Linux USB Devel]     [Linux Audio Users]     [Linux Kernel]     [Linux SCSI]     [Yosemite Backpacking]
  Powered by Linux