Skip to content

Commit

Permalink
[PATCH] uml: add locking to xtime accesses
Browse files Browse the repository at this point in the history
do_timer must be called with xtime_lock held.  I'm not sure boot_timer_handler
needs this, however I don't think it hurts: it simply disables irq and takes a
spinlock.

Signed-off-by: Paolo 'Blaisorblade' Giarrusso <blaisorblade@yahoo.it>
Cc: Paolo 'Blaisorblade' Giarrusso <blaisorblade@yahoo.it>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
  • Loading branch information
Jeff Dike authored and Linus Torvalds committed Jun 30, 2006
1 parent 6edb086 commit 572e614
Showing 1 changed file with 8 additions and 2 deletions.
10 changes: 8 additions & 2 deletions arch/um/kernel/time_kern.c
Original file line number Diff line number Diff line change
Expand Up @@ -96,11 +96,15 @@ void time_init_kern(void)

void do_boot_timer_handler(struct sigcontext * sc)
{
unsigned long flags;
struct pt_regs regs;

CHOOSE_MODE((void) (UPT_SC(&regs.regs) = sc),
(void) (regs.regs.skas.is_user = 0));

write_seqlock_irqsave(&xtime_lock, flags);
do_timer(&regs);
write_sequnlock_irqrestore(&xtime_lock, flags);
}

static DEFINE_SPINLOCK(timer_spinlock);
Expand All @@ -125,15 +129,17 @@ irqreturn_t um_timer(int irq, void *dev, struct pt_regs *regs)
unsigned long long nsecs;
unsigned long flags;

write_seqlock_irqsave(&xtime_lock, flags);

do_timer(regs);

write_seqlock_irqsave(&xtime_lock, flags);
nsecs = get_time() + local_offset;
xtime.tv_sec = nsecs / NSEC_PER_SEC;
xtime.tv_nsec = nsecs - xtime.tv_sec * NSEC_PER_SEC;

write_sequnlock_irqrestore(&xtime_lock, flags);

return(IRQ_HANDLED);
return IRQ_HANDLED;
}

long um_time(int __user *tloc)
Expand Down

0 comments on commit 572e614

Please sign in to comment.