From: Dmitry Monakhov <dmonlist@gmail.com>
To: Jens Axboe <axboe@fb.com>,
linux-kernel@vger.kernel.org, linux-fsdevel@vger.kernel.org
Cc: ming.l@ssi.samsung.com, david@fromorbit.com, Jens Axboe <axboe@fb.com>
Subject: Re: [PATCH 2/7] Add support for per-file stream ID
Date: Thu, 09 Apr 2015 12:30:40 +0300 [thread overview]
Message-ID: <87h9sp643j.fsf@openvz.org> (raw)
In-Reply-To: <1427296070-8472-3-git-send-email-axboe@fb.com>
[-- Attachment #1: Type: text/plain, Size: 5306 bytes --]
Jens Axboe <axboe@fb.com> writes:
One small question.
You states that all IDs are equals but can we reserve some IDs
for internal kernel purposes. For example very short lived data (files
opened with O_TEMP) and so on.
Also small nitpicking see below.
> Writing on flash devices can be much more efficient, if we can
> inform the device what kind of data can be grouped together. If
> the device is able to group data together with similar lifetimes,
> then it can be more efficient in garbage collection. This, in turn,
> leads to lower write amplification, which is a win on both device
> wear and performance.
>
> Add a new fadvise hint, POSIX_FADV_STREAMID, which sets the file
> and inode streamid. The file streamid is used if we have the file
> available at the time of the write (O_DIRECT), we use the inode
> streamid if not (buffered writeback). The fadvise hint uses the
> 'offset' field to specify a stream ID.
>
> Signed-off-by: Jens Axboe <axboe@fb.com>
> ---
> fs/inode.c | 1 +
> fs/open.c | 1 +
> include/linux/fs.h | 23 +++++++++++++++++++++++
> include/uapi/linux/fadvise.h | 2 ++
> mm/fadvise.c | 17 +++++++++++++++++
> 5 files changed, 44 insertions(+)
>
> diff --git a/fs/inode.c b/fs/inode.c
> index f00b16f45507..41885322ba64 100644
> --- a/fs/inode.c
> +++ b/fs/inode.c
> @@ -149,6 +149,7 @@ int inode_init_always(struct super_block *sb, struct inode *inode)
> inode->i_blocks = 0;
> inode->i_bytes = 0;
> inode->i_generation = 0;
> + inode->i_streamid = 0;
> inode->i_pipe = NULL;
> inode->i_bdev = NULL;
> inode->i_cdev = NULL;
> diff --git a/fs/open.c b/fs/open.c
> index 33f9cbf2610b..4a9b2be1a674 100644
> --- a/fs/open.c
> +++ b/fs/open.c
> @@ -743,6 +743,7 @@ static int do_dentry_open(struct file *f,
> f->f_flags &= ~(O_CREAT | O_EXCL | O_NOCTTY | O_TRUNC);
>
> file_ra_state_init(&f->f_ra, f->f_mapping->host->i_mapping);
> + f->f_streamid = 0;
>
> return 0;
>
> diff --git a/include/linux/fs.h b/include/linux/fs.h
> index b4d71b5e1ff2..43dde70c1d0d 100644
> --- a/include/linux/fs.h
> +++ b/include/linux/fs.h
> @@ -631,6 +631,7 @@ struct inode {
> };
>
> __u32 i_generation;
> + unsigned int i_streamid;
>
> #ifdef CONFIG_FSNOTIFY
> __u32 i_fsnotify_mask; /* all events this inode cares about */
> @@ -640,6 +641,14 @@ struct inode {
> void *i_private; /* fs or device private pointer */
> };
>
> +static inline unsigned int inode_streamid(struct inode *inode)
> +{
> + if (inode)
> + return inode->i_streamid;
> +
> + return 0;
> +}
> +
> static inline int inode_unhashed(struct inode *inode)
> {
> return hlist_unhashed(&inode->i_hash);
> @@ -820,6 +829,8 @@ struct file {
> const struct cred *f_cred;
> struct file_ra_state f_ra;
>
> + unsigned int f_streamid;
> +
> u64 f_version;
> #ifdef CONFIG_SECURITY
> void *f_security;
> @@ -842,6 +853,18 @@ struct file_handle {
> unsigned char f_handle[0];
> };
>
> +/*
> + * If the file doesn't have a stream ID set, return the inode stream ID
> + * in case that has been set.
> + */
> +static inline unsigned int file_streamid(struct file *f)
> +{
> + if (f->f_streamid)
> + return f->f_streamid;
> +
> + return inode_streamid(f->f_inode);
> +}
> +
> static inline struct file *get_file(struct file *f)
> {
> atomic_long_inc(&f->f_count);
> diff --git a/include/uapi/linux/fadvise.h b/include/uapi/linux/fadvise.h
> index e8e747139b9a..3dc8a1ff1422 100644
> --- a/include/uapi/linux/fadvise.h
> +++ b/include/uapi/linux/fadvise.h
> @@ -18,4 +18,6 @@
> #define POSIX_FADV_NOREUSE 5 /* Data will be accessed once. */
> #endif
>
> +#define POSIX_FADV_STREAMID 8 /* associate stream ID with file */
> +
> #endif /* FADVISE_H_INCLUDED */
> diff --git a/mm/fadvise.c b/mm/fadvise.c
> index 4a3907cf79f8..b111a8899fb7 100644
> --- a/mm/fadvise.c
> +++ b/mm/fadvise.c
> @@ -60,6 +60,7 @@ SYSCALL_DEFINE4(fadvise64_64, int, fd, loff_t, offset, loff_t, len, int, advice)
> case POSIX_FADV_WILLNEED:
> case POSIX_FADV_NOREUSE:
> case POSIX_FADV_DONTNEED:
> + case POSIX_FADV_STREAMID:
> /* no bad return value, but ignore advice */
> break;
> default:
> @@ -144,6 +145,22 @@ SYSCALL_DEFINE4(fadvise64_64, int, fd, loff_t, offset, loff_t, len, int, advice)
> }
> }
> break;
> + case POSIX_FADV_STREAMID:
> + /*
> + * streamid is stored in offset... we don't limit or check
> + * if the device supports streams, or if it does, if the
> + * stream nr is within the limits. 1 is the lowest valid
> + * stream id, 0 is "don't care/know".
> + */
> + if (offset != (unsigned int) offset)
> + ret = EINVAL;
Shuld be negative ret = -EINVAL;
> + else {
> + f.file->f_streamid = offset;
> + spin_lock(&inode->i_lock);
> + inode->i_streamid = offset;
> + spin_unlock(&inode->i_lock);
> + }
> + break;
> default:
> ret = -EINVAL;
> }
> --
> 1.9.1
>
> --
> To unsubscribe from this list: send the line "unsubscribe linux-fsdevel" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at http://vger.kernel.org/majordomo-info.html
[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 472 bytes --]
next prev parent reply other threads:[~2015-04-09 9:32 UTC|newest]
Thread overview: 21+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-03-25 15:07 [PATCH RFC v2] Support for write stream IDs Jens Axboe
2015-03-25 15:07 ` [PATCH 1/7] block: add support for carrying a stream ID in a bio Jens Axboe
2015-04-09 22:46 ` Andreas Dilger
2015-04-18 19:53 ` Jens Axboe
2015-03-25 15:07 ` [PATCH 2/7] Add support for per-file stream ID Jens Axboe
2015-04-09 9:30 ` Dmitry Monakhov [this message]
2015-04-09 16:28 ` Jens Axboe
2015-04-09 23:22 ` Andreas Dilger
2015-04-18 19:51 ` Jens Axboe
2015-03-25 15:07 ` [PATCH 3/7] direct-io: add support for write stream IDs Jens Axboe
2015-03-25 15:07 ` [PATCH 4/7] Add stream ID support for buffered mpage/__block_write_full_page() Jens Axboe
2015-03-25 22:42 ` Ming Lin-SSI
2015-03-25 23:08 ` Jens Axboe
2015-03-25 15:07 ` [PATCH 5/7] btrfs: add support for write stream IDs Jens Axboe
2015-03-25 16:00 ` Chris Mason
2015-03-25 15:07 ` [PATCH 6/7] xfs: add support for buffered writeback stream ID Jens Axboe
2015-03-25 15:07 ` [PATCH 7/7] ext4: add support for write stream IDs Jens Axboe
2015-03-26 20:34 ` Ming Lin-SSI
2015-03-26 20:39 ` Jens Axboe
2015-03-25 16:05 ` [PATCH RFC v2] Support " Jeff Moyer
2015-03-25 16:46 ` Jens Axboe
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=87h9sp643j.fsf@openvz.org \
--to=dmonlist@gmail.com \
--cc=axboe@fb.com \
--cc=david@fromorbit.com \
--cc=linux-fsdevel@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=ming.l@ssi.samsung.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox