mirror of
https://github.com/torvalds/linux.git
synced 2024-11-22 20:22:09 +00:00
016dc8516a
Implement support for unbuffered and DIO reads in the netfs library, utilising the existing read helper code to do block splitting and individual queuing. The code also handles extraction of the destination buffer from the supplied iterator, allowing async unbuffered reads to take place. The read will be split up according to the rsize setting and, if supplied, the ->clamp_length() method. Note that the next subrequest will be issued as soon as issue_op returns, without waiting for previous ones to finish. The network filesystem needs to pause or handle queuing them if it doesn't want to fire them all at the server simultaneously. Once all the subrequests have finished, the state will be assessed and the amount of data to be indicated as having being obtained will be determined. As the subrequests may finish in any order, if an intermediate subrequest is short, any further subrequests may be copied into the buffer and then abandoned. In the future, this will also take care of doing an unbuffered read from encrypted content, with the decryption being done by the library. Signed-off-by: David Howells <dhowells@redhat.com> cc: Jeff Layton <jlayton@kernel.org> cc: linux-cachefs@redhat.com cc: linux-fsdevel@vger.kernel.org cc: linux-mm@kvack.org
72 lines
2.4 KiB
C
72 lines
2.4 KiB
C
// SPDX-License-Identifier: GPL-2.0-or-later
|
|
/* Netfs support statistics
|
|
*
|
|
* Copyright (C) 2021 Red Hat, Inc. All Rights Reserved.
|
|
* Written by David Howells (dhowells@redhat.com)
|
|
*/
|
|
|
|
#include <linux/export.h>
|
|
#include <linux/seq_file.h>
|
|
#include "internal.h"
|
|
|
|
atomic_t netfs_n_rh_dio_read;
|
|
atomic_t netfs_n_rh_readahead;
|
|
atomic_t netfs_n_rh_readpage;
|
|
atomic_t netfs_n_rh_rreq;
|
|
atomic_t netfs_n_rh_sreq;
|
|
atomic_t netfs_n_rh_download;
|
|
atomic_t netfs_n_rh_download_done;
|
|
atomic_t netfs_n_rh_download_failed;
|
|
atomic_t netfs_n_rh_download_instead;
|
|
atomic_t netfs_n_rh_read;
|
|
atomic_t netfs_n_rh_read_done;
|
|
atomic_t netfs_n_rh_read_failed;
|
|
atomic_t netfs_n_rh_zero;
|
|
atomic_t netfs_n_rh_short_read;
|
|
atomic_t netfs_n_rh_write;
|
|
atomic_t netfs_n_rh_write_begin;
|
|
atomic_t netfs_n_rh_write_done;
|
|
atomic_t netfs_n_rh_write_failed;
|
|
atomic_t netfs_n_rh_write_zskip;
|
|
atomic_t netfs_n_wh_upload;
|
|
atomic_t netfs_n_wh_upload_done;
|
|
atomic_t netfs_n_wh_upload_failed;
|
|
atomic_t netfs_n_wh_write;
|
|
atomic_t netfs_n_wh_write_done;
|
|
atomic_t netfs_n_wh_write_failed;
|
|
|
|
int netfs_stats_show(struct seq_file *m, void *v)
|
|
{
|
|
seq_printf(m, "Netfs : DR=%u RA=%u RP=%u WB=%u WBZ=%u rr=%u sr=%u\n",
|
|
atomic_read(&netfs_n_rh_dio_read),
|
|
atomic_read(&netfs_n_rh_readahead),
|
|
atomic_read(&netfs_n_rh_readpage),
|
|
atomic_read(&netfs_n_rh_write_begin),
|
|
atomic_read(&netfs_n_rh_write_zskip),
|
|
atomic_read(&netfs_n_rh_rreq),
|
|
atomic_read(&netfs_n_rh_sreq));
|
|
seq_printf(m, "Netfs : ZR=%u sh=%u sk=%u\n",
|
|
atomic_read(&netfs_n_rh_zero),
|
|
atomic_read(&netfs_n_rh_short_read),
|
|
atomic_read(&netfs_n_rh_write_zskip));
|
|
seq_printf(m, "Netfs : DL=%u ds=%u df=%u di=%u\n",
|
|
atomic_read(&netfs_n_rh_download),
|
|
atomic_read(&netfs_n_rh_download_done),
|
|
atomic_read(&netfs_n_rh_download_failed),
|
|
atomic_read(&netfs_n_rh_download_instead));
|
|
seq_printf(m, "Netfs : RD=%u rs=%u rf=%u\n",
|
|
atomic_read(&netfs_n_rh_read),
|
|
atomic_read(&netfs_n_rh_read_done),
|
|
atomic_read(&netfs_n_rh_read_failed));
|
|
seq_printf(m, "Netfs : UL=%u us=%u uf=%u\n",
|
|
atomic_read(&netfs_n_wh_upload),
|
|
atomic_read(&netfs_n_wh_upload_done),
|
|
atomic_read(&netfs_n_wh_upload_failed));
|
|
seq_printf(m, "Netfs : WR=%u ws=%u wf=%u\n",
|
|
atomic_read(&netfs_n_wh_write),
|
|
atomic_read(&netfs_n_wh_write_done),
|
|
atomic_read(&netfs_n_wh_write_failed));
|
|
return fscache_stats_show(m);
|
|
}
|
|
EXPORT_SYMBOL(netfs_stats_show);
|