EIO with io_uring O_DIRECT writes on ext4

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hi,
io_uring O_DIRECT writes can fail with EIO on ext4.  Please see the
function graph trace from Linux 5.3.0-rc1 below for details.  It was
produced with the following qemu-io command (using Aarushi's QEMU
patches from https://github.com/rooshm/qemu/commits/io_uring):

  $ qemu-io --cache=none --aio=io_uring --format=qcow2 -c 'writev -P 185 131072 65536' tests/qemu-iotests/scratch/test.qcow2

This issue is specific to ext4.  XFS and the underlying LVM logical
volume both work.

The storage configuration is an LVM logical volume (device-mapper linear
target), on top of LUKS, on top of a SATA disk.  The logical volume's
request_queue does not have mq_ops and this causes
generic_make_request_checks() to fail:

  if ((bio->bi_opf & REQ_NOWAIT) && !queue_is_mq(q))
          goto not_supported;

I guess this could be worked around by deferring the request to the
io_uring work queue to avoid REQ_NOWAIT.  But XFS handles this fine so
how can io_uring.c detect this case cleanly or is there a bug in ext4?

Stefan
---

 2)               |  __x64_sys_io_uring_enter() {
 2)               |    __fdget() {
 2)               |      __fget_light() {
 2)   0.207 us    |        __fget();
 2)   0.683 us    |      }
 2)   1.097 us    |    }
 2)               |    mutex_lock() {
 2)               |      _cond_resched() {
 2)               |        rcu_note_context_switch() {
 2)   0.233 us    |          rcu_qs();
 2)   0.700 us    |        }
 2)   0.235 us    |        _raw_spin_lock();
 2)   0.258 us    |        update_rq_clock();
 2)               |        pick_next_task_fair() {
 2)               |          update_curr() {
 2)   0.240 us    |            __calc_delta();
 2)   0.262 us    |            update_min_vruntime();
 2)   1.240 us    |          }
 2)   0.227 us    |          check_cfs_rq_runtime();
 2)               |          pick_next_entity() {
 2)   0.235 us    |            wakeup_preempt_entity.isra.0();
 2)   0.274 us    |            clear_buddies();
 2)   1.218 us    |          }
 2)               |          put_prev_entity() {
 2)               |            update_curr() {
 2)   0.222 us    |              update_min_vruntime();
 2)   0.226 us    |              cpuacct_charge();
 2)               |              __cgroup_account_cputime() {
 2)   0.226 us    |                cgroup_rstat_updated();
 2)   0.672 us    |              }
 2)   2.021 us    |            }
 2)   0.225 us    |            check_cfs_rq_runtime();
 2)   0.242 us    |            __enqueue_entity();
 2)   0.209 us    |            __update_load_avg_se();
 2)   0.183 us    |            __update_load_avg_cfs_rq();
 2)   4.119 us    |          }
 2)               |          put_prev_entity() {
 2)   0.235 us    |            update_curr();
 2)   0.237 us    |            check_cfs_rq_runtime();
 2)   0.274 us    |            __enqueue_entity();
 2)   0.246 us    |            __update_load_avg_se();
 2)   0.220 us    |            __update_load_avg_cfs_rq();
 2)   2.550 us    |          }
 2)               |          set_next_entity() {
 2)   0.266 us    |            __update_load_avg_se();
 2)   0.223 us    |            __update_load_avg_cfs_rq();
 2)   1.263 us    |          }
 2) + 12.628 us   |        }
 2)   0.237 us    |        enter_lazy_tlb();
 2)   0.277 us    |        finish_task_switch();
 2) + 25.560 us   |      }
 2) + 26.057 us   |    }
 2)               |    io_ring_submit() {
 2)   0.280 us    |      io_get_sqring.isra.0();
 2)               |      io_submit_sqe() {
 2)               |        kmem_cache_alloc() {
 2)               |          _cond_resched() {
 2)   0.230 us    |            rcu_all_qs();
 2)   0.697 us    |          }
 2)   0.226 us    |          should_failslab();
 2)   0.209 us    |          memcg_kmem_put_cache();
 2)   2.141 us    |        }
 2)               |        fget() {
 2)   0.263 us    |          __fget();
 2)   0.705 us    |        }
 2)               |        io_queue_sqe() {
 2)               |          __io_submit_sqe() {
 2)               |            io_write() {
 2)   0.303 us    |              io_prep_rw();
 2)               |              io_import_iovec.isra.0() {
 2)               |                rw_copy_check_uvector() {
 2)               |                  __check_object_size() {
 2)   0.255 us    |                    check_stack_object();
 2)   0.708 us    |                  }
 2)   1.296 us    |                }
 2)   1.854 us    |              }
 2)               |              rw_verify_area() {
 2)               |                security_file_permission() {
 2)               |                  selinux_file_permission() {
 2)               |                    __inode_security_revalidate() {
 2)               |                      _cond_resched() {
 2)   0.219 us    |                        rcu_all_qs();
 2)   0.666 us    |                      }
 2)   1.143 us    |                    }
 2)   0.207 us    |                    avc_policy_seqno();
 2)   2.090 us    |                  }
 2)   2.759 us    |                }
 2)   3.161 us    |              }
 2)               |              __sb_start_write() {
 2)               |                _cond_resched() {
 2)   0.223 us    |                  rcu_all_qs();
 2)   0.662 us    |                }
 2)   1.195 us    |              }
 2)               |              ext4_file_write_iter() {
 2)   0.221 us    |                down_write_trylock();
 2)               |                ext4_write_checks() {
 2)   0.238 us    |                  generic_write_check_limits.isra.0();
 2)   0.739 us    |                }
 2)               |                ext4_map_blocks() {
 2)               |                  ext4_es_lookup_extent() {
 2)   0.231 us    |                    _raw_read_lock();
 2)   0.728 us    |                  }
 2)               |                  __check_block_validity.constprop.0() {
 2)   0.294 us    |                    ext4_data_block_valid();
 2)   0.796 us    |                  }
 2)   2.211 us    |                }
 2)               |                __generic_file_write_iter() {
 2)   0.225 us    |                  file_remove_privs();
 2)               |                  file_update_time() {
 2)               |                    current_time() {
 2)   0.225 us    |                      ktime_get_coarse_real_ts64();
 2)   0.244 us    |                      timespec64_trunc();
 2)   1.155 us    |                    }
 2)   0.307 us    |                    __mnt_want_write_file();
 2)               |                    generic_update_time() {
 2)               |                      __mark_inode_dirty() {
 2)               |                        ext4_dirty_inode() {
 2)               |                          __ext4_journal_start_sb() {
 2)               |                            ext4_journal_check_start() {
 2)               |                              _cond_resched() {
 2)   9.606 us    |                                rcu_all_qs();
 2) + 10.042 us   |                              }
 2) + 10.507 us   |                            }
 2)               |                            jbd2__journal_start() {
 2)               |                              kmem_cache_alloc() {
 2)               |                                _cond_resched() {
 2)   0.208 us    |                                  rcu_all_qs();
 2)   0.608 us    |                                }
 2)   0.207 us    |                                should_failslab();
 2)   0.257 us    |                                memcg_kmem_put_cache();
 2)   2.063 us    |                              }
 2)               |                              start_this_handle() {
 2)   0.218 us    |                                _raw_read_lock();
 2)   0.248 us    |                                add_transaction_credits();
 2)   1.308 us    |                              }
 2)   4.047 us    |                            }
 2) + 15.251 us   |                          }
 2)               |                          ext4_mark_inode_dirty() {
 2)               |                            _cond_resched() {
 2)   0.194 us    |                              rcu_all_qs();
 2)   0.616 us    |                            }
 2)               |                            ext4_reserve_inode_write() {
 2)               |                              __ext4_get_inode_loc() {
 2)   0.325 us    |                                ext4_get_group_desc();
 2)   0.238 us    |                                ext4_inode_table();
 2)               |                                __getblk_gfp() {
 2)               |                                  __find_get_block() {
 2)   0.265 us    |                                    mark_page_accessed();
 2)   1.071 us    |                                  } /* __find_get_block */
 2)               |                                  _cond_resched() {
 2)   0.211 us    |                                    rcu_all_qs();
 2)   0.643 us    |                                  }
 2)   2.560 us    |                                }
 2)   4.076 us    |                              }
 2)               |                              __ext4_journal_get_write_access() {
 2)               |                                _cond_resched() {
 2)   0.174 us    |                                  rcu_all_qs();
 2)   0.609 us    |                                }
 2)               |                                jbd2_journal_get_write_access() {
 2)   0.259 us    |                                  jbd2_write_access_granted();
 2)   0.695 us    |                                }
 2)   1.937 us    |                              }
 2)   6.681 us    |                            }
 2)               |                            ext4_mark_iloc_dirty() {
 2)   0.205 us    |                              _raw_spin_lock();
 2)               |                              from_kuid() {
 2)   0.196 us    |                                map_id_up();
 2)   0.604 us    |                              }
 2)               |                              from_kgid() {
 2)   0.223 us    |                                map_id_up();
 2)   0.641 us    |                              }
 2)               |                              from_kprojid() {
 2)   0.221 us    |                                map_id_up();
 2)   0.644 us    |                              }
 2)               |                              ext4_inode_csum_set() {
 2)               |                                ext4_inode_csum.isra.0() {
 2)               |                                  crypto_shash_update() {
 2)   0.309 us    |                                    crc32c_pcl_intel_update [crc32c_intel]();
 2)   0.956 us    |                                  }
 2)               |                                  crypto_shash_update() {
 2)   0.250 us    |                                    crc32c_pcl_intel_update [crc32c_intel]();
 2)   0.692 us    |                                  }
 2)               |                                  crypto_shash_update() {
 2)   0.244 us    |                                    crc32c_pcl_intel_update [crc32c_intel]();
 2)   0.662 us    |                                  }
 2)               |                                  crypto_shash_update() {
 2)   0.172 us    |                                    crc32c_pcl_intel_update [crc32c_intel]();
 2)   0.562 us    |                                  }
 2)               |                                  crypto_shash_update() {
 2)   0.223 us    |                                    crc32c_pcl_intel_update [crc32c_intel]();
 2)   0.658 us    |                                  }
 2)               |                                  crypto_shash_update() {
 2)   0.236 us    |                                    crc32c_pcl_intel_update [crc32c_intel]();
 2)   0.681 us    |                                  }
 2)   5.786 us    |                                }
 2)   6.383 us    |                              }
 2)               |                              __ext4_handle_dirty_metadata() {
 2)               |                                _cond_resched() {
 2)   0.220 us    |                                  rcu_all_qs();
 2)   0.649 us    |                                }
 2)   0.250 us    |                                jbd2_journal_dirty_metadata();
 2)   1.576 us    |                              }
 2)   0.208 us    |                              __brelse();
 2) + 12.384 us   |                            }
 2) + 20.577 us   |                          }
 2)               |                          __ext4_journal_stop() {
 2)               |                            jbd2_journal_stop() {
 2)               |                              __wake_up() {
 2)               |                                __wake_up_common_lock() {
 2)   0.222 us    |                                  _raw_spin_lock_irqsave();
 2)   0.218 us    |                                  __wake_up_common();
 2)   0.216 us    |                                  _raw_spin_unlock_irqrestore();
 2)   1.485 us    |                                }
 2)   1.902 us    |                              }
 2)   0.347 us    |                              kmem_cache_free();
 2)   3.030 us    |                            }
 2)   3.521 us    |                          }
 2) + 40.202 us   |                        }
 2) + 40.826 us   |                      }
 2) + 41.419 us   |                    }
 2)   0.204 us    |                    __mnt_drop_write_file();
 2) + 44.224 us   |                  }
 2)               |                  generic_file_direct_write() {
 2)   0.337 us    |                    filemap_range_has_page();
 2)   0.336 us    |                    invalidate_inode_pages2_range();
 2)               |                    ext4_direct_IO() {
 2)               |                      __blockdev_direct_IO() {
 2)               |                        kmem_cache_alloc() {
 2)               |                          _cond_resched() {
 2)   0.210 us    |                            rcu_all_qs();
 2)   0.660 us    |                          }
 2)   0.225 us    |                          should_failslab();
 2)   0.215 us    |                          memcg_kmem_put_cache();
 2)   2.042 us    |                        }
 2)   0.229 us    |                        blk_start_plug();
 2)               |                        get_user_pages_fast() {
 2)               |                          gup_pgd_range() {
 2)   0.226 us    |                            pud_huge();
 2)   0.212 us    |                            pmd_huge();
 2)   1.862 us    |                          }
 2)   2.330 us    |                        }
 2)               |                        ext4_dio_get_block_unwritten_async() {
 2)               |                          ext4_get_block_trans() {
 2)               |                            ext4_meta_trans_blocks() {
 2)   0.231 us    |                              ext4_ext_index_trans_blocks();
 2)   0.775 us    |                            }
 2)               |                            __ext4_journal_start_sb() {
 2)               |                              ext4_journal_check_start() {
 2)               |                                _cond_resched() {
 2)   0.210 us    |                                  rcu_all_qs();
 2)   0.636 us    |                                }
 2)   1.078 us    |                              }
 2)               |                              jbd2__journal_start() {
 2)               |                                kmem_cache_alloc() {
 2)               |                                  _cond_resched() {
 2)   0.211 us    |                                    rcu_all_qs();
 2)   0.643 us    |                                  }
 2)   0.216 us    |                                  should_failslab();
 2)   0.223 us    |                                  memcg_kmem_put_cache();
 2)   1.993 us    |                                }
 2)               |                                start_this_handle() {
 2)   0.213 us    |                                  _raw_read_lock();
 2)   0.237 us    |                                  add_transaction_credits();
 2)   1.139 us    |                                }
 2)   3.808 us    |                              }
 2)   5.548 us    |                            }
 2)               |                            _ext4_get_block() {
 2)               |                              ext4_map_blocks() {
 2)               |                                ext4_es_lookup_extent() {
 2)   0.211 us    |                                  _raw_read_lock();
 2)   0.686 us    |                                }
 2)               |                                __check_block_validity.constprop.0() {
 2)   0.248 us    |                                  ext4_data_block_valid();
 2)   0.673 us    |                                }
 2)   2.023 us    |                              }
 2)   0.177 us    |                              ext4_update_bh_state();
 2)   2.809 us    |                            }
 2)               |                            __ext4_journal_stop() {
 2)               |                              jbd2_journal_stop() {
 2)               |                                __wake_up() {
 2)               |                                  __wake_up_common_lock() {
 2)   0.219 us    |                                    _raw_spin_lock_irqsave();
 2)   0.236 us    |                                    __wake_up_common();
 2)   0.226 us    |                                    _raw_spin_unlock_irqrestore();
 2)   1.539 us    |                                  }
 2)   1.950 us    |                                }
 2)   0.191 us    |                                kmem_cache_free();
 2)   2.770 us    |                              }
 2)   3.191 us    |                            }
 2) + 13.443 us   |                          }
 2) + 13.901 us   |                        }
 2)               |                        bio_alloc_bioset() {
 2)               |                          mempool_alloc() {
 2)               |                            _cond_resched() {
 2)   0.215 us    |                              rcu_all_qs();
 2)   0.655 us    |                            }
 2)               |                            mempool_alloc_slab() {
 2)               |                              kmem_cache_alloc() {
 2)   0.184 us    |                                should_failslab();
 2)   0.171 us    |                                memcg_kmem_put_cache();
 2)   0.958 us    |                              }
 2)   1.372 us    |                            }
 2)   2.724 us    |                          }
 2)   0.229 us    |                          bio_init();
 2)               |                          bvec_alloc() {
 2)               |                            kmem_cache_alloc() {
 2)   0.217 us    |                              should_failslab();
 2)   0.228 us    |                              memcg_kmem_put_cache();
 2)   1.259 us    |                            }
 2)   1.723 us    |                          }
 2)   5.627 us    |                        }
 2)               |                        bio_associate_blkg() {
 2)   0.202 us    |                          kthread_blkcg();
 2)               |                          bio_associate_blkg_from_css() {
 2)   0.313 us    |                            __bio_associate_blkg.isra.0();
 2)   0.761 us    |                          }
 2)   1.676 us    |                        }
 2)               |                        bio_add_page() {
 2)   0.220 us    |                          __bio_try_merge_page();
 2)   0.238 us    |                          __bio_add_page();
 2)   1.092 us    |                        }
 2)               |                        bio_add_page() {
 2)   0.250 us    |                          __bio_try_merge_page();
 2)   0.229 us    |                          __bio_add_page();
 2)   1.132 us    |                        }
 2)               |                        bio_add_page() {
 2)   0.174 us    |                          __bio_try_merge_page();
 2)   0.220 us    |                          __bio_add_page();
 2)   0.965 us    |                        }
 2)               |                        bio_add_page() {
 2)   0.220 us    |                          __bio_try_merge_page();
 2)   0.218 us    |                          __bio_add_page();
 2)   1.086 us    |                        }
 2)               |                        bio_add_page() {
 2)   0.218 us    |                          __bio_try_merge_page();
 2)   0.226 us    |                          __bio_add_page();
 2)   1.082 us    |                        }
 2)               |                        bio_add_page() {
 2)   0.190 us    |                          __bio_try_merge_page();
 2)   0.224 us    |                          __bio_add_page();
 2)   1.014 us    |                        }
 2)               |                        bio_add_page() {
 2)   0.218 us    |                          __bio_try_merge_page();
 2)   0.211 us    |                          __bio_add_page();
 2)   1.066 us    |                        }
 2)               |                        bio_add_page() {
 2)   0.227 us    |                          __bio_try_merge_page();
 2)   0.213 us    |                          __bio_add_page();
 2)   1.039 us    |                        }
 2)               |                        bio_add_page() {
 2)   0.230 us    |                          __bio_try_merge_page();
 2)   0.218 us    |                          __bio_add_page();
 2)   1.073 us    |                        }
 2)               |                        bio_add_page() {
 2)   0.220 us    |                          __bio_try_merge_page();
 2)   0.211 us    |                          __bio_add_page();
 2)   1.081 us    |                        }
 2)               |                        bio_add_page() {
 2)   0.229 us    |                          __bio_try_merge_page();
 2)   0.171 us    |                          __bio_add_page();
 2)   0.996 us    |                        }
 2)               |                        bio_add_page() {
 2)   0.224 us    |                          __bio_try_merge_page();
 2)   0.218 us    |                          __bio_add_page();
 2)   1.073 us    |                        }
 2)               |                        bio_add_page() {
 2)   0.222 us    |                          __bio_try_merge_page();
 2)   0.224 us    |                          __bio_add_page();
 2)   1.091 us    |                        }
 2)               |                        bio_add_page() {
 2)   0.176 us    |                          __bio_try_merge_page();
 2)   0.224 us    |                          __bio_add_page();
 2)   1.009 us    |                        }
 2)               |                        bio_add_page() {
 2)   0.224 us    |                          __bio_try_merge_page();
 2)   0.227 us    |                          __bio_add_page();
 2)   1.105 us    |                        }
 2)               |                        bio_add_page() {
 2)   0.222 us    |                          __bio_try_merge_page();
 2)   0.221 us    |                          __bio_add_page();
 2)   1.139 us    |                        }
 2)   0.216 us    |                        _raw_spin_lock_irqsave();
 2)   0.356 us    |                        _raw_spin_unlock_irqrestore();
 2)               |                        submit_bio() {
 2)               |                          generic_make_request() {
 2)               |                            generic_make_request_checks() {
 2)               |                              _cond_resched() {
 2)   0.224 us    |                                rcu_all_qs();
 2)   0.653 us    |                              }
 2)               |                              bio_endio() {
 2)               |                                __rq_qos_done_bio() {
 2)               |                                  blkcg_iolatency_done_bio() {
 2)   0.272 us    |                                    ktime_get();
 2)   0.738 us    |                                  }
 2)   1.264 us    |                                }
 2)               |                                dio_bio_end_aio() {
 2)               |                                  dio_bio_complete() {
 2)               |                                    bio_release_pages() {
 2)   0.433 us    |                                      bio_release_pages.part.0();
 2)   0.870 us    |                                    }
 2)               |                                    bio_put() {
 2)               |                                      bio_free() {
 2)               |                                        bvec_free() {
 2)   0.237 us    |                                          kmem_cache_free();
 2)   0.696 us    |                                        } /* bvec_free */
 2)               |                                        mempool_free() {
 2)               |                                          mempool_free_slab() {
 2)   0.237 us    |                                            kmem_cache_free();
 2)   0.619 us    |                                          }
 2)   1.002 us    |                                        }
 2)   2.337 us    |                                      }
 2)   2.770 us    |                                    }
 2)   4.270 us    |                                  }
 2)   0.216 us    |                                  _raw_spin_lock_irqsave();
 2)   0.227 us    |                                  _raw_spin_unlock_irqrestore();
 2)   5.584 us    |                                }
 2)   7.567 us    |                              }
 2)   8.915 us    |                            }
 2)   9.398 us    |                          }
 2)   9.849 us    |                        }
 2)               |                        blk_finish_plug() {
 2)   0.246 us    |                          blk_flush_plug_list();
 2)   0.701 us    |                        }
 2)   0.227 us    |                        _raw_spin_lock_irqsave();
 2)   0.225 us    |                        _raw_spin_unlock_irqrestore();
 2)               |                        dio_complete() {
 2)   0.224 us    |                          ext4_end_io_dio();
 2)   0.259 us    |                          kmem_cache_free();
 2)   1.215 us    |                        }
 2) + 63.921 us   |                      }
 2)               |                      wake_up_bit() {
 2)   0.221 us    |                        __wake_up_bit();
 2)   0.703 us    |                      }
 2) + 65.463 us   |                    }
 2) + 67.271 us   |                  }
 2) ! 112.659 us  |                }
 2)   0.219 us    |                up_write();
 2) ! 117.784 us  |              }
 2)               |              io_complete_rw() {
 2)               |                kiocb_end_write.isra.0.part.0() {
 2)   0.242 us    |                  __sb_end_write();
 2)   0.723 us    |                }
 2)               |                io_cqring_add_event() {
 2)   0.221 us    |                  _raw_spin_lock_irqsave();
 2)   0.254 us    |                  io_commit_cqring();
 2)   0.215 us    |                  _raw_spin_unlock_irqrestore();
 2)   0.225 us    |                  io_cqring_ev_posted();
 2)   1.958 us    |                }
 2)   0.218 us    |                io_put_req();
 2)   3.795 us    |              }
 2)   0.219 us    |              kfree();
 2) ! 130.276 us  |            }
 2) ! 130.807 us  |          }
 2)               |          io_put_req() {
 2)               |            io_free_req() {
 2)               |              __io_free_req() {
 2)               |                fput() {
 2)   0.223 us    |                  fput_many();
 2)   0.636 us    |                }
 2)   0.230 us    |                io_ring_drop_ctx_refs();
 2)   0.242 us    |                kmem_cache_free();
 2)   1.993 us    |              }
 2)   2.376 us    |            }
 2)   2.781 us    |          }
 2) ! 134.263 us  |        }
 2) ! 138.150 us  |      }
 2) ! 139.215 us  |    }
 2)   0.230 us    |    mutex_unlock();
 2)   0.234 us    |    io_cqring_wait();
 2)   0.230 us    |    io_ring_drop_ctx_refs();
 2)               |    fput() {
 2)   0.209 us    |      fput_many();
 2)   0.617 us    |    }
 2) ! 186.975 us  |  }

Attachment: signature.asc
Description: PGP signature


[Index of Archives]     [Linux RAID]     [Linux SCSI]     [Linux ATA RAID]     [IDE]     [Linux Wireless]     [Linux Kernel]     [ATH6KL]     [Linux Bluetooth]     [Linux Netdev]     [Kernel Newbies]     [Security]     [Git]     [Netfilter]     [Bugtraq]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Device Mapper]

  Powered by Linux