lkml.org 
[lkml]   [2005]   [Mar]   [22]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
Patch in this message
/
Date
From
Subject[PATCH 2.6.12-rc1-mm1 2/3] perfctr: ppc32 fix and cleanups
ppc32 fix and cleanups:
- If check_ireset() fails, clear state->cstatus to undo any
settings check_control() may have left there.
- Eliminate power-of-two sizeof assumption in access_regs().
- Merge check_ireset() and setup_imode_start_values().

Signed-off-by: Mikael Pettersson <mikpe@csd.uu.se>

drivers/perfctr/ppc.c | 27 ++++++++-------------------
1 files changed, 8 insertions(+), 19 deletions(-)

diff -rupN linux-2.6.12-rc1-mm1/drivers/perfctr/ppc.c linux-2.6.12-rc1-mm1.perfctr-update-ppc/drivers/perfctr/ppc.c
--- linux-2.6.12-rc1-mm1/drivers/perfctr/ppc.c 2005-03-22 21:59:08.000000000 +0100
+++ linux-2.6.12-rc1-mm1.perfctr-update-ppc/drivers/perfctr/ppc.c 2005-03-23 02:16:26.000000000 +0100
@@ -573,7 +573,7 @@ unsigned int perfctr_cpu_identify_overfl
return pmc_mask;
}

-static inline int check_ireset(const struct perfctr_cpu_state *state)
+static inline int check_ireset(struct perfctr_cpu_state *state)
{
unsigned int nrctrs, i;

@@ -583,27 +583,15 @@ static inline int check_ireset(const str
unsigned int pmc = state->pmc[i].map;
if ((int)state->control.ireset[pmc] < 0) /* PPC-specific */
return -EINVAL;
- }
- return 0;
-}
-
-static inline void setup_imode_start_values(struct perfctr_cpu_state *state)
-{
- unsigned int cstatus, nrctrs, i;
-
- cstatus = state->cstatus;
- nrctrs = perfctr_cstatus_nrctrs(cstatus);
- for(i = perfctr_cstatus_nractrs(cstatus); i < nrctrs; ++i) {
- unsigned int pmc = state->pmc[i].map;
state->pmc[i].start = state->control.ireset[pmc];
}
+ return 0;
}

#else /* CONFIG_PERFCTR_INTERRUPT_SUPPORT */
static inline void perfctr_cpu_isuspend(struct perfctr_cpu_state *state) { }
static inline void perfctr_cpu_iresume(const struct perfctr_cpu_state *state) { }
-static inline int check_ireset(const struct perfctr_cpu_state *state) { return 0; }
-static inline void setup_imode_start_values(struct perfctr_cpu_state *state) { }
+static inline int check_ireset(struct perfctr_cpu_state *state) { return 0; }
#endif /* CONFIG_PERFCTR_INTERRUPT_SUPPORT */

static int check_control(struct perfctr_cpu_state *state)
@@ -627,12 +615,13 @@ int perfctr_cpu_update_control(struct pe
if (err < 0)
return err;
err = check_ireset(state);
- if (err < 0)
+ if (err < 0) {
+ state->cstatus = 0;
return err;
+ }
state->cstatus |= perfctr_mk_cstatus(state->control.header.tsc_on,
state->control.header.nractrs,
state->control.header.nrictrs);
- setup_imode_start_values(state);
return 0;
}

@@ -672,10 +661,10 @@ static int access_regs(struct perfctr_cp
unsigned int i, nr_regs, *where;
int offset;

- if (argbytes & (sizeof(struct perfctr_cpu_reg) - 1))
+ nr_regs = argbytes / sizeof(struct perfctr_cpu_reg);
+ if (nr_regs * sizeof(struct perfctr_cpu_reg) != argbytes)
return -EINVAL;
regs = (struct perfctr_cpu_reg*)argp;
- nr_regs = argbytes / sizeof(struct perfctr_cpu_reg);

for(i = 0; i < nr_regs; ++i) {
offset = get_reg_offset(regs[i].nr);
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/
\
 
 \ /
  Last update: 2005-04-06 13:30    [W:1.179 / U:0.016 seconds]
©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site