Revision 6d5b5acca9e566515ef3f1ed617e7295c4f94345 authored by Heiko Carstens on 09 March 2009, 12:31:59 UTC, committed by Linus Torvalds on 09 March 2009, 15:13:35 UTC
Frans Pop reported the crash below when running an s390 kernel under Hercules:

  Kernel BUG at 000738b4  verbose debug info unavailable!
  fixpoint divide exception: 0009  #1! SMP
  Modules linked in: nfs lockd nfs_acl sunrpc ctcm fsm tape_34xx
     cu3088 tape ccwgroup tape_class ext3 jbd mbcache dm_mirror dm_log dm_snapshot
     dm_mod dasd_eckd_mod dasd_mod
  CPU: 0 Not tainted 2.6.27.19 #13
  Process awk (pid: 2069, task: 0f9ed9b8, ksp: 0f4f7d18)
  Krnl PSW : 070c1000 800738b4 (acct_update_integrals+0x4c/0x118)
             R:0 T:1 IO:1 EX:1 Key:0 M:1 W:0 P:0 AS:0 CC:1 PM:0
  Krnl GPRS: 00000000 000007d0 7fffffff fffff830
             00000000 ffffffff 00000002 0f9ed9b8
             00000000 00008ca0 00000000 0f9ed9b8
             0f9edda4 8007386e 0f4f7ec8 0f4f7e98
  Krnl Code: 800738aa: a71807d0         lhi     %r1,2000
             800738ae: 8c200001         srdl    %r2,1
             800738b2: 1d21             dr      %r2,%r1
            >800738b4: 5810d10e         l       %r1,270(%r13)
             800738b8: 1823             lr      %r2,%r3
             800738ba: 4130f060         la      %r3,96(%r15)
             800738be: 0de1             basr    %r14,%r1
             800738c0: 5800f060         l       %r0,96(%r15)
  Call Trace:
  ( <000000000004fdea>! blocking_notifier_call_chain+0x1e/0x2c)
    <0000000000038502>! do_exit+0x106/0x7c0
    <0000000000038c36>! do_group_exit+0x7a/0xb4
    <0000000000038c8e>! SyS_exit_group+0x1e/0x30
    <0000000000021c28>! sysc_do_restart+0x12/0x16
    <0000000077e7e924>! 0x77e7e924

Reason for this is that cpu time accounting usually only happens from
interrupt context, but acct_update_integrals gets also called from
process context with interrupts enabled.

So in acct_update_integrals we may end up with the following scenario:

Between reading tsk->stime/tsk->utime and tsk->acct_timexpd an interrupt
happens which updates accouting values.  This causes acct_timexpd to be
greater than the former stime + utime.  The subsequent calculation of

	dtime = cputime_sub(time, tsk->acct_timexpd);

will be negative and the division performed by

	cputime_to_jiffies(dtime)

will generate an exception since the result won't fit into a 32 bit
register.

In order to fix this just always disable interrupts while accessing any
of the accounting values.

Reported by: Frans Pop <elendil@planet.nl>
Tested by: Frans Pop <elendil@planet.nl>
Cc: stable@kernel.org
Cc: Martin Schwidefsky <schwidefsky@de.ibm.com>
Signed-off-by: Heiko Carstens <heiko.carstens@de.ibm.com>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
1 parent 7a203f3
History
File Mode Size
lzo
reed_solomon
zlib_deflate
zlib_inflate
.gitignore -rw-r--r-- 51 bytes
Kconfig -rw-r--r-- 3.6 KB
Kconfig.debug -rw-r--r-- 30.7 KB
Kconfig.kgdb -rw-r--r-- 1.8 KB
Makefile -rw-r--r-- 2.9 KB
argv_split.c -rw-r--r-- 1.8 KB
audit.c -rw-r--r-- 1.2 KB
bcd.c -rw-r--r-- 257 bytes
bitmap.c -rw-r--r-- 30.5 KB
bitrev.c -rw-r--r-- 2.1 KB
bug.c -rw-r--r-- 4.6 KB
bust_spinlocks.c -rw-r--r-- 636 bytes
check_signature.c -rw-r--r-- 599 bytes
cmdline.c -rw-r--r-- 3.6 KB
cpumask.c -rw-r--r-- 4.3 KB
crc-ccitt.c -rw-r--r-- 3.0 KB
crc-itu-t.c -rw-r--r-- 2.8 KB
crc-t10dif.c -rw-r--r-- 2.9 KB
crc16.c -rw-r--r-- 2.8 KB
crc32.c -rw-r--r-- 14.9 KB
crc32defs.h -rw-r--r-- 1.0 KB
crc7.c -rw-r--r-- 2.3 KB
ctype.c -rw-r--r-- 1.3 KB
debug_locks.c -rw-r--r-- 1.1 KB
debugobjects.c -rw-r--r-- 21.3 KB
dec_and_lock.c -rw-r--r-- 806 bytes
devres.c -rw-r--r-- 7.7 KB
div64.c -rw-r--r-- 2.3 KB
dump_stack.c -rw-r--r-- 290 bytes
dynamic_printk.c -rw-r--r-- 9.5 KB
extable.c -rw-r--r-- 1.9 KB
fault-inject.c -rw-r--r-- 7.9 KB
find_last_bit.c -rw-r--r-- 1.1 KB
find_next_bit.c -rw-r--r-- 6.4 KB
gen_crc32table.c -rw-r--r-- 1.8 KB
genalloc.c -rw-r--r-- 5.3 KB
halfmd4.c -rw-r--r-- 2.0 KB
hexdump.c -rw-r--r-- 6.1 KB
hweight.c -rw-r--r-- 1.6 KB
idr.c -rw-r--r-- 20.5 KB
inflate.c -rw-r--r-- 38.6 KB
int_sqrt.c -rw-r--r-- 533 bytes
iomap.c -rw-r--r-- 7.4 KB
iomap_copy.c -rw-r--r-- 2.1 KB
iommu-helper.c -rw-r--r-- 2.0 KB
ioremap.c -rw-r--r-- 2.1 KB
irq_regs.c -rw-r--r-- 578 bytes
is_single_threaded.c -rw-r--r-- 1.2 KB
kasprintf.c -rw-r--r-- 680 bytes
kernel_lock.c -rw-r--r-- 2.9 KB
klist.c -rw-r--r-- 9.3 KB
kobject.c -rw-r--r-- 20.7 KB
kobject_uevent.c -rw-r--r-- 8.0 KB
kref.c -rw-r--r-- 1.9 KB
libcrc32c.c -rw-r--r-- 2.1 KB
list_debug.c -rw-r--r-- 1.5 KB
lmb.c -rw-r--r-- 11.6 KB
locking-selftest-hardirq.h -rw-r--r-- 207 bytes
locking-selftest-mutex.h -rw-r--r-- 120 bytes
locking-selftest-rlock-hardirq.h -rw-r--r-- 74 bytes
locking-selftest-rlock-softirq.h -rw-r--r-- 74 bytes
locking-selftest-rlock.h -rw-r--r-- 158 bytes
locking-selftest-rsem.h -rw-r--r-- 163 bytes
locking-selftest-softirq.h -rw-r--r-- 207 bytes
locking-selftest-spin-hardirq.h -rw-r--r-- 73 bytes
locking-selftest-spin-softirq.h -rw-r--r-- 73 bytes
locking-selftest-spin.h -rw-r--r-- 118 bytes
locking-selftest-wlock-hardirq.h -rw-r--r-- 74 bytes
locking-selftest-wlock-softirq.h -rw-r--r-- 74 bytes
locking-selftest-wlock.h -rw-r--r-- 158 bytes
locking-selftest-wsem.h -rw-r--r-- 163 bytes
locking-selftest.c -rw-r--r-- 28.6 KB
parser.c -rw-r--r-- 6.0 KB
percpu_counter.c -rw-r--r-- 3.2 KB
plist.c -rw-r--r-- 2.8 KB
prio_heap.c -rw-r--r-- 1.4 KB
prio_tree.c -rw-r--r-- 12.2 KB
proportions.c -rw-r--r-- 9.3 KB
radix-tree.c -rw-r--r-- 31.0 KB
random32.c -rw-r--r-- 3.8 KB
ratelimit.c -rw-r--r-- 1.3 KB
rbtree.c -rw-r--r-- 8.7 KB
reciprocal_div.c -rw-r--r-- 159 bytes
rwsem-spinlock.c -rw-r--r-- 6.8 KB
rwsem.c -rw-r--r-- 6.4 KB
scatterlist.c -rw-r--r-- 11.8 KB
sha1.c -rw-r--r-- 2.4 KB
show_mem.c -rw-r--r-- 1.4 KB
smp_processor_id.c -rw-r--r-- 1.1 KB
sort.c -rw-r--r-- 2.5 KB
spinlock_debug.c -rw-r--r-- 6.8 KB
string.c -rw-r--r-- 13.6 KB
string_helpers.c -rw-r--r-- 1.7 KB
swiotlb.c -rw-r--r-- 25.6 KB
syscall.c -rw-r--r-- 2.4 KB
textsearch.c -rw-r--r-- 9.5 KB
ts_bm.c -rw-r--r-- 5.3 KB
ts_fsm.c -rw-r--r-- 10.6 KB
ts_kmp.c -rw-r--r-- 4.3 KB
vsprintf.c -rw-r--r-- 31.4 KB

back to top