diff options
Diffstat (limited to 'drivers/infiniband/hw/hfi1/debugfs.c')
-rw-r--r-- | drivers/infiniband/hw/hfi1/debugfs.c | 14 |
1 files changed, 9 insertions, 5 deletions
diff --git a/drivers/infiniband/hw/hfi1/debugfs.c b/drivers/infiniband/hw/hfi1/debugfs.c index dbab9d9cc288..a49cc88f08a2 100644 --- a/drivers/infiniband/hw/hfi1/debugfs.c +++ b/drivers/infiniband/hw/hfi1/debugfs.c | |||
@@ -223,28 +223,32 @@ DEBUGFS_SEQ_FILE_OPEN(ctx_stats) | |||
223 | DEBUGFS_FILE_OPS(ctx_stats); | 223 | DEBUGFS_FILE_OPS(ctx_stats); |
224 | 224 | ||
225 | static void *_qp_stats_seq_start(struct seq_file *s, loff_t *pos) | 225 | static void *_qp_stats_seq_start(struct seq_file *s, loff_t *pos) |
226 | __acquires(RCU) | 226 | __acquires(RCU) |
227 | { | 227 | { |
228 | struct qp_iter *iter; | 228 | struct qp_iter *iter; |
229 | loff_t n = *pos; | 229 | loff_t n = *pos; |
230 | 230 | ||
231 | rcu_read_lock(); | ||
232 | iter = qp_iter_init(s->private); | 231 | iter = qp_iter_init(s->private); |
232 | |||
233 | /* stop calls rcu_read_unlock */ | ||
234 | rcu_read_lock(); | ||
235 | |||
233 | if (!iter) | 236 | if (!iter) |
234 | return NULL; | 237 | return NULL; |
235 | 238 | ||
236 | while (n--) { | 239 | do { |
237 | if (qp_iter_next(iter)) { | 240 | if (qp_iter_next(iter)) { |
238 | kfree(iter); | 241 | kfree(iter); |
239 | return NULL; | 242 | return NULL; |
240 | } | 243 | } |
241 | } | 244 | } while (n--); |
242 | 245 | ||
243 | return iter; | 246 | return iter; |
244 | } | 247 | } |
245 | 248 | ||
246 | static void *_qp_stats_seq_next(struct seq_file *s, void *iter_ptr, | 249 | static void *_qp_stats_seq_next(struct seq_file *s, void *iter_ptr, |
247 | loff_t *pos) | 250 | loff_t *pos) |
251 | __must_hold(RCU) | ||
248 | { | 252 | { |
249 | struct qp_iter *iter = iter_ptr; | 253 | struct qp_iter *iter = iter_ptr; |
250 | 254 | ||
@@ -259,7 +263,7 @@ static void *_qp_stats_seq_next(struct seq_file *s, void *iter_ptr, | |||
259 | } | 263 | } |
260 | 264 | ||
261 | static void _qp_stats_seq_stop(struct seq_file *s, void *iter_ptr) | 265 | static void _qp_stats_seq_stop(struct seq_file *s, void *iter_ptr) |
262 | __releases(RCU) | 266 | __releases(RCU) |
263 | { | 267 | { |
264 | rcu_read_unlock(); | 268 | rcu_read_unlock(); |
265 | } | 269 | } |