@@ -91,8 +91,9 @@ static inline void __record_iostat_latency(struct f2fs_sb_info *sbi)
91
91
unsigned int cnt ;
92
92
struct f2fs_iostat_latency iostat_lat [MAX_IO_TYPE ][NR_PAGE_TYPE ];
93
93
struct iostat_lat_info * io_lat = sbi -> iostat_io_lat ;
94
+ unsigned long flags ;
94
95
95
- spin_lock_bh (& sbi -> iostat_lat_lock );
96
+ spin_lock_irqsave (& sbi -> iostat_lat_lock , flags );
96
97
for (idx = 0 ; idx < MAX_IO_TYPE ; idx ++ ) {
97
98
for (io = 0 ; io < NR_PAGE_TYPE ; io ++ ) {
98
99
cnt = io_lat -> bio_cnt [idx ][io ];
@@ -106,7 +107,7 @@ static inline void __record_iostat_latency(struct f2fs_sb_info *sbi)
106
107
io_lat -> bio_cnt [idx ][io ] = 0 ;
107
108
}
108
109
}
109
- spin_unlock_bh (& sbi -> iostat_lat_lock );
110
+ spin_unlock_irqrestore (& sbi -> iostat_lat_lock , flags );
110
111
111
112
trace_f2fs_iostat_latency (sbi , iostat_lat );
112
113
}
@@ -115,14 +116,15 @@ static inline void f2fs_record_iostat(struct f2fs_sb_info *sbi)
115
116
{
116
117
unsigned long long iostat_diff [NR_IO_TYPE ];
117
118
int i ;
119
+ unsigned long flags ;
118
120
119
121
if (time_is_after_jiffies (sbi -> iostat_next_period ))
120
122
return ;
121
123
122
124
/* Need double check under the lock */
123
- spin_lock_bh (& sbi -> iostat_lock );
125
+ spin_lock_irqsave (& sbi -> iostat_lock , flags );
124
126
if (time_is_after_jiffies (sbi -> iostat_next_period )) {
125
- spin_unlock_bh (& sbi -> iostat_lock );
127
+ spin_unlock_irqrestore (& sbi -> iostat_lock , flags );
126
128
return ;
127
129
}
128
130
sbi -> iostat_next_period = jiffies +
@@ -133,7 +135,7 @@ static inline void f2fs_record_iostat(struct f2fs_sb_info *sbi)
133
135
sbi -> prev_rw_iostat [i ];
134
136
sbi -> prev_rw_iostat [i ] = sbi -> rw_iostat [i ];
135
137
}
136
- spin_unlock_bh (& sbi -> iostat_lock );
138
+ spin_unlock_irqrestore (& sbi -> iostat_lock , flags );
137
139
138
140
trace_f2fs_iostat (sbi , iostat_diff );
139
141
@@ -145,25 +147,27 @@ void f2fs_reset_iostat(struct f2fs_sb_info *sbi)
145
147
struct iostat_lat_info * io_lat = sbi -> iostat_io_lat ;
146
148
int i ;
147
149
148
- spin_lock_bh (& sbi -> iostat_lock );
150
+ spin_lock_irq (& sbi -> iostat_lock );
149
151
for (i = 0 ; i < NR_IO_TYPE ; i ++ ) {
150
152
sbi -> rw_iostat [i ] = 0 ;
151
153
sbi -> prev_rw_iostat [i ] = 0 ;
152
154
}
153
- spin_unlock_bh (& sbi -> iostat_lock );
155
+ spin_unlock_irq (& sbi -> iostat_lock );
154
156
155
- spin_lock_bh (& sbi -> iostat_lat_lock );
157
+ spin_lock_irq (& sbi -> iostat_lat_lock );
156
158
memset (io_lat , 0 , sizeof (struct iostat_lat_info ));
157
- spin_unlock_bh (& sbi -> iostat_lat_lock );
159
+ spin_unlock_irq (& sbi -> iostat_lat_lock );
158
160
}
159
161
160
162
void f2fs_update_iostat (struct f2fs_sb_info * sbi ,
161
163
enum iostat_type type , unsigned long long io_bytes )
162
164
{
165
+ unsigned long flags ;
166
+
163
167
if (!sbi -> iostat_enable )
164
168
return ;
165
169
166
- spin_lock_bh (& sbi -> iostat_lock );
170
+ spin_lock_irqsave (& sbi -> iostat_lock , flags );
167
171
sbi -> rw_iostat [type ] += io_bytes ;
168
172
169
173
if (type == APP_BUFFERED_IO || type == APP_DIRECT_IO )
@@ -172,7 +176,7 @@ void f2fs_update_iostat(struct f2fs_sb_info *sbi,
172
176
if (type == APP_BUFFERED_READ_IO || type == APP_DIRECT_READ_IO )
173
177
sbi -> rw_iostat [APP_READ_IO ] += io_bytes ;
174
178
175
- spin_unlock_bh (& sbi -> iostat_lock );
179
+ spin_unlock_irqrestore (& sbi -> iostat_lock , flags );
176
180
177
181
f2fs_record_iostat (sbi );
178
182
}
@@ -185,6 +189,7 @@ static inline void __update_iostat_latency(struct bio_iostat_ctx *iostat_ctx,
185
189
struct f2fs_sb_info * sbi = iostat_ctx -> sbi ;
186
190
struct iostat_lat_info * io_lat = sbi -> iostat_io_lat ;
187
191
int idx ;
192
+ unsigned long flags ;
188
193
189
194
if (!sbi -> iostat_enable )
190
195
return ;
@@ -202,12 +207,12 @@ static inline void __update_iostat_latency(struct bio_iostat_ctx *iostat_ctx,
202
207
idx = WRITE_ASYNC_IO ;
203
208
}
204
209
205
- spin_lock_bh (& sbi -> iostat_lat_lock );
210
+ spin_lock_irqsave (& sbi -> iostat_lat_lock , flags );
206
211
io_lat -> sum_lat [idx ][iotype ] += ts_diff ;
207
212
io_lat -> bio_cnt [idx ][iotype ]++ ;
208
213
if (ts_diff > io_lat -> peak_lat [idx ][iotype ])
209
214
io_lat -> peak_lat [idx ][iotype ] = ts_diff ;
210
- spin_unlock_bh (& sbi -> iostat_lat_lock );
215
+ spin_unlock_irqrestore (& sbi -> iostat_lat_lock , flags );
211
216
}
212
217
213
218
void iostat_update_and_unbind_ctx (struct bio * bio , int rw )
0 commit comments