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 <[email protected]>
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 [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/
[Index of Archives]
[Kernel Newbies]
[Netfilter]
[Bugtraq]
[Photo]
[Stuff]
[Gimp]
[Yosemite News]
[MIPS Linux]
[ARM Linux]
[Linux Security]
[Linux RAID]
[Video 4 Linux]
[Linux for the blind]
[Linux Resources]