mirror of https://gitee.com/openkylin/linux.git
i40e: fix i40e_ptp_adjtime when given a negative delta
Commit0ac30ce433
("i40e: fix up 32 bit timespec references", 2017-07-26) claims to be cleaning up references to 32-bit timespecs. The actual contents of the commit make no sense, as it converts a call to timespec64_add into timespec64_add_ns. This would seem ok, if (a) the change was documented in the commit message, and (b) timespec64_add_ns supported negative numbers. timespec64_add_ns doesn't work with signed deltas, because the implementation is based around iter_div_u64_rem. This change resulted in a regression where i40e_ptp_adjtime would interpret small negative adjustments as large positive additions, resulting in incorrect behavior. This commit doesn't appear to fix anything, is not well explained, and introduces a bug, so lets just revert it. Reverts:0ac30ce433
("i40e: fix up 32 bit timespec references", 2017-07-26) Signed-off-by: Jacob Keller <jacob.e.keller@intel.com> Reviewed-by: Arnd Bergmann <arnd@arndb.de> Tested-by: Andrew Bowers <andrewx.bowers@intel.com> Signed-off-by: Jeff Kirsher <jeffrey.t.kirsher@intel.com>
This commit is contained in:
parent
8c838f53e1
commit
b3ccbbce1e
|
@ -146,12 +146,13 @@ static int i40e_ptp_adjfreq(struct ptp_clock_info *ptp, s32 ppb)
|
|||
static int i40e_ptp_adjtime(struct ptp_clock_info *ptp, s64 delta)
|
||||
{
|
||||
struct i40e_pf *pf = container_of(ptp, struct i40e_pf, ptp_caps);
|
||||
struct timespec64 now;
|
||||
struct timespec64 now, then;
|
||||
|
||||
then = ns_to_timespec64(delta);
|
||||
mutex_lock(&pf->tmreg_lock);
|
||||
|
||||
i40e_ptp_read(pf, &now, NULL);
|
||||
timespec64_add_ns(&now, delta);
|
||||
now = timespec64_add(now, then);
|
||||
i40e_ptp_write(pf, (const struct timespec64 *)&now);
|
||||
|
||||
mutex_unlock(&pf->tmreg_lock);
|
||||
|
|
Loading…
Reference in New Issue