diff options
Diffstat (limited to 'drivers/infiniband/hw/qib/qib_debugfs.c')
-rw-r--r-- | drivers/infiniband/hw/qib/qib_debugfs.c | 12 |
1 files changed, 9 insertions, 3 deletions
diff --git a/drivers/infiniband/hw/qib/qib_debugfs.c b/drivers/infiniband/hw/qib/qib_debugfs.c index 5e75b43c596b..5bad8e3b40bb 100644 --- a/drivers/infiniband/hw/qib/qib_debugfs.c +++ b/drivers/infiniband/hw/qib/qib_debugfs.c | |||
@@ -189,27 +189,32 @@ static int _ctx_stats_seq_show(struct seq_file *s, void *v) | |||
189 | DEBUGFS_FILE(ctx_stats) | 189 | DEBUGFS_FILE(ctx_stats) |
190 | 190 | ||
191 | static void *_qp_stats_seq_start(struct seq_file *s, loff_t *pos) | 191 | static void *_qp_stats_seq_start(struct seq_file *s, loff_t *pos) |
192 | __acquires(RCU) | ||
192 | { | 193 | { |
193 | struct qib_qp_iter *iter; | 194 | struct qib_qp_iter *iter; |
194 | loff_t n = *pos; | 195 | loff_t n = *pos; |
195 | 196 | ||
196 | rcu_read_lock(); | ||
197 | iter = qib_qp_iter_init(s->private); | 197 | iter = qib_qp_iter_init(s->private); |
198 | |||
199 | /* stop calls rcu_read_unlock */ | ||
200 | rcu_read_lock(); | ||
201 | |||
198 | if (!iter) | 202 | if (!iter) |
199 | return NULL; | 203 | return NULL; |
200 | 204 | ||
201 | while (n--) { | 205 | do { |
202 | if (qib_qp_iter_next(iter)) { | 206 | if (qib_qp_iter_next(iter)) { |
203 | kfree(iter); | 207 | kfree(iter); |
204 | return NULL; | 208 | return NULL; |
205 | } | 209 | } |
206 | } | 210 | } while (n--); |
207 | 211 | ||
208 | return iter; | 212 | return iter; |
209 | } | 213 | } |
210 | 214 | ||
211 | static void *_qp_stats_seq_next(struct seq_file *s, void *iter_ptr, | 215 | static void *_qp_stats_seq_next(struct seq_file *s, void *iter_ptr, |
212 | loff_t *pos) | 216 | loff_t *pos) |
217 | __must_hold(RCU) | ||
213 | { | 218 | { |
214 | struct qib_qp_iter *iter = iter_ptr; | 219 | struct qib_qp_iter *iter = iter_ptr; |
215 | 220 | ||
@@ -224,6 +229,7 @@ static void *_qp_stats_seq_next(struct seq_file *s, void *iter_ptr, | |||
224 | } | 229 | } |
225 | 230 | ||
226 | static void _qp_stats_seq_stop(struct seq_file *s, void *iter_ptr) | 231 | static void _qp_stats_seq_stop(struct seq_file *s, void *iter_ptr) |
232 | __releases(RCU) | ||
227 | { | 233 | { |
228 | rcu_read_unlock(); | 234 | rcu_read_unlock(); |
229 | } | 235 | } |