Spdk/include/spdk/memory.h
Ben Walker a36bc251df env_dpdk: Automatically map PCI BARs into VFIO
By doing the registration immediately upon mapping the BAR instead of
when the memory is inserted into the spdk_mem_map, we're able to
register BARs that are not 2MB multiples in size and alignment. The SPDK
API for registering a BAR already returns the physical/io address in the
map call, and it can be used directly without a call to
spdk_mem_register().

If the user does elect to later register the BAR using
spdk_mem_register(), we attempt to insert the 2MB aligned segments we
can into the spdk_mem_map. Users may still need to register memory for a
few reasons, such as making spdk_vtophys() work, or for setting up the
BAR as a target for RDMA. These cases still require 2MB aligned and
sized segments.

Change-Id: I395ae8803ec4bf22703f6f76db54200949e82532
Signed-off-by: Ben Walker <benjamin.walker@intel.com>
Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/14017
Reviewed-by: Jim Harris <james.r.harris@intel.com>
Reviewed-by: Konrad Sztyber <konrad.sztyber@intel.com>
Reviewed-by: Shuhei Matsumoto <smatsumoto@nvidia.com>
Tested-by: SPDK CI Jenkins <sys_sgci@intel.com>
Community-CI: Mellanox Build Bot
2022-09-26 11:48:39 +00:00

44 lines
936 B
C

/* SPDX-License-Identifier: BSD-3-Clause
* Copyright (c) Intel Corporation.
* All rights reserved.
*/
#ifndef SPDK_MEMORY_H
#define SPDK_MEMORY_H
#include "spdk/stdinc.h"
#ifndef __linux__
#define VFIO_ENABLED 0
#else
#include <linux/version.h>
#if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 6, 0)
#define VFIO_ENABLED 1
#else
#define VFIO_ENABLED 0
#endif
#endif
#ifdef __cplusplus
extern "C" {
#endif
#define SHIFT_2MB 21 /* (1 << 21) == 2MB */
#define VALUE_2MB (1ULL << SHIFT_2MB)
#define MASK_2MB (VALUE_2MB - 1)
#define SHIFT_4KB 12 /* (1 << 12) == 4KB */
#define VALUE_4KB (1ULL << SHIFT_4KB)
#define MASK_4KB (VALUE_4KB - 1)
#define _2MB_OFFSET(ptr) (((uintptr_t)(ptr)) & MASK_2MB)
#define _2MB_PAGE(ptr) FLOOR_2MB((uintptr_t)(ptr))
#define FLOOR_2MB(x) (((uintptr_t)(x)) & ~MASK_2MB)
#define CEIL_2MB(x) FLOOR_2MB(((uintptr_t)(x)) + VALUE_2MB - 1)
#ifdef __cplusplus
}
#endif
#endif /* SPDK_MEMORY_H */