On Sun, Dec 31, 2023 at 11:10 PM Andy Lutomirski <luto@xxxxxxxxxx> wrote: > > On Sun, Dec 31, 2023 at 9:07 AM Sagi Maimon <maimon.sagi@xxxxxxxxx> wrote: > > > > 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. Andy Thank you for your notes. > > Knowing this offset sounds quite nice, but... > > > > > 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 > > Could this instead be arranged to read the actual, exact offset? > It can be done, but I prefer to leave it generic and consistent with other time system calls. In most cases the offset calculation is done in user space application > > + 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])) { > > + error = -EFAULT; > > + goto out; > > + } > > + } > > + } > > There are several pairs of clocks that tick at precisely same rate > (and use the same underlying hardware clock), and the offset could be > computed exactly instead of doing this noisy loop that is merely > somewhat less bad than what user code could do all by itself. You are correct, there are some PHCs on the same NIC (each per port) that share the same HW counter/clock. In that case it is slightly better to do the offset calculation in the NIC driver code, but that requires changes in each NIC driver's code. The main thing is that the multi_clock_gettime system call is a generic solution, it covers that case among other cases, for example sync between two PHCs on different NICs.