]> git.droids-corp.org - dpdk.git/commitdiff
gpudev: add memory barrier
authorElena Agostini <eagostini@nvidia.com>
Mon, 8 Nov 2021 18:58:02 +0000 (18:58 +0000)
committerThomas Monjalon <thomas@monjalon.net>
Mon, 8 Nov 2021 16:20:53 +0000 (17:20 +0100)
Add a function for the application to ensure the coherency
of the writes executed by another device into the GPU memory.

Signed-off-by: Elena Agostini <eagostini@nvidia.com>
doc/guides/prog_guide/gpudev.rst
lib/gpudev/gpudev.c
lib/gpudev/gpudev_driver.h
lib/gpudev/rte_gpudev.h
lib/gpudev/version.map

index 9aca69038c0562ef5a101f290d06a328949ab33b..eb5f0af8170461993208ef6e02a2db070405d879 100644 (file)
@@ -65,3 +65,11 @@ gpudev can register a CPU memory area to make it visible from a GPU device.
 Later, it's also possible to unregister that memory with gpudev.
 CPU memory registered outside of the gpudev library
 (e.g. with GPU specific library) cannot be unregistered by the gpudev library.
+
+Memory Barrier
+~~~~~~~~~~~~~~
+
+Some GPU drivers may need, under certain conditions,
+to enforce the coherency of external devices writes (e.g. NIC receiving packets)
+into the GPU memory.
+gpudev abstracts and exposes this capability.
index 504ac5b393089a22daf679ce835b1976eb71cc78..da921dee0f5ed1e262e2ab6585356a5a16a2c867 100644 (file)
@@ -625,3 +625,22 @@ rte_gpu_mem_unregister(int16_t dev_id, void *ptr)
        }
        return GPU_DRV_RET(dev->ops.mem_unregister(dev, ptr));
 }
+
+int
+rte_gpu_wmb(int16_t dev_id)
+{
+       struct rte_gpu *dev;
+
+       dev = gpu_get_by_id(dev_id);
+       if (dev == NULL) {
+               GPU_LOG(ERR, "memory barrier for invalid device ID %d", dev_id);
+               rte_errno = ENODEV;
+               return -rte_errno;
+       }
+
+       if (dev->ops.wmb == NULL) {
+               rte_errno = ENOTSUP;
+               return -rte_errno;
+       }
+       return GPU_DRV_RET(dev->ops.wmb(dev));
+}
index c9c3eab9b02920fa15c5c4386a2f3cf5395eb9d0..cb7b101f2f25160e7daede55ac4246d8e63c2984 100644 (file)
@@ -31,6 +31,7 @@ typedef int (rte_gpu_mem_alloc_t)(struct rte_gpu *dev, size_t size, void **ptr);
 typedef int (rte_gpu_mem_free_t)(struct rte_gpu *dev, void *ptr);
 typedef int (rte_gpu_mem_register_t)(struct rte_gpu *dev, size_t size, void *ptr);
 typedef int (rte_gpu_mem_unregister_t)(struct rte_gpu *dev, void *ptr);
+typedef int (rte_gpu_wmb_t)(struct rte_gpu *dev);
 
 struct rte_gpu_ops {
        /* Get device info. If NULL, info is just copied. */
@@ -45,6 +46,8 @@ struct rte_gpu_ops {
        rte_gpu_mem_register_t *mem_register;
        /* Unregister CPU memory from device. */
        rte_gpu_mem_unregister_t *mem_unregister;
+       /* Enforce GPU write memory barrier. */
+       rte_gpu_wmb_t *wmb;
 };
 
 struct rte_gpu_mpshared {
index f45ca60f8eeb9b959a96b9af3d6bd10c9ba9517e..62e168236e5f96f89dacb3ef5dae5eb01f183ca4 100644 (file)
@@ -387,6 +387,24 @@ int rte_gpu_mem_register(int16_t dev_id, size_t size, void *ptr);
 __rte_experimental
 int rte_gpu_mem_unregister(int16_t dev_id, void *ptr);
 
+/**
+ * @warning
+ * @b EXPERIMENTAL: this API may change without prior notice.
+ *
+ * Enforce a GPU write memory barrier.
+ *
+ * @param dev_id
+ *   Reference device ID.
+ *
+ * @return
+ *   0 on success, -rte_errno otherwise:
+ *   - ENODEV if invalid dev_id
+ *   - ENOTSUP if operation not supported by the driver
+ *   - EPERM if driver error
+ */
+__rte_experimental
+int rte_gpu_wmb(int16_t dev_id);
+
 #ifdef __cplusplus
 }
 #endif
index ec8f6069a516b424dd06132db6683ee678490ae0..633ac150fadb354bc6b9753863e16b6dab72b8f2 100644 (file)
@@ -15,6 +15,7 @@ EXPERIMENTAL {
        rte_gpu_mem_free;
        rte_gpu_mem_register;
        rte_gpu_mem_unregister;
+       rte_gpu_wmb;
 };
 
 INTERNAL {