ALSA: es1968: Replace timeval with ktime_t
PATCH 1/1 ALSA: es1968: Replace timeval with ktime_t
es1968_measure_clock uses struct timeval, which on 32-bit systems will overflow in 2038, leading to incorrect interpretation of time.This patch changes the function to use ktime_t instead of struct timeval, which implies:
- no y2038: ktime_t uses a 64-bit datatype explicitly.
- efficent subtraction: The earlier version computes the difference in usecs while dealing with secs and nsecs. It requires checks to see if the nsecs of stop is less than start. This patch uses a direct subtract of ktime_t and converts to usecs.
- use of monotonic clock (ktime_get) over real time (do_gettimeofday), which simplifies timekeeping, as it does not have to deal with cases where stop_time is less than start_time.
--- sound/pci/es1968.c | 15 ++++++--------- 1 file changed, 6 insertions(+), 9 deletions(-)
sound/pci/es1968.c +6 -9
@@ -1710,7 +1710,8 @@ static void es1968_measure_clock(struct es1968 *chip)int i, apu;unsigned int pa, offset, t;struct esm_memory *memory; -struct timeval start_time, stop_time; +ktime_t start_time, stop_time; +ktime_t diff;if (chip->clock ==0 ) chip->clock =48000 ;/* default clock value */
@@ -1761,12 +1762,12 @@ static void es1968_measure_clock(struct es1968 *chip)snd_es1968_bob_inc (chip,ESM_BOB_FREQ );__apu_set_register (chip, apu,5 , pa &0xffff );snd_es1968_trigger_apu (chip, apu,ESM_APU_16BITLINEAR ); -do_gettimeofday (&start_time); + start_time =ktime_get ();spin_unlock_irq (&chip->reg_lock);msleep (50 );spin_lock_irq (&chip->reg_lock); offset =__apu_get_register (chip, apu,5 ); -do_gettimeofday (&stop_time); + stop_time =ktime_get ();snd_es1968_trigger_apu (chip, apu,0 );/* stop */ snd_es1968_bob_dec (chip); chip->in_measurement =0 ;
@@ -1777,12 +1778,8 @@ static void es1968_measure_clock(struct es1968 *chip) offset &=0xfffe ; offset += chip->measure_count * (CLOCK_MEASURE_BUFSIZE /2 ); - t = stop_time.tv_sec - start_time.tv_sec; - t *=1000000 ; -if (stop_time.tv_usec < start_time.tv_usec) - t -= start_time.tv_usec - stop_time.tv_usec; -else - t += stop_time.tv_usec - start_time.tv_usec; + diff =ktime_sub (stop_time, start_time); + t =ktime_to_us (diff);if (t ==0 ) {dev_err (chip->card->dev,"?? calculation error..\n" ); }else {
Signature · 1 line
2.1.0.rc2.206.gedb03e5
Takashi Iwai
AppliedAt Wed, 29 Oct 2014 10:48:10 -0700,
Quoted 13 lines · Tina Ruchandani
es1968_measure_clockuses struct timeval, which on 32-bit systems will overflow in 2038, leading to incorrect interpretation of time.This patch changes the function to usektime_tinstead of struct timeval, which implies:
- no y2038:ktime_tuses a 64-bit datatype explicitly.
- efficent subtraction: The earlier version computes the difference in usecs while dealing with secs and nsecs. It requires checks to see if the nsecs of stop is less than start. This patch uses a direct subtract ofktime_tand converts to usecs.
- use of monotonic clock (ktime_get) over real time (do_gettimeofday), which simplifies timekeeping, as it does not have to deal with cases wherestop_timeis less thanstart_time.
Quoted 2 lines
Signed-off-by Tina Ruchandani <[email protected]>Reviewed-by Arnd Bergmann <[email protected]>
Applied, thanks.
Takashi
Quoted 51 lines
--- sound/pci/es1968.c | 15 ++++++--------- 1 file changed, 6 insertions(+), 9 deletions(-)sound/pci/es1968.c +6
-9@@ -1710,7 +1710,8 @@ static void es1968_measure_clock(struct es1968 *chip)int i, apu;unsigned int pa, offset, t;struct esm_memory *memory; -struct timeval start_time, stop_time; +ktime_t start_time, stop_time; +ktime_t diff;if (chip->clock ==0 ) chip->clock =48000 ;/* default clock value */ @@ -1761,12 +1762,12 @@ static void es1968_measure_clock(struct es1968 *chip)snd_es1968_bob_inc (chip,ESM_BOB_FREQ );__apu_set_register (chip, apu,5 , pa &0xffff );snd_es1968_trigger_apu (chip, apu,ESM_APU_16BITLINEAR ); -do_gettimeofday (&start_time); + start_time =ktime_get ();spin_unlock_irq (&chip->reg_lock);msleep (50 );spin_lock_irq (&chip->reg_lock); offset =__apu_get_register (chip, apu,5 ); -do_gettimeofday (&stop_time); + stop_time =ktime_get ();snd_es1968_trigger_apu (chip, apu,0 );/* stop */ snd_es1968_bob_dec (chip); chip->in_measurement =0 ;@@ -1777,12 +1778,8 @@ static void es1968_measure_clock(struct es1968 *chip) offset &=0xfffe ; offset += chip->measure_count * (CLOCK_MEASURE_BUFSIZE /2 ); - t = stop_time.tv_sec - start_time.tv_sec; - t *=1000000 ; -if (stop_time.tv_usec < start_time.tv_usec) - t -= start_time.tv_usec - stop_time.tv_usec; -else - t += stop_time.tv_usec - start_time.tv_usec; + diff =ktime_sub (stop_time, start_time); + t =ktime_to_us (diff);if (t ==0 ) {dev_err (chip->card->dev,"?? calculation error..\n" ); }else {Signature · 1 line
2.1.0.rc2.206.gedb03e5