]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
ptp: allow reading of currently dialed frequency to succeed on free-running clocks
authorVladimir Oltean <vladimir.oltean@nxp.com>
Fri, 13 Jun 2025 17:47:49 +0000 (20:47 +0300)
committerJakub Kicinski <kuba@kernel.org>
Tue, 17 Jun 2025 23:13:09 +0000 (16:13 -0700)
There is a bug in ptp_clock_adjtime() which makes it refuse the
operation even if we just want to read the current clock dialed
frequency, not modify anything (tx->modes == 0). That should be possible
even if the clock is free-running. For context, the kernel UAPI is the
same for getting and setting the frequency of a POSIX clock.

For example, ptp4l errors out at clock_create() -> clockadj_get_freq()
-> clock_adjtime() time, when it should logically only have failed on
actual adjustments to the clock, aka if the clock was configured as
slave. But in master mode it should work.

This was discovered when examining the issue described in the previous
commit, where ptp_clock_freerun() returned true despite n_vclocks being
zero.

Fixes: 73f37068d540 ("ptp: support ptp physical/virtual clocks conversion")
Signed-off-by: Vladimir Oltean <vladimir.oltean@nxp.com>
Link: https://patch.msgid.link/20250613174749.406826-3-vladimir.oltean@nxp.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
drivers/ptp/ptp_clock.c

index 35a5994bf64f6373c08269d63aaeac3f4ab31ff0..36f57d7b4a66717ae2c261c4dc7988af3346c5cc 100644 (file)
@@ -121,7 +121,8 @@ static int ptp_clock_adjtime(struct posix_clock *pc, struct __kernel_timex *tx)
        struct ptp_clock_info *ops;
        int err = -EOPNOTSUPP;
 
-       if (ptp_clock_freerun(ptp)) {
+       if (tx->modes & (ADJ_SETOFFSET | ADJ_FREQUENCY | ADJ_OFFSET) &&
+           ptp_clock_freerun(ptp)) {
                pr_err("ptp: physical clock is free running\n");
                return -EBUSY;
        }