Re: [PATCH 2/2] staging: greybus/loopback: use ktime_get() for time intervals

2017-11-04 Thread Bryan O'Donoghue

On 02/11/17 14:32, Arnd Bergmann wrote:

This driver is the only one using the deprecated timeval_to_ns()
helper. Changing it from do_gettimeofday() to ktime_get() makes
the code more efficient, more robust against concurrent
settimeofday(), more accurate and lets us get rid of that helper
in the future.

Signed-off-by: Arnd Bergmann 
---
  drivers/staging/greybus/loopback.c | 42 --
  1 file changed, 18 insertions(+), 24 deletions(-)

diff --git a/drivers/staging/greybus/loopback.c 
b/drivers/staging/greybus/loopback.c
index 85046fb16aad..3d92638c424b 100644
--- a/drivers/staging/greybus/loopback.c
+++ b/drivers/staging/greybus/loopback.c
@@ -58,7 +58,7 @@ static struct gb_loopback_device gb_dev;
  struct gb_loopback_async_operation {
struct gb_loopback *gb;
struct gb_operation *operation;
-   struct timeval ts;
+   ktime_t ts;
struct timer_list timer;
struct list_head entry;
struct work_struct work;
@@ -81,7 +81,7 @@ struct gb_loopback {
atomic_t outstanding_operations;
  
  	/* Per connection stats */

-   struct timeval ts;
+   ktime_t ts;
struct gb_loopback_stats latency;
struct gb_loopback_stats throughput;
struct gb_loopback_stats requests_per_second;
@@ -375,14 +375,9 @@ static u64 __gb_loopback_calc_latency(u64 t1, u64 t2)
return NSEC_PER_DAY - t2 + t1;
  }
  
-static u64 gb_loopback_calc_latency(struct timeval *ts, struct timeval *te)

+static u64 gb_loopback_calc_latency(ktime_t ts, ktime_t te)
  {
-   u64 t1, t2;
-
-   t1 = timeval_to_ns(ts);
-   t2 = timeval_to_ns(te);
-
-   return __gb_loopback_calc_latency(t1, t2);
+   return __gb_loopback_calc_latency(ktime_to_ns(ts), ktime_to_ns(te));
  }
  
  static int gb_loopback_operation_sync(struct gb_loopback *gb, int type,

@@ -390,10 +385,10 @@ static int gb_loopback_operation_sync(struct gb_loopback 
*gb, int type,
  void *response, int response_size)
  {
struct gb_operation *operation;
-   struct timeval ts, te;
+   ktime_t ts, te;
int ret;
  
-	do_gettimeofday();

+   ts = ktime_get();
operation = gb_operation_create(gb->connection, type, request_size,
response_size, GFP_KERNEL);
if (!operation)
@@ -421,10 +416,10 @@ static int gb_loopback_operation_sync(struct gb_loopback 
*gb, int type,
}
}
  
-	do_gettimeofday();

+   te = ktime_get();
  
  	/* Calculate the total time the message took */

-   gb->elapsed_nsecs = gb_loopback_calc_latency(, );
+   gb->elapsed_nsecs = gb_loopback_calc_latency(ts, te);
  
  out_put_operation:

gb_operation_put(operation);
@@ -492,10 +487,10 @@ static void gb_loopback_async_operation_callback(struct 
gb_operation *operation)
  {
struct gb_loopback_async_operation *op_async;
struct gb_loopback *gb;
-   struct timeval te;
+   ktime_t te;
bool err = false;
  
-	do_gettimeofday();

+   te = ktime_get();
op_async = gb_loopback_operation_find(operation->id);
if (!op_async)
return;
@@ -512,8 +507,7 @@ static void gb_loopback_async_operation_callback(struct 
gb_operation *operation)
}
  
  	if (!err)

-   gb->elapsed_nsecs = gb_loopback_calc_latency(_async->ts,
-);
+   gb->elapsed_nsecs = gb_loopback_calc_latency(op_async->ts, te);
  
  	if (op_async->pending) {

if (err)
@@ -608,7 +602,7 @@ static int gb_loopback_async_operation(struct gb_loopback 
*gb, int type,
list_add_tail(_async->entry, _dev.list_op_async);
spin_unlock_irqrestore(_dev.lock, flags);
  
-	do_gettimeofday(_async->ts);

+   op_async->ts = ktime_get();
op_async->pending = true;
atomic_inc(>outstanding_operations);
mutex_lock(>mutex);
@@ -842,7 +836,7 @@ static void gb_loopback_reset_stats(struct gb_loopback *gb)
/* Should be initialized at least once per transaction set */
gb->apbridge_latency_ts = 0;
gb->gbphy_latency_ts = 0;
-   memset(>ts, 0, sizeof(struct timeval));
+   gb->ts = ktime_set(0, 0);
  }
  
  static void gb_loopback_update_stats(struct gb_loopback_stats *stats, u32 val)

@@ -925,15 +919,15 @@ static void gb_loopback_calculate_stats(struct 
gb_loopback *gb, bool error)
  {
u64 nlat;
u32 lat;
-   struct timeval te;
+   ktime_t te;
  
  	if (!error) {

gb->requests_completed++;
gb_loopback_calculate_latency_stats(gb);
}
  
-	do_gettimeofday();

-   nlat = gb_loopback_calc_latency(>ts, );
+   te = ktime_get();
+   nlat = gb_loopback_calc_latency(gb->ts, te);
if (nlat >= NSEC_PER_SEC || gb->iteration_count == gb->iteration_max) {
lat = 

Re: [PATCH 2/2] staging: greybus/loopback: use ktime_get() for time intervals

2017-11-04 Thread Bryan O'Donoghue

On 02/11/17 14:32, Arnd Bergmann wrote:

This driver is the only one using the deprecated timeval_to_ns()
helper. Changing it from do_gettimeofday() to ktime_get() makes
the code more efficient, more robust against concurrent
settimeofday(), more accurate and lets us get rid of that helper
in the future.

Signed-off-by: Arnd Bergmann 
---
  drivers/staging/greybus/loopback.c | 42 --
  1 file changed, 18 insertions(+), 24 deletions(-)

diff --git a/drivers/staging/greybus/loopback.c 
b/drivers/staging/greybus/loopback.c
index 85046fb16aad..3d92638c424b 100644
--- a/drivers/staging/greybus/loopback.c
+++ b/drivers/staging/greybus/loopback.c
@@ -58,7 +58,7 @@ static struct gb_loopback_device gb_dev;
  struct gb_loopback_async_operation {
struct gb_loopback *gb;
struct gb_operation *operation;
-   struct timeval ts;
+   ktime_t ts;
struct timer_list timer;
struct list_head entry;
struct work_struct work;
@@ -81,7 +81,7 @@ struct gb_loopback {
atomic_t outstanding_operations;
  
  	/* Per connection stats */

-   struct timeval ts;
+   ktime_t ts;
struct gb_loopback_stats latency;
struct gb_loopback_stats throughput;
struct gb_loopback_stats requests_per_second;
@@ -375,14 +375,9 @@ static u64 __gb_loopback_calc_latency(u64 t1, u64 t2)
return NSEC_PER_DAY - t2 + t1;
  }
  
-static u64 gb_loopback_calc_latency(struct timeval *ts, struct timeval *te)

+static u64 gb_loopback_calc_latency(ktime_t ts, ktime_t te)
  {
-   u64 t1, t2;
-
-   t1 = timeval_to_ns(ts);
-   t2 = timeval_to_ns(te);
-
-   return __gb_loopback_calc_latency(t1, t2);
+   return __gb_loopback_calc_latency(ktime_to_ns(ts), ktime_to_ns(te));
  }
  
  static int gb_loopback_operation_sync(struct gb_loopback *gb, int type,

@@ -390,10 +385,10 @@ static int gb_loopback_operation_sync(struct gb_loopback 
*gb, int type,
  void *response, int response_size)
  {
struct gb_operation *operation;
-   struct timeval ts, te;
+   ktime_t ts, te;
int ret;
  
-	do_gettimeofday();

+   ts = ktime_get();
operation = gb_operation_create(gb->connection, type, request_size,
response_size, GFP_KERNEL);
if (!operation)
@@ -421,10 +416,10 @@ static int gb_loopback_operation_sync(struct gb_loopback 
*gb, int type,
}
}
  
-	do_gettimeofday();

+   te = ktime_get();
  
  	/* Calculate the total time the message took */

-   gb->elapsed_nsecs = gb_loopback_calc_latency(, );
+   gb->elapsed_nsecs = gb_loopback_calc_latency(ts, te);
  
  out_put_operation:

gb_operation_put(operation);
@@ -492,10 +487,10 @@ static void gb_loopback_async_operation_callback(struct 
gb_operation *operation)
  {
struct gb_loopback_async_operation *op_async;
struct gb_loopback *gb;
-   struct timeval te;
+   ktime_t te;
bool err = false;
  
-	do_gettimeofday();

+   te = ktime_get();
op_async = gb_loopback_operation_find(operation->id);
if (!op_async)
return;
@@ -512,8 +507,7 @@ static void gb_loopback_async_operation_callback(struct 
gb_operation *operation)
}
  
  	if (!err)

-   gb->elapsed_nsecs = gb_loopback_calc_latency(_async->ts,
-);
+   gb->elapsed_nsecs = gb_loopback_calc_latency(op_async->ts, te);
  
  	if (op_async->pending) {

if (err)
@@ -608,7 +602,7 @@ static int gb_loopback_async_operation(struct gb_loopback 
*gb, int type,
list_add_tail(_async->entry, _dev.list_op_async);
spin_unlock_irqrestore(_dev.lock, flags);
  
-	do_gettimeofday(_async->ts);

+   op_async->ts = ktime_get();
op_async->pending = true;
atomic_inc(>outstanding_operations);
mutex_lock(>mutex);
@@ -842,7 +836,7 @@ static void gb_loopback_reset_stats(struct gb_loopback *gb)
/* Should be initialized at least once per transaction set */
gb->apbridge_latency_ts = 0;
gb->gbphy_latency_ts = 0;
-   memset(>ts, 0, sizeof(struct timeval));
+   gb->ts = ktime_set(0, 0);
  }
  
  static void gb_loopback_update_stats(struct gb_loopback_stats *stats, u32 val)

@@ -925,15 +919,15 @@ static void gb_loopback_calculate_stats(struct 
gb_loopback *gb, bool error)
  {
u64 nlat;
u32 lat;
-   struct timeval te;
+   ktime_t te;
  
  	if (!error) {

gb->requests_completed++;
gb_loopback_calculate_latency_stats(gb);
}
  
-	do_gettimeofday();

-   nlat = gb_loopback_calc_latency(>ts, );
+   te = ktime_get();
+   nlat = gb_loopback_calc_latency(gb->ts, te);
if (nlat >= NSEC_PER_SEC || gb->iteration_count == gb->iteration_max) {
lat = gb_loopback_nsec_to_usec_latency(nlat);
  

Re: [PATCH 2/2] staging: greybus/loopback: use ktime_get() for time intervals

2017-11-03 Thread Bryan O'Donoghue

On 02/11/17 14:32, Arnd Bergmann wrote:

This driver is the only one using the deprecated timeval_to_ns()
helper. Changing it from do_gettimeofday() to ktime_get() makes
the code more efficient, more robust against concurrent
settimeofday(), more accurate and lets us get rid of that helper
in the future.

Signed-off-by: Arnd Bergmann 
---
  drivers/staging/greybus/loopback.c | 42 --
  1 file changed, 18 insertions(+), 24 deletions(-)

diff --git a/drivers/staging/greybus/loopback.c 
b/drivers/staging/greybus/loopback.c
index 85046fb16aad..3d92638c424b 100644
--- a/drivers/staging/greybus/loopback.c
+++ b/drivers/staging/greybus/loopback.c
@@ -58,7 +58,7 @@ static struct gb_loopback_device gb_dev;
  struct gb_loopback_async_operation {
struct gb_loopback *gb;
struct gb_operation *operation;
-   struct timeval ts;
+   ktime_t ts;
struct timer_list timer;
struct list_head entry;
struct work_struct work;
@@ -81,7 +81,7 @@ struct gb_loopback {
atomic_t outstanding_operations;
  
  	/* Per connection stats */

-   struct timeval ts;
+   ktime_t ts;
struct gb_loopback_stats latency;
struct gb_loopback_stats throughput;
struct gb_loopback_stats requests_per_second;
@@ -375,14 +375,9 @@ static u64 __gb_loopback_calc_latency(u64 t1, u64 t2)
return NSEC_PER_DAY - t2 + t1;
  }
  
-static u64 gb_loopback_calc_latency(struct timeval *ts, struct timeval *te)

+static u64 gb_loopback_calc_latency(ktime_t ts, ktime_t te)
  {
-   u64 t1, t2;
-
-   t1 = timeval_to_ns(ts);
-   t2 = timeval_to_ns(te);
-
-   return __gb_loopback_calc_latency(t1, t2);
+   return __gb_loopback_calc_latency(ktime_to_ns(ts), ktime_to_ns(te));
  }
  
  static int gb_loopback_operation_sync(struct gb_loopback *gb, int type,

@@ -390,10 +385,10 @@ static int gb_loopback_operation_sync(struct gb_loopback 
*gb, int type,
  void *response, int response_size)
  {
struct gb_operation *operation;
-   struct timeval ts, te;
+   ktime_t ts, te;
int ret;
  
-	do_gettimeofday();

+   ts = ktime_get();
operation = gb_operation_create(gb->connection, type, request_size,
response_size, GFP_KERNEL);
if (!operation)
@@ -421,10 +416,10 @@ static int gb_loopback_operation_sync(struct gb_loopback 
*gb, int type,
}
}
  
-	do_gettimeofday();

+   te = ktime_get();
  
  	/* Calculate the total time the message took */

-   gb->elapsed_nsecs = gb_loopback_calc_latency(, );
+   gb->elapsed_nsecs = gb_loopback_calc_latency(ts, te);
  
  out_put_operation:

gb_operation_put(operation);
@@ -492,10 +487,10 @@ static void gb_loopback_async_operation_callback(struct 
gb_operation *operation)
  {
struct gb_loopback_async_operation *op_async;
struct gb_loopback *gb;
-   struct timeval te;
+   ktime_t te;
bool err = false;
  
-	do_gettimeofday();

+   te = ktime_get();
op_async = gb_loopback_operation_find(operation->id);
if (!op_async)
return;
@@ -512,8 +507,7 @@ static void gb_loopback_async_operation_callback(struct 
gb_operation *operation)
}
  
  	if (!err)

-   gb->elapsed_nsecs = gb_loopback_calc_latency(_async->ts,
-);
+   gb->elapsed_nsecs = gb_loopback_calc_latency(op_async->ts, te);
  
  	if (op_async->pending) {

if (err)
@@ -608,7 +602,7 @@ static int gb_loopback_async_operation(struct gb_loopback 
*gb, int type,
list_add_tail(_async->entry, _dev.list_op_async);
spin_unlock_irqrestore(_dev.lock, flags);
  
-	do_gettimeofday(_async->ts);

+   op_async->ts = ktime_get();
op_async->pending = true;
atomic_inc(>outstanding_operations);
mutex_lock(>mutex);
@@ -842,7 +836,7 @@ static void gb_loopback_reset_stats(struct gb_loopback *gb)
/* Should be initialized at least once per transaction set */
gb->apbridge_latency_ts = 0;
gb->gbphy_latency_ts = 0;
-   memset(>ts, 0, sizeof(struct timeval));
+   gb->ts = ktime_set(0, 0);
  }
  
  static void gb_loopback_update_stats(struct gb_loopback_stats *stats, u32 val)

@@ -925,15 +919,15 @@ static void gb_loopback_calculate_stats(struct 
gb_loopback *gb, bool error)
  {
u64 nlat;
u32 lat;
-   struct timeval te;
+   ktime_t te;
  
  	if (!error) {

gb->requests_completed++;
gb_loopback_calculate_latency_stats(gb);
}
  
-	do_gettimeofday();

-   nlat = gb_loopback_calc_latency(>ts, );
+   te = ktime_get();
+   nlat = gb_loopback_calc_latency(gb->ts, te);
if (nlat >= NSEC_PER_SEC || gb->iteration_count == gb->iteration_max) {
lat = 

Re: [PATCH 2/2] staging: greybus/loopback: use ktime_get() for time intervals

2017-11-03 Thread Bryan O'Donoghue

On 02/11/17 14:32, Arnd Bergmann wrote:

This driver is the only one using the deprecated timeval_to_ns()
helper. Changing it from do_gettimeofday() to ktime_get() makes
the code more efficient, more robust against concurrent
settimeofday(), more accurate and lets us get rid of that helper
in the future.

Signed-off-by: Arnd Bergmann 
---
  drivers/staging/greybus/loopback.c | 42 --
  1 file changed, 18 insertions(+), 24 deletions(-)

diff --git a/drivers/staging/greybus/loopback.c 
b/drivers/staging/greybus/loopback.c
index 85046fb16aad..3d92638c424b 100644
--- a/drivers/staging/greybus/loopback.c
+++ b/drivers/staging/greybus/loopback.c
@@ -58,7 +58,7 @@ static struct gb_loopback_device gb_dev;
  struct gb_loopback_async_operation {
struct gb_loopback *gb;
struct gb_operation *operation;
-   struct timeval ts;
+   ktime_t ts;
struct timer_list timer;
struct list_head entry;
struct work_struct work;
@@ -81,7 +81,7 @@ struct gb_loopback {
atomic_t outstanding_operations;
  
  	/* Per connection stats */

-   struct timeval ts;
+   ktime_t ts;
struct gb_loopback_stats latency;
struct gb_loopback_stats throughput;
struct gb_loopback_stats requests_per_second;
@@ -375,14 +375,9 @@ static u64 __gb_loopback_calc_latency(u64 t1, u64 t2)
return NSEC_PER_DAY - t2 + t1;
  }
  
-static u64 gb_loopback_calc_latency(struct timeval *ts, struct timeval *te)

+static u64 gb_loopback_calc_latency(ktime_t ts, ktime_t te)
  {
-   u64 t1, t2;
-
-   t1 = timeval_to_ns(ts);
-   t2 = timeval_to_ns(te);
-
-   return __gb_loopback_calc_latency(t1, t2);
+   return __gb_loopback_calc_latency(ktime_to_ns(ts), ktime_to_ns(te));
  }
  
  static int gb_loopback_operation_sync(struct gb_loopback *gb, int type,

@@ -390,10 +385,10 @@ static int gb_loopback_operation_sync(struct gb_loopback 
*gb, int type,
  void *response, int response_size)
  {
struct gb_operation *operation;
-   struct timeval ts, te;
+   ktime_t ts, te;
int ret;
  
-	do_gettimeofday();

+   ts = ktime_get();
operation = gb_operation_create(gb->connection, type, request_size,
response_size, GFP_KERNEL);
if (!operation)
@@ -421,10 +416,10 @@ static int gb_loopback_operation_sync(struct gb_loopback 
*gb, int type,
}
}
  
-	do_gettimeofday();

+   te = ktime_get();
  
  	/* Calculate the total time the message took */

-   gb->elapsed_nsecs = gb_loopback_calc_latency(, );
+   gb->elapsed_nsecs = gb_loopback_calc_latency(ts, te);
  
  out_put_operation:

gb_operation_put(operation);
@@ -492,10 +487,10 @@ static void gb_loopback_async_operation_callback(struct 
gb_operation *operation)
  {
struct gb_loopback_async_operation *op_async;
struct gb_loopback *gb;
-   struct timeval te;
+   ktime_t te;
bool err = false;
  
-	do_gettimeofday();

+   te = ktime_get();
op_async = gb_loopback_operation_find(operation->id);
if (!op_async)
return;
@@ -512,8 +507,7 @@ static void gb_loopback_async_operation_callback(struct 
gb_operation *operation)
}
  
  	if (!err)

-   gb->elapsed_nsecs = gb_loopback_calc_latency(_async->ts,
-);
+   gb->elapsed_nsecs = gb_loopback_calc_latency(op_async->ts, te);
  
  	if (op_async->pending) {

if (err)
@@ -608,7 +602,7 @@ static int gb_loopback_async_operation(struct gb_loopback 
*gb, int type,
list_add_tail(_async->entry, _dev.list_op_async);
spin_unlock_irqrestore(_dev.lock, flags);
  
-	do_gettimeofday(_async->ts);

+   op_async->ts = ktime_get();
op_async->pending = true;
atomic_inc(>outstanding_operations);
mutex_lock(>mutex);
@@ -842,7 +836,7 @@ static void gb_loopback_reset_stats(struct gb_loopback *gb)
/* Should be initialized at least once per transaction set */
gb->apbridge_latency_ts = 0;
gb->gbphy_latency_ts = 0;
-   memset(>ts, 0, sizeof(struct timeval));
+   gb->ts = ktime_set(0, 0);
  }
  
  static void gb_loopback_update_stats(struct gb_loopback_stats *stats, u32 val)

@@ -925,15 +919,15 @@ static void gb_loopback_calculate_stats(struct 
gb_loopback *gb, bool error)
  {
u64 nlat;
u32 lat;
-   struct timeval te;
+   ktime_t te;
  
  	if (!error) {

gb->requests_completed++;
gb_loopback_calculate_latency_stats(gb);
}
  
-	do_gettimeofday();

-   nlat = gb_loopback_calc_latency(>ts, );
+   te = ktime_get();
+   nlat = gb_loopback_calc_latency(gb->ts, te);
if (nlat >= NSEC_PER_SEC || gb->iteration_count == gb->iteration_max) {
lat = gb_loopback_nsec_to_usec_latency(nlat);