nvme/vfio-user: use API to setup BAR0 doorbells
We can use lib/vfio-user API to setup BAR0 doorbells, existing implementation is redundant. Change-Id: Ib880d167c84c6b8482bf1a35559a34c939f6a02d Signed-off-by: Changpeng Liu <changpeng.liu@intel.com> Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/12211 Community-CI: Broadcom CI <spdk-ci.pdl@broadcom.com> Community-CI: Mellanox Build Bot Tested-by: SPDK CI Jenkins <sys_sgci@intel.com> Reviewed-by: John Levon <levon@movementarian.org> Reviewed-by: Jim Harris <james.r.harris@intel.com> Reviewed-by: Tomasz Zawadzki <tomasz.zawadzki@intel.com>
This commit is contained in:
parent
04b16168cf
commit
c47b7b0276
@ -49,7 +49,6 @@ struct nvme_vfio_ctrlr {
|
||||
struct nvme_pcie_ctrlr pctrlr;
|
||||
|
||||
volatile uint32_t *doorbell_base;
|
||||
int bar0_fd;
|
||||
struct vfio_device *dev;
|
||||
};
|
||||
|
||||
@ -148,44 +147,20 @@ nvme_vfio_ctrlr_set_aqa(struct spdk_nvme_ctrlr *ctrlr, const union spdk_nvme_aqa
|
||||
aqa->raw);
|
||||
}
|
||||
|
||||
/* Instead of using path as the bar0 file descriptor, we can also use
|
||||
* SPARSE MMAP to get the doorbell mmaped address.
|
||||
*/
|
||||
static int
|
||||
nvme_vfio_setup_bar0(struct nvme_vfio_ctrlr *vctrlr, const char *path)
|
||||
nvme_vfio_setup_bar0(struct nvme_vfio_ctrlr *vctrlr)
|
||||
{
|
||||
volatile uint32_t *doorbell;
|
||||
int fd;
|
||||
void *doorbell;
|
||||
|
||||
fd = open(path, O_RDWR);
|
||||
if (fd < 0) {
|
||||
SPDK_ERRLOG("Failed to open file %s\n", path);
|
||||
return fd;
|
||||
doorbell = spdk_vfio_user_get_bar_addr(vctrlr->dev, 0, 0x1000, 0x1000);
|
||||
if (!doorbell) {
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
doorbell = mmap(NULL, 0x1000, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0x1000);
|
||||
if (doorbell == MAP_FAILED) {
|
||||
SPDK_ERRLOG("Failed to mmap file %s\n", path);
|
||||
close(fd);
|
||||
return -EFAULT;
|
||||
}
|
||||
|
||||
vctrlr->bar0_fd = fd;
|
||||
vctrlr->doorbell_base = doorbell;
|
||||
|
||||
vctrlr->doorbell_base = (volatile uint32_t *)doorbell;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void
|
||||
nvme_vfio_bar0_destruct(struct nvme_vfio_ctrlr *vctrlr)
|
||||
{
|
||||
if (vctrlr->doorbell_base) {
|
||||
munmap((void *)vctrlr->doorbell_base, 0x1000);
|
||||
}
|
||||
|
||||
close(vctrlr->bar0_fd);
|
||||
}
|
||||
|
||||
static struct spdk_nvme_ctrlr *
|
||||
nvme_vfio_ctrlr_construct(const struct spdk_nvme_transport_id *trid,
|
||||
const struct spdk_nvme_ctrlr_opts *opts,
|
||||
@ -197,40 +172,30 @@ static struct spdk_nvme_ctrlr *
|
||||
union spdk_nvme_cap_register cap;
|
||||
int ret;
|
||||
char ctrlr_path[PATH_MAX];
|
||||
char ctrlr_bar0[PATH_MAX];
|
||||
|
||||
snprintf(ctrlr_path, sizeof(ctrlr_path), "%s/cntrl", trid->traddr);
|
||||
snprintf(ctrlr_bar0, sizeof(ctrlr_bar0), "%s/bar0", trid->traddr);
|
||||
|
||||
ret = access(ctrlr_path, F_OK);
|
||||
if (ret != 0) {
|
||||
SPDK_ERRLOG("Access path %s failed\n", ctrlr_path);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
ret = access(ctrlr_bar0, F_OK);
|
||||
if (ret != 0) {
|
||||
SPDK_ERRLOG("Access path %s failed\n", ctrlr_bar0);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
vctrlr = calloc(1, sizeof(*vctrlr));
|
||||
if (!vctrlr) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
ret = nvme_vfio_setup_bar0(vctrlr, ctrlr_bar0);
|
||||
if (ret != 0) {
|
||||
vctrlr->dev = spdk_vfio_user_setup(ctrlr_path);
|
||||
if (!vctrlr->dev) {
|
||||
SPDK_ERRLOG("Error to setup vfio device\n");
|
||||
free(vctrlr);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
vctrlr->dev = spdk_vfio_user_setup(ctrlr_path);
|
||||
if (!vctrlr->dev) {
|
||||
SPDK_ERRLOG("Error to setup vfio device\n");
|
||||
nvme_vfio_bar0_destruct(vctrlr);
|
||||
free(vctrlr);
|
||||
return NULL;
|
||||
ret = nvme_vfio_setup_bar0(vctrlr);
|
||||
if (ret != 0) {
|
||||
SPDK_ERRLOG("Error to get device BAR0\n");
|
||||
goto exit;
|
||||
}
|
||||
|
||||
pctrlr = &vctrlr->pctrlr;
|
||||
@ -285,7 +250,6 @@ static struct spdk_nvme_ctrlr *
|
||||
return &pctrlr->ctrlr;
|
||||
|
||||
exit:
|
||||
nvme_vfio_bar0_destruct(vctrlr);
|
||||
spdk_vfio_user_release(vctrlr->dev);
|
||||
free(vctrlr);
|
||||
return NULL;
|
||||
@ -354,7 +318,6 @@ nvme_vfio_ctrlr_destruct(struct spdk_nvme_ctrlr *ctrlr)
|
||||
|
||||
nvme_ctrlr_free_processes(ctrlr);
|
||||
|
||||
nvme_vfio_bar0_destruct(vctrlr);
|
||||
spdk_vfio_user_release(vctrlr->dev);
|
||||
free(vctrlr);
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user