Re: [PATCH] timekeeping: Fix HRTICK related deadlock from ntp lock changes

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hi,

On 09/12/2013 01:50 AM, John Stultz wrote:
[...]

The deadlock was introduced by 06c017fdd4dc48451a (timekeeping:
Hold timekeepering locks in do_adjtimex and hardpps) in 3.10

This patch avoids this deadlock, by moving the call to
schedule_delayed_work() outside of the timekeeper lock
critical section.

Cc: Ingo Molnar <mingo@xxxxxxxxxx>
Cc: Thomas Gleixner <tglx@xxxxxxxxxxxxx>
Cc: Gerlando Falauto <gerlando.falauto@xxxxxxxxxxx>
Cc: Mathieu Desnoyers <mathieu.desnoyers@xxxxxxxxxxxx>
Cc: stable <stable@xxxxxxxxxxxxxxx> #3.11, 3.10
Reported-by: Gerlando Falauto <gerlando.falauto@xxxxxxxxxxx>
Tested-by: Lin Ming <minggr@xxxxxxxxx>
Signed-off-by: John Stultz <john.stultz@xxxxxxxxxx>

For what it's worth (I guess it's a bit late now):

Tested-by: Gerlando Falauto <gerlando.falauto@xxxxxxxxxxx>

Thanks!
Gerlando

---
  include/linux/timex.h     | 1 +
  kernel/time/ntp.c         | 6 ++----
  kernel/time/timekeeping.c | 2 ++
  3 files changed, 5 insertions(+), 4 deletions(-)

diff --git a/include/linux/timex.h b/include/linux/timex.h
index b3726e6..dd3edd7 100644
--- a/include/linux/timex.h
+++ b/include/linux/timex.h
@@ -141,6 +141,7 @@ extern int do_adjtimex(struct timex *);
  extern void hardpps(const struct timespec *, const struct timespec *);

  int read_current_timer(unsigned long *timer_val);
+void ntp_notify_cmos_timer(void);

  /* The clock frequency of the i8253/i8254 PIT */
  #define PIT_TICK_RATE 1193182ul
diff --git a/kernel/time/ntp.c b/kernel/time/ntp.c
index 8f5b3b9..bb22151 100644
--- a/kernel/time/ntp.c
+++ b/kernel/time/ntp.c
@@ -516,13 +516,13 @@ static void sync_cmos_clock(struct work_struct *work)
  	schedule_delayed_work(&sync_cmos_work, timespec_to_jiffies(&next));
  }

-static void notify_cmos_timer(void)
+void ntp_notify_cmos_timer(void)
  {
  	schedule_delayed_work(&sync_cmos_work, 0);
  }

  #else
-static inline void notify_cmos_timer(void) { }
+void ntp_notify_cmos_timer(void) { }
  #endif


@@ -687,8 +687,6 @@ int __do_adjtimex(struct timex *txc, struct timespec *ts, s32 *time_tai)
  	if (!(time_status & STA_NANO))
  		txc->time.tv_usec /= NSEC_PER_USEC;

-	notify_cmos_timer();
-
  	return result;
  }

diff --git a/kernel/time/timekeeping.c b/kernel/time/timekeeping.c
index 48b9fff..947ba25 100644
--- a/kernel/time/timekeeping.c
+++ b/kernel/time/timekeeping.c
@@ -1703,6 +1703,8 @@ int do_adjtimex(struct timex *txc)
  	write_seqcount_end(&timekeeper_seq);
  	raw_spin_unlock_irqrestore(&timekeeper_lock, flags);

+	ntp_notify_cmos_timer();
+
  	return ret;
  }



--
To unsubscribe from this list: send the line "unsubscribe stable" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html




[Index of Archives]     [Linux Kernel]     [Kernel Development Newbies]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite Hiking]     [Linux Kernel]     [Linux SCSI]