[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Minios-devel] [UNIKRAFT PATCH v3 2/6] lib/ukblkdev: Blkdev registration



This patch introduces the initial blkdev API supporting device
registration. We introduce three header files for describing
Unikraft's blkdev API:
        uk/blkdev_core.h - Core data type definitions
        uk/blkdev_driver.h - API for drivers
        uk/blkdev.h - API for block applications

Signed-off-by: Roxana Nicolescu <nicolescu.roxana1996@xxxxxxxxx>
Reviewed-by: Simon Kuenzer <simon.kuenzer@xxxxxxxxx>
---
 lib/ukblkdev/Makefile.uk                |   2 +
 lib/ukblkdev/blkdev.c                   | 133 ++++++++++++++++++++++++
 lib/ukblkdev/exportsyms.uk              |   6 ++
 lib/ukblkdev/include/uk/blkdev.h        | 129 +++++++++++++++++++++++
 lib/ukblkdev/include/uk/blkdev_core.h   | 100 ++++++++++++++++++
 lib/ukblkdev/include/uk/blkdev_driver.h |  76 ++++++++++++++
 6 files changed, 446 insertions(+)
 create mode 100644 lib/ukblkdev/blkdev.c
 create mode 100644 lib/ukblkdev/exportsyms.uk
 create mode 100644 lib/ukblkdev/include/uk/blkdev.h
 create mode 100644 lib/ukblkdev/include/uk/blkdev_core.h
 create mode 100644 lib/ukblkdev/include/uk/blkdev_driver.h

diff --git a/lib/ukblkdev/Makefile.uk b/lib/ukblkdev/Makefile.uk
index 62c62045..b91417e2 100644
--- a/lib/ukblkdev/Makefile.uk
+++ b/lib/ukblkdev/Makefile.uk
@@ -2,3 +2,5 @@ $(eval $(call addlib_s,libukblkdev,$(CONFIG_LIBUKBLKDEV)))
 
 CINCLUDES-$(CONFIG_LIBUKBLKDEV)                += -I$(LIBUKBLKDEV_BASE)/include
 CXXINCLUDES-$(CONFIG_LIBUKBLKDEV)      += -I$(LIBUKBLKDEV_BASE)/include
+
+LIBUKBLKDEV_SRCS-y += $(LIBUKBLKDEV_BASE)/blkdev.c
diff --git a/lib/ukblkdev/blkdev.c b/lib/ukblkdev/blkdev.c
new file mode 100644
index 00000000..d68ecdb7
--- /dev/null
+++ b/lib/ukblkdev/blkdev.c
@@ -0,0 +1,133 @@
+/* SPDX-License-Identifier: BSD-3-Clause */
+/*
+ * Authors: Roxana Nicolescu <nicolescu.roxana1996@xxxxxxxxx>
+ *
+ * Copyright (c) 2019, University Politehnica of Bucharest.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. Neither the name of the copyright holder nor the names of its
+ *    contributors may be used to endorse or promote products derived from
+ *    this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ * THIS HEADER MAY NOT BE EXTRACTED OR MODIFIED IN ANY WAY.
+ */
+/* This is derived from uknetdev because of consistency reasons */
+#include <string.h>
+#include <stdio.h>
+#include <inttypes.h>
+#include <uk/alloc.h>
+#include <uk/assert.h>
+#include <uk/bitops.h>
+#include <uk/print.h>
+#include <uk/ctors.h>
+#include <uk/arch/atomic.h>
+#include <uk/blkdev.h>
+
+struct uk_blkdev_list uk_blkdev_list =
+UK_TAILQ_HEAD_INITIALIZER(uk_blkdev_list);
+
+static uint16_t blkdev_count;
+
+static struct uk_blkdev_data *_alloc_data(struct uk_alloc *a,
+               uint16_t blkdev_id,
+               const char *drv_name)
+{
+       struct uk_blkdev_data *data;
+
+       data = uk_calloc(a, 1, sizeof(*data));
+       if (!data)
+               return NULL;
+
+       data->drv_name = drv_name;
+       data->state    = UK_BLKDEV_UNCONFIGURED;
+       data->a = a;
+       /* This is the only place where we set the device ID;
+        * during the rest of the device's life time this ID is read-only
+        */
+       *(DECONST(uint16_t *, &data->id)) = blkdev_id;
+
+       return data;
+}
+
+int uk_blkdev_drv_register(struct uk_blkdev *dev, struct uk_alloc *a,
+               const char *drv_name)
+{
+       UK_ASSERT(dev);
+
+       /* Data must be unallocated. */
+       UK_ASSERT(PTRISERR(dev->_data));
+
+       dev->_data = _alloc_data(a, blkdev_count,  drv_name);
+       if (!dev->_data)
+               return -ENOMEM;
+
+       UK_TAILQ_INSERT_TAIL(&uk_blkdev_list, dev, _list);
+       uk_pr_info("Registered blkdev%"PRIu16": %p (%s)\n",
+                       blkdev_count, dev, drv_name);
+       dev->_data->state = UK_BLKDEV_UNCONFIGURED;
+
+       return blkdev_count++;
+}
+
+unsigned int uk_blkdev_count(void)
+{
+       return (unsigned int) blkdev_count;
+}
+
+struct uk_blkdev *uk_blkdev_get(unsigned int id)
+{
+       struct uk_blkdev *blkdev;
+
+       UK_TAILQ_FOREACH(blkdev, &uk_blkdev_list, _list) {
+               UK_ASSERT(blkdev->_data);
+               if (blkdev->_data->id == id)
+                       return blkdev;
+       }
+
+       return NULL;
+}
+
+uint16_t uk_blkdev_id_get(struct uk_blkdev *dev)
+{
+       UK_ASSERT(dev);
+       UK_ASSERT(dev->_data);
+
+       return dev->_data->id;
+}
+
+const char *uk_blkdev_drv_name_get(struct uk_blkdev *dev)
+{
+       UK_ASSERT(dev);
+       UK_ASSERT(dev->_data);
+
+       return dev->_data->drv_name;
+}
+
+enum uk_blkdev_state uk_blkdev_state_get(struct uk_blkdev *dev)
+{
+       UK_ASSERT(dev);
+       UK_ASSERT(dev->_data);
+
+       return dev->_data->state;
+}
diff --git a/lib/ukblkdev/exportsyms.uk b/lib/ukblkdev/exportsyms.uk
new file mode 100644
index 00000000..34e22426
--- /dev/null
+++ b/lib/ukblkdev/exportsyms.uk
@@ -0,0 +1,6 @@
+uk_blkdev_drv_register
+uk_blkdev_count
+uk_blkdev_get
+uk_blkdev_id_get
+uk_blkdev_drv_name_get
+uk_blkdev_state_get
diff --git a/lib/ukblkdev/include/uk/blkdev.h b/lib/ukblkdev/include/uk/blkdev.h
new file mode 100644
index 00000000..21b04117
--- /dev/null
+++ b/lib/ukblkdev/include/uk/blkdev.h
@@ -0,0 +1,129 @@
+/* SPDX-License-Identifier: BSD-3-Clause */
+/*
+ * Authors: Roxana Nicolescu <nicolescu.roxana1996@xxxxxxxxx>
+ *
+ * Copyright (c) 2019, University Politehnica of Bucharest
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. Neither the name of the copyright holder nor the names of its
+ *    contributors may be used to endorse or promote products derived from
+ *    this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ * THIS HEADER MAY NOT BE EXTRACTED OR MODIFIED IN ANY WAY.
+ */
+/* This is derived from uknetdev because of consistency reasons */
+#ifndef __UK_BLKDEV__
+#define __UK_BLKDEV__
+
+/**
+ * Unikraft Block API
+ *
+ * The Unikraft BLK API provides a generalized interface between Unikraft
+ * drivers and low-level application which needs communication with
+ * a block device.
+ *
+ * Most BLK API functions take as parameter a reference to the corresponding
+ * Unikraft Block Device (struct uk_blkdev) which can be obtained with a call
+ * to uk_blkdev_get(). The block app should store this reference and
+ * use it for all subsequent API calls.
+ *
+ * There are 4 states in which a block device can be found:
+ *      - UK_BLKDEV_UNREGISTERED
+ *      - UK_BLKDEV_UNCONFIGURED
+ *      - UK_BLKDEV_CONFIGURED
+ *      - UK_BLKDEV_RUNNING
+ */
+
+#include <sys/types.h>
+#include <stdint.h>
+#include <stdio.h>
+#include <errno.h>
+#include <limits.h>
+#include <uk/list.h>
+#include <uk/errptr.h>
+
+#include "blkdev_core.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/**
+ * Get the number of available Unikraft Block devices.
+ *
+ * @return
+ *     - (unsigned int): number of block devices.
+ */
+unsigned int uk_blkdev_count(void);
+
+/**
+ * Get a reference to a Unikraft Block Device, based on its ID.
+ * This reference should be saved by the application and used for subsequent
+ * API calls.
+ *
+ * @param id
+ *     The identifier of the Unikraft block device to configure.
+ * @return
+ *     - NULL: device not found in list
+ *     - (struct uk_blkdev *): reference to be passed to API calls
+ */
+struct uk_blkdev *uk_blkdev_get(unsigned int id);
+
+/**
+ * Returns the id of a block device
+ *
+ * @param dev
+ *     The Unikraft Block Device.
+ * @return
+ *     - (>=0): Device ID
+ */
+uint16_t uk_blkdev_id_get(struct uk_blkdev *dev);
+
+/**
+ * Returns the driver name of a blkdev device.
+ * The name might be set to NULL.
+ *
+ * @param dev
+ *     The Unikraft Block Device.
+ * @return
+ *     - (NULL): if no name is defined.
+ *     - (const char *): Reference to string if name is available.
+ */
+const char *uk_blkdev_drv_name_get(struct uk_blkdev *dev);
+
+/**
+ * Returns the current state of a blkdev device.
+ *
+ * @param dev
+ *     The Unikraft Block Device.
+ * @return
+ *     - (enum uk_blkdev_state): current device state
+ */
+enum uk_blkdev_state uk_blkdev_state_get(struct uk_blkdev *dev);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* __UK_BLKDEV__ */
diff --git a/lib/ukblkdev/include/uk/blkdev_core.h 
b/lib/ukblkdev/include/uk/blkdev_core.h
new file mode 100644
index 00000000..50d4dc4f
--- /dev/null
+++ b/lib/ukblkdev/include/uk/blkdev_core.h
@@ -0,0 +1,100 @@
+/* SPDX-License-Identifier: BSD-3-Clause */
+/*
+ * Authors: Roxana Nicolescu <nicolescu.roxana1996@xxxxxxxxx>
+ *
+ * Copyright (c) 2019, University Politehnica of Bucharest.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. Neither the name of the copyright holder nor the names of its
+ *    contributors may be used to endorse or promote products derived from
+ *    this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ * THIS HEADER MAY NOT BE EXTRACTED OR MODIFIED IN ANY WAY.
+ */
+/* This is derived from uknetdev because of consistency reasons */
+#ifndef __UK_BLKDEV_CORE__
+#define __UK_BLKDEV_CORE__
+
+#include <uk/list.h>
+#include <uk/config.h>
+
+/**
+ * Unikraft block API common declarations.
+ *
+ * This header contains all API data types. Some of them are part of the
+ * public API and some are part of the internal API.
+ *
+ * The device data and operations are separated. This split allows the
+ * function pointer and driver data to be per-process, while the actual
+ * configuration data for the device is shared.
+ */
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+struct uk_blkdev;
+
+/**
+ * List with devices
+ */
+UK_TAILQ_HEAD(uk_blkdev_list, struct uk_blkdev);
+
+/**
+ * Enum to describe the possible states of an block device.
+ */
+enum uk_blkdev_state {
+       UK_BLKDEV_INVALID = 0,
+       UK_BLKDEV_UNCONFIGURED,
+       UK_BLKDEV_CONFIGURED,
+       UK_BLKDEV_RUNNING,
+};
+
+/**
+ * @internal
+ * libukblkdev internal data associated with each block device.
+ */
+struct uk_blkdev_data {
+        /* Device id identifier */
+       const uint16_t id;
+       /* Device state */
+       enum uk_blkdev_state state;
+       /* Name of device*/
+       const char *drv_name;
+       /* Allocator */
+       struct uk_alloc *a;
+};
+
+struct uk_blkdev {
+       /* Pointer to API-internal state data. */
+       struct uk_blkdev_data *_data;
+       /* Entry for list of block devices */
+       UK_TAILQ_ENTRY(struct uk_blkdev) _list;
+};
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* __UK_BLKDEV_CORE__ */
diff --git a/lib/ukblkdev/include/uk/blkdev_driver.h 
b/lib/ukblkdev/include/uk/blkdev_driver.h
new file mode 100644
index 00000000..5dc9657d
--- /dev/null
+++ b/lib/ukblkdev/include/uk/blkdev_driver.h
@@ -0,0 +1,76 @@
+/* SPDX-License-Identifier: BSD-3-Clause */
+/*
+ * Authors: Roxana Nicolescu <nicolescu.roxana1996@xxxxxxxxx>
+ *
+ * Copyright (c) 2019, University Politehnica of Bucharest
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. Neither the name of the copyright holder nor the names of its
+ *    contributors may be used to endorse or promote products derived from
+ *    this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ * THIS HEADER MAY NOT BE EXTRACTED OR MODIFIED IN ANY WAY.
+ */
+/* This is derived from uknetdev because of consistency reasons */
+#ifndef __UK_BLKDEV_DRIVER__
+#define __UK_BLKDEV_DRIVER__
+
+#include <uk/blkdev_core.h>
+#include <uk/assert.h>
+
+/**
+ * Unikraft block driver API.
+ *
+ * This header contains all API functions that are supposed to be called
+ * by a block device driver.
+ */
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/**
+ * Adds a Unikraft block device to the device list.
+ * This should be called whenever a driver adds a new found device.
+ *
+ * @param dev
+ *     Struct to unikraft block device that shall be registered
+ * @param a
+ *     Allocator to be use for libukblkdev private data (dev->_data)
+ * @param drv_name
+ *     (Optional) driver name
+ *     The memory for this string has to stay available as long as the
+ *     device is registered.
+ * @return
+ *     - (-ENOMEM): Allocation of private
+ *     - (>=0): Block device ID on success
+ */
+int uk_blkdev_drv_register(struct uk_blkdev *dev, struct uk_alloc *a,
+               const char *drv_name);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* __UK_BLKDEV_DRIVER__ */
-- 
2.17.1


_______________________________________________
Minios-devel mailing list
Minios-devel@xxxxxxxxxxxxxxxxxxxx
https://lists.xenproject.org/mailman/listinfo/minios-devel

 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.