Received: by 10.192.165.148 with SMTP id m20csp2160460imm; Thu, 3 May 2018 11:22:35 -0700 (PDT) X-Google-Smtp-Source: AB8JxZp6HLV4RkD6yMrn63bZub7LyCoCpEwi9m5C5l6Kos2acQ3W65dDnxZOddBwb1HPDjXad/tA X-Received: by 2002:a17:902:7146:: with SMTP id u6-v6mr24468184plm.289.1525371755100; Thu, 03 May 2018 11:22:35 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1525371755; cv=none; d=google.com; s=arc-20160816; b=navCKRhDAqOaJxXbDkUZMPTM/EOUj7g/KdxCQzDLV8g6WgkP4R/e3I+ZqzByWeWze0 sYyEkJy3ZrosmEBKju/1cCoax/A/eSX6UsnBiHyYfIIBhuNN7CRY5bUjWDEUShWPdSqZ iSBm4CT2HZhxS68S7GKXBRMNBAaaWWQaG3B1BsRqvWmBrNs5q8asz/jx+7TXQ/8C2r3j 2YMBlJT74HmNvWf64laLjdR+5BCkKyjQJ8pk+Bl33ssDBGqWG/Dtsm9kcMKYUKl6WNak eFJUD5SiJUHqZCPK5Tj6UmdZrmDJFg3/86JWATJhrfo++hgE/9RzBfIwHXPxx9zKcro/ fHtw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:message-id:date:subject:cc:to:from :dkim-signature:arc-authentication-results; bh=QW0H2Sh/LQKHpXHVXcA7n0B66S3i33dhvWV5cQhuKXI=; b=0+CJq9bDgb0xHdQ8gFqp3jxbGIKvbjjWEfdTf2Y1nZ85p84CsSwvnUFzzA8t9ZuBPK Hoyx7p1k/mTiAu+WbQfd+hWc0HfzZtJ+nYz9JzlmJqfEQh/7NUzK28YypmeXgYptu5KY jwKux50M9pFBq7arbPwF2ZVTIS7nP/wCdj7MOg9aNY/dqGPqnWUBWxp6/twKueOI84ky +sZkqiSjCPT9RiRuz2pF8GkFE7rYH6auEU8D5Sm/88ehqnflrPGUOjzdK+stWPIraRD7 b4x08uTnzmLNwS7O8XSWKgAw95BlI0hrxhLWUn43eAj8SWiIaYyFX5REA22T+JDnsgbZ rvXw== ARC-Authentication-Results: i=1; mx.google.com; dkim=fail header.i=@wdc.com header.s=dkim.wdc.com header.b=hPVaRU8u; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id d65si14384356pfj.243.2018.05.03.11.22.20; Thu, 03 May 2018 11:22:35 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; dkim=fail header.i=@wdc.com header.s=dkim.wdc.com header.b=hPVaRU8u; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751425AbeECSVu (ORCPT + 99 others); Thu, 3 May 2018 14:21:50 -0400 Received: from esa5.hgst.iphmx.com ([216.71.153.144]:64709 "EHLO esa5.hgst.iphmx.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751075AbeECSVs (ORCPT ); Thu, 3 May 2018 14:21:48 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple; d=wdc.com; i=@wdc.com; q=dns/txt; s=dkim.wdc.com; t=1525371708; x=1556907708; h=from:to:cc:subject:date:message-id; bh=gJZgbkomscg37x8LvWdi3M8LCX2bsSIcNqhmV/Mewgc=; b=hPVaRU8u/xWY2WPD4DoD1n9Dj9+c1+yfjVVBbnZ0dvxg7m6JWjcHDYCl tIryxAWRFnim2+NoyCv+07S2MJ8ojDANkQuPfJv2qEJl/leIcjquOCQ3S ZexDUj6MOsWDxCckUNfb0+oqdCHzEVgKpA+TKRGqZsIKy81yjLUgOSMhI qRbkBZgnCEUSETARSjTVvY/KC2dtG/mibYSdjebmjMeSeCkDjhYdDJtKy RpbEZPT31d7cVj48PTCYjlw7sfHwcHTchpu5D4aPp97aUfdaY0H+WV7UN 9rFjcNTeFN5O2s1tLrI0fury7id/iyEltJmHDZXo1/gABaaLCW9xmt9I0 Q==; X-IronPort-AV: E=Sophos;i="5.49,359,1520870400"; d="scan'208";a="77399518" Received: from uls-op-cesaip01.wdc.com (HELO uls-op-cesaep01.wdc.com) ([199.255.45.14]) by ob1.hgst.iphmx.com with ESMTP; 04 May 2018 02:21:47 +0800 Received: from uls-op-cesaip02.wdc.com ([10.248.3.37]) by uls-op-cesaep01.wdc.com with ESMTP; 03 May 2018 11:13:41 -0700 Received: from penguito-adamm.sdcorp.global.sandisk.com ([10.11.47.13]) by uls-op-cesaip02.wdc.com with ESMTP; 03 May 2018 11:21:47 -0700 From: adam.manzanares@wdc.com To: viro@zeniv.linux.org.uk, bcrl@kvack.org Cc: linux-fsdevel@vger.kernel.org, linux-aio@kvack.org, linux-api@vger.kernel.org, linux-block@vger.kernel.org, linux-kernel@vger.kernel.org, Adam Manzanares Subject: [PATCH v2] fs: Add aio iopriority support for block_dev Date: Thu, 3 May 2018 11:21:14 -0700 Message-Id: <20180503182114.2797-1-adam.manzanares@wdc.com> X-Mailer: git-send-email 2.15.1 Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Adam Manzanares This is the per-I/O equivalent of the ioprio_set system call. When IOCB_FLAG_IOPRIO is set on the iocb aio_flags field, then we set the newly added kiocb ki_ioprio field to the value in the iocb aio_reqprio field. When a bio is created for an aio request by the block dev we set the priority value of the bio to the user supplied value. See the following link for performance implications on a SATA HDD: https://lkml.org/lkml/2016/12/6/495 Given that WRR support for NVME devices has patches floating around and it was discussed at LSFMM, we may soon have a lower latency storage device that can make use of iopriorities. A per command iopriority interface seems timely given these developments. If we want to avoid bloating struct kiocb, I suggest we turn the private field into a union of the private and ki_ioprio field. It seems like the users of the private field all use it at a point where we can yank the priority from the kiocb before the private field is used. Comments and suggestions welcome. v2: merge patches use IOCB_FLAG_IOPRIO validate intended use with IOCB_IOPRIO add linux-api and linux-block to cc Signed-off-by: Adam Manzanares --- fs/aio.c | 10 ++++++++++ fs/block_dev.c | 2 ++ include/linux/fs.h | 2 ++ include/uapi/linux/aio_abi.h | 1 + 4 files changed, 15 insertions(+) diff --git a/fs/aio.c b/fs/aio.c index 88d7927ffbc6..f36636d8ff2c 100644 --- a/fs/aio.c +++ b/fs/aio.c @@ -1597,6 +1597,16 @@ static int io_submit_one(struct kioctx *ctx, struct iocb __user *user_iocb, req->common.ki_flags |= IOCB_EVENTFD; } + if (iocb->aio_flags & IOCB_FLAG_IOPRIO) { + /* + * If the IOCB_FLAG_IOPRIO flag of aio_flags is set, then + * aio_reqprio is interpreted as an I/O scheduling + * class and priority. + */ + req->common.ki_ioprio = iocb->aio_reqprio; + req->common.ki_flags |= IOCB_IOPRIO; + } + ret = kiocb_set_rw_flags(&req->common, iocb->aio_rw_flags); if (unlikely(ret)) { pr_debug("EINVAL: aio_rw_flags\n"); diff --git a/fs/block_dev.c b/fs/block_dev.c index 7ec920e27065..970bef79caa6 100644 --- a/fs/block_dev.c +++ b/fs/block_dev.c @@ -355,6 +355,8 @@ __blkdev_direct_IO(struct kiocb *iocb, struct iov_iter *iter, int nr_pages) bio->bi_write_hint = iocb->ki_hint; bio->bi_private = dio; bio->bi_end_io = blkdev_bio_end_io; + if (iocb->ki_flags & IOCB_IOPRIO) + bio->bi_ioprio = iocb->ki_ioprio; ret = bio_iov_iter_get_pages(bio, iter); if (unlikely(ret)) { diff --git a/include/linux/fs.h b/include/linux/fs.h index 760d8da1b6c7..ab63ce720305 100644 --- a/include/linux/fs.h +++ b/include/linux/fs.h @@ -292,6 +292,7 @@ enum rw_hint { #define IOCB_SYNC (1 << 5) #define IOCB_WRITE (1 << 6) #define IOCB_NOWAIT (1 << 7) +#define IOCB_IOPRIO (1 << 8) struct kiocb { struct file *ki_filp; @@ -300,6 +301,7 @@ struct kiocb { void *private; int ki_flags; enum rw_hint ki_hint; + u16 ki_ioprio; /* See linux/ioprio.h */ } __randomize_layout; static inline bool is_sync_kiocb(struct kiocb *kiocb) diff --git a/include/uapi/linux/aio_abi.h b/include/uapi/linux/aio_abi.h index a04adbc70ddf..d4593a6062ef 100644 --- a/include/uapi/linux/aio_abi.h +++ b/include/uapi/linux/aio_abi.h @@ -54,6 +54,7 @@ enum { * is valid. */ #define IOCB_FLAG_RESFD (1 << 0) +#define IOCB_FLAG_IOPRIO (1 << 1) /* read() from /dev/aio returns these structures. */ struct io_event { -- 2.15.1