Lines Matching defs:fio
75 flash_io_getblock(struct flash_io *fio, struct buf *bp)
80 block = bp->b_rawblkno * DEV_BSIZE / fio->fio_if->erasesize;
84 / fio->fio_if->erasesize;
99 flash_sync_thread_init(struct flash_io *fio, device_t dev,
106 fio->fio_dev = dev;
107 fio->fio_if = flash_if;
109 fio->fio_data = kmem_alloc(fio->fio_if->erasesize, KM_SLEEP);
111 mutex_init(&fio->fio_lock, MUTEX_DEFAULT, IPL_NONE);
112 cv_init(&fio->fio_cv, "flashcv");
114 error = bufq_alloc(&fio->fio_bufq, "fcfs", BUFQ_SORT_RAWBLOCK);
118 fio->fio_exiting = false;
119 fio->fio_write_pending = false;
123 NULL, flash_sync_thread, fio, &fio->fio_thread, "flashio");
128 bufq_free(fio->fio_bufq);
130 cv_destroy(&fio->fio_cv);
131 mutex_destroy(&fio->fio_lock);
132 kmem_free(fio->fio_data, fio->fio_if->erasesize);
138 flash_sync_thread_destroy(struct flash_io *fio)
142 mutex_enter(&fio->fio_lock);
144 fio->fio_exiting = true;
145 cv_broadcast(&fio->fio_cv);
147 mutex_exit(&fio->fio_lock);
149 kthread_join(fio->fio_thread);
151 kmem_free(fio->fio_data, fio->fio_if->erasesize);
152 bufq_free(fio->fio_bufq);
153 mutex_destroy(&fio->fio_lock);
154 cv_destroy(&fio->fio_cv);
158 flash_io_submit(struct flash_io *fio, struct buf *bp)
162 if (__predict_false(fio->fio_exiting)) {
163 flash_io_done(fio, bp, ENODEV);
170 mutex_enter(&fio->fio_lock);
171 if (fio->fio_write_pending)
172 flash_io_cache_sync(fio);
173 mutex_exit(&fio->fio_lock);
175 flash_io_read(fio, bp);
179 flash_io_write(fio, bp);
185 flash_io_cache_write(struct flash_io *fio, flash_addr_t block, struct buf *bp)
191 KASSERT(mutex_owned(&fio->fio_lock));
192 KASSERT(fio->fio_if->erasesize != 0);
194 base = block * fio->fio_if->erasesize;
199 if (!fio->fio_write_pending) {
200 fio->fio_block = block;
206 error = fio->fio_if->read(fio->fio_dev,
207 base, fio->fio_if->erasesize,
208 &retlen, fio->fio_data);
214 fio->fio_write_pending = true;
216 binuptime(&fio->fio_creation);
219 memcpy(fio->fio_data + offset, bp->b_data, bp->b_resid);
220 bufq_put(fio->fio_bufq, bp);
223 binuptime(&fio->fio_last_write);
229 flash_io_cache_sync(struct flash_io *fio)
237 KASSERT(mutex_owned(&fio->fio_lock));
239 if (!fio->fio_write_pending) {
244 base = fio->fio_block * fio->fio_if->erasesize;
248 ei.ei_len = fio->fio_if->erasesize;
250 error = fio->fio_if->erase(fio->fio_dev, &ei);
253 aprint_error_dev(fio->fio_dev, "cannot erase flash flash!\n");
258 fio->fio_if->erasesize, (uintmax_t )base));
260 error = fio->fio_if->write(fio->fio_dev,
261 base, fio->fio_if->erasesize, &retlen, fio->fio_data);
263 if (error || retlen != fio->fio_if->erasesize) {
264 aprint_error_dev(fio->fio_dev, "can't sync write cache: %d\n", error);
269 while ((bp = bufq_get(fio->fio_bufq)) != NULL)
270 flash_io_done(fio, bp, error);
272 fio->fio_block = -1;
273 fio->fio_write_pending = false;
279 struct flash_io *fio = arg;
282 mutex_enter(&fio->fio_lock);
284 while (!fio->fio_exiting) {
285 cv_timedwait_sig(&fio->fio_cv, &fio->fio_lock, hz / 4);
286 if (!fio->fio_write_pending) {
293 if (flash_timestamp_diff(&now, &fio->fio_last_write) > hz / 5) {
295 flash_io_cache_sync(fio);
296 } else if (flash_timestamp_diff(&now, &fio->fio_creation)
298 aprint_error_dev(fio->fio_dev,
300 flash_io_cache_sync(fio);
304 mutex_exit(&fio->fio_lock);
310 flash_io_read(struct flash_io *fio, struct buf *bp)
320 error = fio->fio_if->read(fio->fio_dev, offset, bp->b_resid,
323 flash_io_done(fio, bp, error);
327 flash_io_write(struct flash_io *fio, struct buf *bp)
333 block = flash_io_getblock(fio, bp);
336 mutex_enter(&fio->fio_lock);
338 if (fio->fio_write_pending && fio->fio_block != block) {
340 flash_io_cache_sync(fio);
343 flash_io_cache_write(fio, block, bp);
345 mutex_exit(&fio->fio_lock);
349 flash_io_done(struct flash_io *fio, struct buf *bp, int error)