Re: [Y2038] [PATCH v2] Staging: media: Replace timeval with ktime_t

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

 



On Sunday 10 May 2015 18:40:26 Ksenija Stanojevic wrote:
> 'struct timeval last_tv' is used to get the time of last signal change
> and 'struct timeval last_intr_tv' is used to get the time of last UART
> interrupt.
> 32-bit systems using 'struct timeval' will break in the year 2038, so we
> have to replace that code with more appropriate types.
> Here struct timeval is replaced with ktime_t.
> 
> Signed-off-by: Ksenija Stanojevic <ksenija.stanojevic@xxxxxxxxx>
> ---
> Changes in v2:
> 	- change subject line

[adding linux-media@xxxxxxxxxxxxxxx to cc]

Your patch looks correct to me, nice work!

> @@ -127,9 +127,9 @@ static int threshold = 3;
>  static DEFINE_SPINLOCK(timer_lock);
>  static struct timer_list timerlist;
>  /* time of last signal change detected */
> -static struct timeval last_tv = {0, 0};
> +static ktime_t last_tv;
>  /* time of last UART data ready interrupt */
> -static struct timeval last_intr_tv = {0, 0};
> +static ktime_t last_intr_tv;
>  static int last_value;

It would probably help to rename the variables here and remove the '_tv'
postfix as this is no longer a timeval.

>  static DECLARE_WAIT_QUEUE_HEAD(lirc_read_queue);
> @@ -400,17 +400,16 @@ static void drop_chrdev(void)
>  }
>  
>  /* SECTION: Hardware */
> -static long delta(struct timeval *tv1, struct timeval *tv2)
> +static long delta(ktime_t tv1, ktime_t tv2)
>  {
>  	unsigned long deltv;
> +	ktime_t delkt;
>  
> -	deltv = tv2->tv_sec - tv1->tv_sec;
> -	if (deltv > 15)
> +	delkt = ktime_sub(tv2, tv1);
> +	if (ktime_compare(delkt, ktime_set(15, 0)) > 0)
>  		deltv = 0xFFFFFF;
>  	else
> -		deltv = deltv*1000000 +
> -			tv2->tv_usec -
> -			tv1->tv_usec;
> +		deltv = (int)ktime_to_us(delkt);
>  	return deltv;
>  }

You have three different types here: 'long', 'unsigned long' and 'int'.
While I believe the code to be correct here, it would be easier to
see if you used all the same types, e.g. by making them all 'long'.

> @@ -432,7 +431,7 @@ static void sir_timeout(unsigned long data)
>  		/* clear unread bits in UART and restart */
>  		outb(UART_FCR_CLEAR_RCVR, io + UART_FCR);
>  		/* determine 'virtual' pulse end: */
> -		pulse_end = delta(&last_tv, &last_intr_tv);
> +		pulse_end = delta(last_tv, last_intr_tv);
>  		dev_dbg(driver.dev, "timeout add %d for %lu usec\n",
>  				    last_value, pulse_end);
>  		add_read_queue(last_value, pulse_end);
> @@ -445,7 +444,7 @@ static void sir_timeout(unsigned long data)
>  static irqreturn_t sir_interrupt(int irq, void *dev_id)
>  {
>  	unsigned char data;
> -	struct timeval curr_tv;
> +	ktime_t curr_tv;
>  	static unsigned long deltv;
>  	unsigned long deltintrtv;
>  	unsigned long flags;
> @@ -471,9 +470,9 @@ static irqreturn_t sir_interrupt(int irq, void *dev_id)
>  			do {
>  				del_timer(&timerlist);
>  				data = inb(io + UART_RX);
> -				do_gettimeofday(&curr_tv);
> -				deltv = delta(&last_tv, &curr_tv);
> -				deltintrtv = delta(&last_intr_tv, &curr_tv);
> +				curr_tv = ktime_get();
> +				deltv = delta(last_tv, curr_tv);
> +				deltintrtv = delta(last_intr_tv, curr_tv);
>  				dev_dbg(driver.dev, "t %lu, d %d\n",
>  						    deltintrtv, (int)data);
>  				/*
> @@ -488,10 +487,7 @@ static irqreturn_t sir_interrupt(int irq, void *dev_id)
>  							       deltv -
>  							       deltintrtv);
>  						last_value = 0;
> -						last_tv.tv_sec =
> -							last_intr_tv.tv_sec;
> -						last_tv.tv_usec =
> -							last_intr_tv.tv_usec;
> +						last_tv = last_intr_tv;
>  						deltv = deltintrtv;
>  					}
>  				}
> @@ -505,13 +501,8 @@ static irqreturn_t sir_interrupt(int irq, void *dev_id)
>  						       deltv-TIME_CONST);
>  					last_value = data;
>  					last_tv = curr_tv;
> -					if (last_tv.tv_usec >= TIME_CONST) {
> -						last_tv.tv_usec -= TIME_CONST;
> -					} else {
> -						last_tv.tv_sec--;
> -						last_tv.tv_usec += 1000000 -
> -							TIME_CONST;
> -					}
> +					last_tv = ktime_sub_us(last_tv,
> +							       TIME_CONST);
>  				}
>  				last_intr_tv = curr_tv;
>  				if (data) {
> 

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




[Index of Archives]     [Linux Input]     [Video for Linux]     [Gstreamer Embedded]     [Mplayer Users]     [Linux USB Devel]     [Linux Audio Users]     [Linux Kernel]     [Linux SCSI]     [Yosemite Backpacking]
  Powered by Linux