kern/118093: [firewire] firewire bus reset hogs CPU, causing data to be lost

Dieter freebsd at sopwith.solgatos.com
Mon Jan 5 21:20:03 PST 2009


The following reply was made to PR kern/118093; it has been noted by GNATS.

From: Dieter <freebsd at sopwith.solgatos.com>
To: bug-followup at FreeBSD.org, freebsd-firewire at FreeBSD.org
Cc:  
Subject: Re: kern/118093: [firewire] firewire bus reset hogs CPU, causing data to be lost 
Date: Mon, 05 Jan 2009 17:52:29 +0000

 In message <1231181797.21260.8.camel at localhost.localdomain>, Sean Bruno writes:
 
 > @@ -1388,6 +1387,7 @@
 >  	struct fw_device *fwdev;
 >  
 >  	s = splfw();
 > +	FW_GLOCK(fc);
 >  	fc->status = FWBUSEXPLORE;
 >  
 >  	/* Invalidate all devices, just after bus reset. */
 > @@ -1396,6 +1396,7 @@
 >  			fwdev->status = FWDEVINVAL;
 >  			fwdev->rcnt = 0;
 >  		}
 > +	FW_GUNLOCK(fc);
 >  	splx(s);
 >  
 >  	wakeup((void *)fc);
 
 If the (null these days) spl calls have been replaced with FW_GLOCK/FW_GUNLOCK
 calls, can the spl calls be removed now?
 
 > @@ -1922,6 +1924,8 @@
 >  	u_int i;
 >  	struct firewire_comm *fc = (struct firewire_comm *)sc;
 >  
 > +	FW_GLOCK(fc);
 > +	FW_GUNLOCK(fc);
 >  	if (stat & OHCI_INT_DMA_IR) {
 >  		irstat = atomic_readandclear_int(&sc->irstat);
 >  		for(i = 0; i < fc->nisodma ; i++){
 
 This needs to be reviewed by someone who understands what is protected by
 getting a lock and then immediately releasing it.  I have no clue.
 
 > @@ -1969,8 +1973,8 @@
 >  			OWRITE(sc, OHCI_LNKCTLCLR, OHCI_CNTL_CYCTIMER);
 >  #endif
 >  			OWRITE(sc, FWOHCI_INTMASKCLR,  OHCI_INT_CYC_LOST);
 > -			device_printf(fc->dev, "too many cycle lost, "
 > -			 "no cycle master presents?\n");
 > +			device_printf(fc->dev, "%s: too many cycle lost, "
 > +			 "no cycle master presents?\n", __func__);
 >  		}
 
 Should this be "too many cycles lost, " and  "no cycle master present?\n"
 
 >  	uint32_t fun;
 >  
 > +	FW_GLOCK(fc);
 >  	device_printf(fc->dev, "Initiate bus reset\n");
 >  	sc = (struct fwohci_softc *)fc;
 >  
 > @@ -2487,6 +2495,7 @@
 >  	fun |= FW_PHY_ISBR | FW_PHY_RHB;
 >  	fun = fwphy_wrdata(sc, FW_PHY_ISBR_REG, fun);
 >  #endif
 > +	FW_GUNLOCK(fc);
 >  }
 
 Does the lock need to protect the printf?


More information about the freebsd-bugs mailing list