@@ -62,12 +62,13 @@ void mlx4_en_fill_hwtstamps(struct mlx4_en_dev *mdev,
62
62
struct skb_shared_hwtstamps * hwts ,
63
63
u64 timestamp )
64
64
{
65
- unsigned long flags ;
65
+ unsigned int seq ;
66
66
u64 nsec ;
67
67
68
- read_lock_irqsave (& mdev -> clock_lock , flags );
69
- nsec = timecounter_cyc2time (& mdev -> clock , timestamp );
70
- read_unlock_irqrestore (& mdev -> clock_lock , flags );
68
+ do {
69
+ seq = read_seqbegin (& mdev -> clock_lock );
70
+ nsec = timecounter_cyc2time (& mdev -> clock , timestamp );
71
+ } while (read_seqretry (& mdev -> clock_lock , seq ));
71
72
72
73
memset (hwts , 0 , sizeof (struct skb_shared_hwtstamps ));
73
74
hwts -> hwtstamp = ns_to_ktime (nsec );
@@ -95,9 +96,9 @@ void mlx4_en_ptp_overflow_check(struct mlx4_en_dev *mdev)
95
96
unsigned long flags ;
96
97
97
98
if (timeout ) {
98
- write_lock_irqsave (& mdev -> clock_lock , flags );
99
+ write_seqlock_irqsave (& mdev -> clock_lock , flags );
99
100
timecounter_read (& mdev -> clock );
100
- write_unlock_irqrestore (& mdev -> clock_lock , flags );
101
+ write_sequnlock_irqrestore (& mdev -> clock_lock , flags );
101
102
mdev -> last_overflow_check = jiffies ;
102
103
}
103
104
}
@@ -128,10 +129,10 @@ static int mlx4_en_phc_adjfreq(struct ptp_clock_info *ptp, s32 delta)
128
129
adj *= delta ;
129
130
diff = div_u64 (adj , 1000000000ULL );
130
131
131
- write_lock_irqsave (& mdev -> clock_lock , flags );
132
+ write_seqlock_irqsave (& mdev -> clock_lock , flags );
132
133
timecounter_read (& mdev -> clock );
133
134
mdev -> cycles .mult = neg_adj ? mult - diff : mult + diff ;
134
- write_unlock_irqrestore (& mdev -> clock_lock , flags );
135
+ write_sequnlock_irqrestore (& mdev -> clock_lock , flags );
135
136
136
137
return 0 ;
137
138
}
@@ -149,9 +150,9 @@ static int mlx4_en_phc_adjtime(struct ptp_clock_info *ptp, s64 delta)
149
150
ptp_clock_info );
150
151
unsigned long flags ;
151
152
152
- write_lock_irqsave (& mdev -> clock_lock , flags );
153
+ write_seqlock_irqsave (& mdev -> clock_lock , flags );
153
154
timecounter_adjtime (& mdev -> clock , delta );
154
- write_unlock_irqrestore (& mdev -> clock_lock , flags );
155
+ write_sequnlock_irqrestore (& mdev -> clock_lock , flags );
155
156
156
157
return 0 ;
157
158
}
@@ -172,9 +173,9 @@ static int mlx4_en_phc_gettime(struct ptp_clock_info *ptp,
172
173
unsigned long flags ;
173
174
u64 ns ;
174
175
175
- write_lock_irqsave (& mdev -> clock_lock , flags );
176
+ write_seqlock_irqsave (& mdev -> clock_lock , flags );
176
177
ns = timecounter_read (& mdev -> clock );
177
- write_unlock_irqrestore (& mdev -> clock_lock , flags );
178
+ write_sequnlock_irqrestore (& mdev -> clock_lock , flags );
178
179
179
180
* ts = ns_to_timespec64 (ns );
180
181
@@ -198,9 +199,9 @@ static int mlx4_en_phc_settime(struct ptp_clock_info *ptp,
198
199
unsigned long flags ;
199
200
200
201
/* reset the timecounter */
201
- write_lock_irqsave (& mdev -> clock_lock , flags );
202
+ write_seqlock_irqsave (& mdev -> clock_lock , flags );
202
203
timecounter_init (& mdev -> clock , & mdev -> cycles , ns );
203
- write_unlock_irqrestore (& mdev -> clock_lock , flags );
204
+ write_sequnlock_irqrestore (& mdev -> clock_lock , flags );
204
205
205
206
return 0 ;
206
207
}
@@ -266,7 +267,7 @@ void mlx4_en_init_timestamp(struct mlx4_en_dev *mdev)
266
267
if (mdev -> ptp_clock )
267
268
return ;
268
269
269
- rwlock_init (& mdev -> clock_lock );
270
+ seqlock_init (& mdev -> clock_lock );
270
271
271
272
memset (& mdev -> cycles , 0 , sizeof (mdev -> cycles ));
272
273
mdev -> cycles .read = mlx4_en_read_clock ;
@@ -276,10 +277,10 @@ void mlx4_en_init_timestamp(struct mlx4_en_dev *mdev)
276
277
clocksource_khz2mult (1000 * dev -> caps .hca_core_clock , mdev -> cycles .shift );
277
278
mdev -> nominal_c_mult = mdev -> cycles .mult ;
278
279
279
- write_lock_irqsave (& mdev -> clock_lock , flags );
280
+ write_seqlock_irqsave (& mdev -> clock_lock , flags );
280
281
timecounter_init (& mdev -> clock , & mdev -> cycles ,
281
282
ktime_to_ns (ktime_get_real ()));
282
- write_unlock_irqrestore (& mdev -> clock_lock , flags );
283
+ write_sequnlock_irqrestore (& mdev -> clock_lock , flags );
283
284
284
285
/* Calculate period in seconds to call the overflow watchdog - to make
285
286
* sure counter is checked at least once every wrap around.
0 commit comments