Thread (5 messages) 5 messages, 4 authors, 2024-01-08

Re: [PATCH v5] posix-timers: add multi_clock_gettime system call

From: Sagi Maimon <hidden>
Date: 2024-01-03 13:00:05
Also in: linux-arch, lkml, netdev

On Tue, Jan 2, 2024 at 12:22 PM Arnd Bergmann [off-list ref] wrote:
On Tue, Jan 2, 2024, at 10:18, Sagi Maimon wrote:
quoted
Some user space applications need to read some clocks.
Each read requires moving from user space to kernel space.
The syscall overhead causes unpredictable delay between N clocks reads
Removing this delay causes better synchronization between N clocks.

Introduce a new system call multi_clock_gettime, which can be used to measure
the offset between multiple clocks, from variety of types: PHC, virtual PHC
and various system clocks (CLOCK_REALTIME, CLOCK_MONOTONIC, etc).
The offset includes the total time that the driver needs to read the clock
timestamp.

New system call allows the reading of a list of clocks - up to PTP_MAX_CLOCKS.
Supported clocks IDs: PHC, virtual PHC and various system clocks.
Up to PTP_MAX_SAMPLES times (per clock) in a single system call read.
The system call returns n_clocks timestamps for each measurement:
- clock 0 timestamp
- ...
- clock n timestamp

Signed-off-by: Sagi Maimon <redacted>
---
 Changes since version 4:
 - fix error  : 'struct __ptp_multi_clock_get' declared inside parameter list
   will not be visible outside of this definition or declaration
I usually put all the changes for previous versions in a
list here, it helps reviewers.
Will be done on patch V6.
The changes you made for previous versions all look good
to me, but I think there is still a few things worth
considering. I'll also follow up on the earlier threads.
quoted
+#define MULTI_PTP_MAX_CLOCKS 32 /* Max number of clocks */
+#define MULTI_PTP_MAX_SAMPLES 32 /* Max allowed offset measurement samples. */
+
+struct __ptp_multi_clock_get {
+     unsigned int n_clocks; /* Desired number of clocks. */
+     unsigned int n_samples; /* Desired number of measurements per clock. */
+     clockid_t clkid_arr[MULTI_PTP_MAX_CLOCKS]; /* list of clock IDs */
+     /*
+      * Array of list of n_clocks clocks time samples n_samples times.
+      */
+     struct  __kernel_timespec ts[MULTI_PTP_MAX_SAMPLES][MULTI_PTP_MAX_CLOCKS];
+};
Since you now access each member individually, I think it
makes more sense here to just pass these as four
register arguments. It helps with argument introspection,
avoids a couple of get_user(), and lets you remove the fixed
array dimensions.
I prefer the use of  get_user(), I will use it to remove  the fixed
array dimensions.
which will be done on patch V6.
quoted
+SYSCALL_DEFINE1(multi_clock_gettime, struct __ptp_multi_clock_get
__user *, ptp_multi_clk_get)
+{
+     const struct k_clock *kc;
+     struct timespec64 *kernel_tp;
+     struct timespec64 *kernel_tp_base;
+     unsigned int n_clocks; /* Desired number of clocks. */
+     unsigned int n_samples; /* Desired number of measurements per clock.
*/
+     unsigned int i, j;
+     clockid_t clkid_arr[MULTI_PTP_MAX_CLOCKS]; /* list of clock IDs */
+     int error = 0;
+
+     if (copy_from_user(&n_clocks, &ptp_multi_clk_get->n_clocks,
sizeof(n_clocks)))
+             return -EFAULT;
+     if (copy_from_user(&n_samples, &ptp_multi_clk_get->n_samples,
sizeof(n_samples)))
If these remain as struct members rather than register arguments,
you should use get_user() instead of copy_from_user().
Will be done on patch V6
quoted
+     kernel_tp_base = kmalloc_array(n_clocks * n_samples,
+                                    sizeof(struct timespec64), GFP_KERNEL);
+     if (!kernel_tp_base)
+             return -ENOMEM;
To be on the safe side regarding possible data leak, maybe use
kcalloc() instead of kmalloc_array() here.
Will be done on patch V6.
quoted
+     kernel_tp = kernel_tp_base;
+     for (j = 0; j < n_samples; j++) {
+             for (i = 0; i < n_clocks; i++) {
+                     if (put_timespec64(kernel_tp++, (struct __kernel_timespec __user *)
+                                     &ptp_multi_clk_get->ts[j][i])) {
I think the typecast here can be removed.
You are right, will be fixed on patch V6.
      Arnd
Thanks for your Notes.
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help