Hi all, On MIPS, with maxsec=4, clocks_calc_mult_shift() may generate a very big mult, which may easily cause timekeeper.mult overflow within timekeeping jobs. e.g. when clock freq was 250000500(i.e. mips_hpt_frequency=250000500, and the CPU Freq will be 250000500*2=500001000), mult will be 0xffffde72 Attachment is a script that calculates mult values for CPU Freq between 400050000 and 500050000, with 1KHz step. It outputs mult values greater than 0xf0000000: CPU Freq:500001000, mult:0xffffde72, shift:30 CPU Freq:500002000, mult:0xffffbce4, shift:30 CPU Freq:500003000, mult:0xffff9b56, shift:30 CPU Freq:500004000, mult:0xffff79c9, shift:30 ... The peak value appears around CPU_freq=500001000. To avoid this, it may need: 1. Supply a bigger maxsec value? 2. In clocks_calc_mult_shift(), pick next mult/shift pair if mult is too big? Then maxsec will not be strictly obeyed. 3. Change timekeeper.mult to u64? 4. ... Any idea? -- Regards, - Chen Jie
#!/bin/env python def clocks_calc_mult_shift(from_, to_, maxsec): sftacc = 32; tmp = maxsec * from_ >> 32; while tmp: tmp >>= 1 sftacc -= 1 for sft in xrange(32, 0, -1): tmp = to_ << sft; tmp += (from_ / 2) tmp /= from_ if ((tmp >> sftacc) == 0): break mult = tmp shift = sft return mult, shift for i in xrange(400050000, 500050000, 1000): mult, shift = clocks_calc_mult_shift(i/2, 1000000000, 4) if mult > 0xf0000000: print "CPU Freq:%d, mult:0x%x, shift:%d" % (i, mult, shift)