[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PATCH v3 04/14] io: Add generic pwritev/preadv interface
From: |
Nikolay Borisov |
Subject: |
[PATCH v3 04/14] io: Add generic pwritev/preadv interface |
Date: |
Fri, 28 Oct 2022 13:39:04 +0300 |
Introduce basic pwriteve/preadv support in the generic channel layer.
SPecific implementation will follow for the file channel as this is
required in order to support migration streams with fixed location of
each ram page.
Signed-off-by: Nikolay Borisov <nborisov@suse.com>
---
include/io/channel.h | 49 ++++++++++++++++++++++++++++++++++++++++++++
io/channel.c | 26 +++++++++++++++++++++++
2 files changed, 75 insertions(+)
diff --git a/include/io/channel.h b/include/io/channel.h
index c680ee748021..6b10bce8bbdf 100644
--- a/include/io/channel.h
+++ b/include/io/channel.h
@@ -124,6 +124,16 @@ struct QIOChannelClass {
Error **errp);
/* Optional callbacks */
+ ssize_t (*io_pwritev)(QIOChannel *ioc,
+ const struct iovec *iov,
+ size_t niov,
+ off_t offset,
+ Error **errp);
+ ssize_t (*io_preadv)(QIOChannel *ioc,
+ const struct iovec *iov,
+ size_t niov,
+ off_t offset,
+ Error **errp);
int (*io_shutdown)(QIOChannel *ioc,
QIOChannelShutdown how,
Error **errp);
@@ -504,6 +514,45 @@ int qio_channel_set_blocking(QIOChannel *ioc,
int qio_channel_close(QIOChannel *ioc,
Error **errp);
+
+/**
+ * qio_channel_io_pwritev
+ * @ioc: the channel object
+ * @iov: the array of memory regions to write data from
+ * @niov: the length of the @iov array
+ * @offset: offset in the channel where writes should begin
+ * @errp: pointer to a NULL-initialized error object
+ *
+ * Not all implementations will support this facility, so may report an error.
+ * To avoid errors, the caller may check for the feature flag
+ * QIO_CHANNEL_FEATURE_SEEKABLE prior to calling this method.
+ *
+ * Behaves as qio_channel_writev_full, apart from not supporting sending of
file
+ * handles as well as beginning the write at the passed @offset
+ *
+ */
+ssize_t qio_channel_io_pwritev(QIOChannel *ioc, const struct iovec *iov,
+ size_t niov, off_t offset, Error **errp);
+
+
+/**
+ * qio_channel_io_preadv
+ * @ioc: the channel object
+ * @iov: the array of memory regions to read data into
+ * @niov: the length of the @iov array
+ * @offset: offset in the channel where writes should begin
+ * @errp: pointer to a NULL-initialized error object
+ *
+ * Not all implementations will support this facility, so may report an error.
+ * To avoid errors, the caller may check for the feature flag
+ * QIO_CHANNEL_FEATURE_SEEKABLE prior to calling this method.
+ *
+ * Behaves as qio_channel_readv_full, apart from not supporting receiving of
file
+ * handles as well as beginning the read at the passed @offset
+ *
+ */
+ssize_t qio_channel_io_preadv(QIOChannel *ioc, const struct iovec *iov,
+ size_t niov, off_t offset, Error **errp);
/**
* qio_channel_shutdown:
* @ioc: the channel object
diff --git a/io/channel.c b/io/channel.c
index 0640941ac573..f5ac9499a7ad 100644
--- a/io/channel.c
+++ b/io/channel.c
@@ -437,6 +437,32 @@ GSource *qio_channel_add_watch_source(QIOChannel *ioc,
}
+ssize_t qio_channel_io_pwritev(QIOChannel *ioc, const struct iovec *iov,
+ size_t niov, off_t offset, Error **errp)
+{
+ QIOChannelClass *klass = QIO_CHANNEL_GET_CLASS(ioc);
+
+ if (!klass->io_pwritev) {
+ error_setg(errp, "Channel does not support pwritev");
+ return -1;
+ }
+
+ return klass->io_pwritev(ioc, iov, niov, offset, errp);
+}
+
+ssize_t qio_channel_io_preadv(QIOChannel *ioc, const struct iovec *iov,
+ size_t niov, off_t offset, Error **errp)
+{
+ QIOChannelClass *klass = QIO_CHANNEL_GET_CLASS(ioc);
+
+ if (!klass->io_preadv) {
+ error_setg(errp, "Channel does not support preadv");
+ return -1;
+ }
+
+ return klass->io_preadv(ioc, iov, niov, offset, errp);
+}
+
int qio_channel_shutdown(QIOChannel *ioc,
QIOChannelShutdown how,
Error **errp)
--
2.34.1
- [PATCH v3 00/14] File-based migration support and fixed-ram features, Nikolay Borisov, 2022/10/28
- [PATCH v3 02/14] migration: Add support for 'file:' uri for incoming migration, Nikolay Borisov, 2022/10/28
- [PATCH v3 01/14] migration: support file: uri for source migration, Nikolay Borisov, 2022/10/28
- [PATCH v3 09/14] migration: add qemu_get_buffer_at, Nikolay Borisov, 2022/10/28
- [PATCH v3 04/14] io: Add generic pwritev/preadv interface,
Nikolay Borisov <=
- [PATCH v3 03/14] migration: Initial support of fixed-ram feature for analyze-migration.py, Nikolay Borisov, 2022/10/28
- [PATCH v3 07/14] migration/qemu-file: add utility methods for working with seekable channels, Nikolay Borisov, 2022/10/28
- [PATCH v3 06/14] io: add and implement QIO_CHANNEL_FEATURE_SEEKABLE for channel file, Nikolay Borisov, 2022/10/28
- [PATCH v3 05/14] io: implement io_pwritev for QIOChannelFile, Nikolay Borisov, 2022/10/28
- [PATCH v3 08/14] io: Add preadv support to QIOChannelFile, Nikolay Borisov, 2022/10/28
- [PATCH v3 14/14] tests/qtest: migration-test: Add tests for file-based migration, Nikolay Borisov, 2022/10/28
- [PATCH v3 11/14] migration: Refactor precopy ram loading code, Nikolay Borisov, 2022/10/28
- [PATCH v3 12/14] migration: Add support for 'fixed-ram' migration restore, Nikolay Borisov, 2022/10/28
- [PATCH v3 10/14] migration/ram: Introduce 'fixed-ram' migration stream capability, Nikolay Borisov, 2022/10/28
- [PATCH v3 13/14] tests: Add migrate_incoming_qmp helper, Nikolay Borisov, 2022/10/28