[PATCH 3/3] perf/imx_ddr: don't enable counter0 if none of 4 counters are used

Xu Yang xu.yang_2 at nxp.com
Wed Jul 5 21:08:36 PDT 2023


Hi Frank,

> -----Original Message-----
> From: Frank Li <frank.li at nxp.com>
> Sent: Wednesday, July 5, 2023 10:51 PM
> To: Xu Yang <xu.yang_2 at nxp.com>
> Cc: will at kernel.org; mark.rutland at arm.com; shawnguo at kernel.org; s.hauer at pengutronix.de; kernel at pengutronix.de;
> dl-linux-imx <linux-imx at nxp.com>; linux-arm-kernel at lists.infradead.org
> Subject: RE: [PATCH 3/3] perf/imx_ddr: don't enable counter0 if none of 4 counters are used
> 
> >
> > diff --git a/drivers/perf/fsl_imx8_ddr_perf.c
> > b/drivers/perf/fsl_imx8_ddr_perf.c
> > index 4e6cbfc48429..f7c832611713 100644
> > --- a/drivers/perf/fsl_imx8_ddr_perf.c
> > +++ b/drivers/perf/fsl_imx8_ddr_perf.c
> > @@ -591,7 +591,9 @@ static void ddr_perf_pmu_enable(struct pmu *pmu)
> >  	struct ddr_pmu *ddr_pmu = to_ddr_pmu(pmu);
> >
> >  	/* enable cycle counter if cycle is not active event list */
> > -	if (ddr_pmu->events[EVENT_CYCLES_COUNTER] == NULL)
> > +	if (ddr_pmu->events[EVENT_CYCLES_COUNTER] == NULL &&
> 
> EVENT_CYCLES_COUNTER is 0,  if only enable cycles counter,  below logic
> Will failure.   Then counter will not work.

Yes, cycle counter will not be enabled for counting at this point.
However, cycle counter will be enabled after perf_pmu_enable() is
called. My understanding is that ddr_perf_pmu_enable() is used to
enable cycle counter when other counters is used for counting since
other counters depends on cycle counter.

> 
> > +	   (ddr_pmu->events[0] || ddr_pmu->events[1] ||
> > +	    ddr_pmu->events[2] || ddr_pmu->events[3]))
> 
>  I suggest maintain a enabled_event counter,
> 
> 	If(ddr_pmu->active_num==0)
> 		ddr_perf_counter_enable(..., true);
> 	ddr_pmu->active_num++;
> 
> At disable function()
> {
>        ddr_pmu->active_num --;
>        if( ddr_pmu->active_num == 0)
> 	ddr_perf_counter_enable(.., false);
> }

Will try to maintain a enabled_event counter.

Thanks,
Xu Yang

> 
> 
> >  		ddr_perf_counter_enable(ddr_pmu,
> >  				      EVENT_CYCLES_ID,
> >  				      EVENT_CYCLES_COUNTER,
> > @@ -602,7 +604,9 @@ static void ddr_perf_pmu_disable(struct pmu *pmu)
> >  {
> >  	struct ddr_pmu *ddr_pmu = to_ddr_pmu(pmu);
> >
> > -	if (ddr_pmu->events[EVENT_CYCLES_COUNTER] == NULL)
> > +	if (ddr_pmu->events[EVENT_CYCLES_COUNTER] == NULL &&
> > +	   (ddr_pmu->events[0] || ddr_pmu->events[1] ||
> > +	    ddr_pmu->events[2] || ddr_pmu->events[3]))
> >  		ddr_perf_counter_enable(ddr_pmu,
> >  				      EVENT_CYCLES_ID,
> >  				      EVENT_CYCLES_COUNTER,
> > --
> > 2.34.1




More information about the linux-arm-kernel mailing list