mirror of
https://github.com/Fishwaldo/Star64_linux.git
synced 2025-07-23 07:12:09 +00:00
for-linus-20190726
-----BEGIN PGP SIGNATURE----- iQJEBAABCAAuFiEEwPw5LcreJtl1+l5K99NY+ylx4KYFAl07DGAQHGF4Ym9lQGtl cm5lbC5kawAKCRD301j7KXHgplf5EADOOvOdsz9N/Iw8ZHHHJXCqKR26zZv75G1z 0h1PGC7p0JZQbYFo0Zo7mjiRBGlg6tlXc2d4Gyl94XJKDwjeYTcFDvbvERdYa+MH d2RiFkAfR967Ri4fb+FP5L3mYOQdMJ/zk0xCDHLv/DcxeFLa5a9EJS1+vBSR+AcB 0JpJWuHypGqGmbTaL0z9q2pmx0mgA1ERlWQtkMLrsEr2Vqg/rrjGwe2bGFY00lXc vKtFkpfugKc4zVAPSzC1YZgojfDDpGNEA4QMtxMsEH4hqyMpHhrtUedNY5QrjC0B p9h6aPXXYr2KhGP0grrEytzaYUOzK2crK5h+q+1vu6nOgx2EgmnLM9tBu/LuRH1j uUzKJOa3/AE+bU7uZEsaUerTBsHrgEBa1x8G92obYRnjgW3aCD2CaSbjjBhNxTZ4 1dXyr0DTHFXZmfcfWja5tO26JTPzjwVOrwiRyU0S727UsdVJupoHiYLr5fwaDfgn /Du2I/XWvFtflm5i0ND0sdcX1yRlFiGZ9e45z1QFaFmcteKKWzRBDlC6mQzI/lw3 oc583mhDR3tRtJxow+wn6AuMUehFRh8wj0UhL/MEMjLW8GiqXU5aRtanT+22Xz4L saNDQieeEnV7raMYXMP0qIhkJtrNASmJQos+MOJAEGOWcS2ePIUUio2kSXie+071 BphJd2RamQ== =HIzH -----END PGP SIGNATURE----- Merge tag 'for-linus-20190726' of git://git.kernel.dk/linux-block Pull block fixes from Jens Axboe: - Several io_uring fixes/improvements: - Blocking fix for O_DIRECT (me) - Latter page slowness for registered buffers (me) - Fix poll hang under certain conditions (me) - Defer sequence check fix for wrapped rings (Zhengyuan) - Mismatch in async inc/dec accounting (Zhengyuan) - Memory ordering issue that could cause stall (Zhengyuan) - Track sequential defer in bytes, not pages (Zhengyuan) - NVMe pull request from Christoph - Set of hang fixes for wbt (Josef) - Redundant error message kill for libahci (Ding) - Remove unused blk_mq_sched_started_request() and related ops (Marcos) - drbd dynamic alloc shash descriptor to reduce stack use (Arnd) - blkcg ->pd_stat() non-debug print (Tejun) - bcache memory leak fix (Wei) - Comment fix (Akinobu) - BFQ perf regression fix (Paolo) * tag 'for-linus-20190726' of git://git.kernel.dk/linux-block: (24 commits) io_uring: ensure ->list is initialized for poll commands Revert "nvme-pci: don't create a read hctx mapping without read queues" nvme: fix multipath crash when ANA is deactivated nvme: fix memory leak caused by incorrect subsystem free nvme: ignore subnqn for ADATA SX6000LNP drbd: dynamically allocate shash descriptor block: blk-mq: Remove blk_mq_sched_started_request and started_request bcache: fix possible memory leak in bch_cached_dev_run() io_uring: track io length in async_list based on bytes io_uring: don't use iov_iter_advance() for fixed buffers block: properly handle IOCB_NOWAIT for async O_DIRECT IO blk-mq: allow REQ_NOWAIT to return an error inline io_uring: add a memory barrier before atomic_read rq-qos: use a mb for got_token rq-qos: set ourself TASK_UNINTERRUPTIBLE after we schedule rq-qos: don't reset has_sleepers on spurious wakeups rq-qos: fix missed wake-ups in rq_qos_throttle wait: add wq_has_single_sleeper helper block, bfq: check also in-flight I/O in dispatch plugging block: fix sysfs module parameters directory path in comment ...
This commit is contained in:
commit
0441281965
20 changed files with 224 additions and 92 deletions
|
@ -202,7 +202,7 @@ struct async_list {
|
|||
|
||||
struct file *file;
|
||||
off_t io_end;
|
||||
size_t io_pages;
|
||||
size_t io_len;
|
||||
};
|
||||
|
||||
struct io_ring_ctx {
|
||||
|
@ -333,7 +333,8 @@ struct io_kiocb {
|
|||
#define REQ_F_IO_DRAIN 16 /* drain existing IO first */
|
||||
#define REQ_F_IO_DRAINED 32 /* drain done */
|
||||
#define REQ_F_LINK 64 /* linked sqes */
|
||||
#define REQ_F_FAIL_LINK 128 /* fail rest of links */
|
||||
#define REQ_F_LINK_DONE 128 /* linked sqes done */
|
||||
#define REQ_F_FAIL_LINK 256 /* fail rest of links */
|
||||
u64 user_data;
|
||||
u32 result;
|
||||
u32 sequence;
|
||||
|
@ -429,7 +430,7 @@ static inline bool io_sequence_defer(struct io_ring_ctx *ctx,
|
|||
if ((req->flags & (REQ_F_IO_DRAIN|REQ_F_IO_DRAINED)) != REQ_F_IO_DRAIN)
|
||||
return false;
|
||||
|
||||
return req->sequence > ctx->cached_cq_tail + ctx->sq_ring->dropped;
|
||||
return req->sequence != ctx->cached_cq_tail + ctx->sq_ring->dropped;
|
||||
}
|
||||
|
||||
static struct io_kiocb *io_get_deferred_req(struct io_ring_ctx *ctx)
|
||||
|
@ -632,6 +633,7 @@ static void io_req_link_next(struct io_kiocb *req)
|
|||
nxt->flags |= REQ_F_LINK;
|
||||
}
|
||||
|
||||
nxt->flags |= REQ_F_LINK_DONE;
|
||||
INIT_WORK(&nxt->work, io_sq_wq_submit_work);
|
||||
queue_work(req->ctx->sqo_wq, &nxt->work);
|
||||
}
|
||||
|
@ -1064,8 +1066,44 @@ static int io_import_fixed(struct io_ring_ctx *ctx, int rw,
|
|||
*/
|
||||
offset = buf_addr - imu->ubuf;
|
||||
iov_iter_bvec(iter, rw, imu->bvec, imu->nr_bvecs, offset + len);
|
||||
if (offset)
|
||||
iov_iter_advance(iter, offset);
|
||||
|
||||
if (offset) {
|
||||
/*
|
||||
* Don't use iov_iter_advance() here, as it's really slow for
|
||||
* using the latter parts of a big fixed buffer - it iterates
|
||||
* over each segment manually. We can cheat a bit here, because
|
||||
* we know that:
|
||||
*
|
||||
* 1) it's a BVEC iter, we set it up
|
||||
* 2) all bvecs are PAGE_SIZE in size, except potentially the
|
||||
* first and last bvec
|
||||
*
|
||||
* So just find our index, and adjust the iterator afterwards.
|
||||
* If the offset is within the first bvec (or the whole first
|
||||
* bvec, just use iov_iter_advance(). This makes it easier
|
||||
* since we can just skip the first segment, which may not
|
||||
* be PAGE_SIZE aligned.
|
||||
*/
|
||||
const struct bio_vec *bvec = imu->bvec;
|
||||
|
||||
if (offset <= bvec->bv_len) {
|
||||
iov_iter_advance(iter, offset);
|
||||
} else {
|
||||
unsigned long seg_skip;
|
||||
|
||||
/* skip first vec */
|
||||
offset -= bvec->bv_len;
|
||||
seg_skip = 1 + (offset >> PAGE_SHIFT);
|
||||
|
||||
iter->bvec = bvec + seg_skip;
|
||||
iter->nr_segs -= seg_skip;
|
||||
iter->count -= (seg_skip << PAGE_SHIFT);
|
||||
iter->iov_offset = offset & ~PAGE_MASK;
|
||||
if (iter->iov_offset)
|
||||
iter->count -= iter->iov_offset;
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -1120,28 +1158,26 @@ static void io_async_list_note(int rw, struct io_kiocb *req, size_t len)
|
|||
off_t io_end = kiocb->ki_pos + len;
|
||||
|
||||
if (filp == async_list->file && kiocb->ki_pos == async_list->io_end) {
|
||||
unsigned long max_pages;
|
||||
unsigned long max_bytes;
|
||||
|
||||
/* Use 8x RA size as a decent limiter for both reads/writes */
|
||||
max_pages = filp->f_ra.ra_pages;
|
||||
if (!max_pages)
|
||||
max_pages = VM_READAHEAD_PAGES;
|
||||
max_pages *= 8;
|
||||
max_bytes = filp->f_ra.ra_pages << (PAGE_SHIFT + 3);
|
||||
if (!max_bytes)
|
||||
max_bytes = VM_READAHEAD_PAGES << (PAGE_SHIFT + 3);
|
||||
|
||||
/* If max pages are exceeded, reset the state */
|
||||
len >>= PAGE_SHIFT;
|
||||
if (async_list->io_pages + len <= max_pages) {
|
||||
/* If max len are exceeded, reset the state */
|
||||
if (async_list->io_len + len <= max_bytes) {
|
||||
req->flags |= REQ_F_SEQ_PREV;
|
||||
async_list->io_pages += len;
|
||||
async_list->io_len += len;
|
||||
} else {
|
||||
io_end = 0;
|
||||
async_list->io_pages = 0;
|
||||
async_list->io_len = 0;
|
||||
}
|
||||
}
|
||||
|
||||
/* New file? Reset state. */
|
||||
if (async_list->file != filp) {
|
||||
async_list->io_pages = 0;
|
||||
async_list->io_len = 0;
|
||||
async_list->file = filp;
|
||||
}
|
||||
async_list->io_end = io_end;
|
||||
|
@ -1630,6 +1666,8 @@ static int io_poll_add(struct io_kiocb *req, const struct io_uring_sqe *sqe)
|
|||
INIT_LIST_HEAD(&poll->wait.entry);
|
||||
init_waitqueue_func_entry(&poll->wait, io_poll_wake);
|
||||
|
||||
INIT_LIST_HEAD(&req->list);
|
||||
|
||||
mask = vfs_poll(poll->file, &ipt.pt) & poll->events;
|
||||
|
||||
spin_lock_irq(&ctx->completion_lock);
|
||||
|
@ -1844,6 +1882,10 @@ restart:
|
|||
/* async context always use a copy of the sqe */
|
||||
kfree(sqe);
|
||||
|
||||
/* req from defer and link list needn't decrease async cnt */
|
||||
if (req->flags & (REQ_F_IO_DRAINED | REQ_F_LINK_DONE))
|
||||
goto out;
|
||||
|
||||
if (!async_list)
|
||||
break;
|
||||
if (!list_empty(&req_list)) {
|
||||
|
@ -1891,6 +1933,7 @@ restart:
|
|||
}
|
||||
}
|
||||
|
||||
out:
|
||||
if (cur_mm) {
|
||||
set_fs(old_fs);
|
||||
unuse_mm(cur_mm);
|
||||
|
@ -1917,6 +1960,10 @@ static bool io_add_to_prev_work(struct async_list *list, struct io_kiocb *req)
|
|||
ret = true;
|
||||
spin_lock(&list->lock);
|
||||
list_add_tail(&req->list, &list->list);
|
||||
/*
|
||||
* Ensure we see a simultaneous modification from io_sq_wq_submit_work()
|
||||
*/
|
||||
smp_mb();
|
||||
if (!atomic_read(&list->cnt)) {
|
||||
list_del_init(&req->list);
|
||||
ret = false;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue