lib/nvme: cuse device avoid using signals
This patch uses lowlevel fuse functions to process messages to
eliminate the need to use signals to interrupt blocking read
operation in fuse_session_loop().
Fixes #1032
Signed-off-by: Tomasz Kulasek <tomaszx.kulasek@intel.com>
Reviewed-on: https://review.gerrithub.io/c/spdk/spdk/+/473233 (master)
(cherry picked from commit 88808c5ab7
)
Change-Id: Ie9c9ea76cc135c383f5757864aa2d84ac9eb3da3
Signed-off-by: Tomasz Zawadzki <tomasz.zawadzki@intel.com>
Reviewed-on: https://review.gerrithub.io/c/spdk/spdk/+/478348
Tested-by: SPDK CI Jenkins <sys_sgci@intel.com>
Reviewed-by: Jim Harris <james.r.harris@intel.com>
Reviewed-by: Shuhei Matsumoto <shuhei.matsumoto.xt@hitachi.com>
This commit is contained in:
parent
1c8d673f75
commit
848927d96a
@ -623,6 +623,10 @@ cuse_thread(void *arg)
|
|||||||
const char *dev_info_argv[] = { devname_arg };
|
const char *dev_info_argv[] = { devname_arg };
|
||||||
struct cuse_info ci;
|
struct cuse_info ci;
|
||||||
int multithreaded;
|
int multithreaded;
|
||||||
|
int rc;
|
||||||
|
struct fuse_buf buf = { .mem = NULL };
|
||||||
|
struct pollfd fds;
|
||||||
|
int timeout_msecs = 500;
|
||||||
|
|
||||||
spdk_unaffinitize_thread();
|
spdk_unaffinitize_thread();
|
||||||
|
|
||||||
@ -646,7 +650,22 @@ cuse_thread(void *arg)
|
|||||||
}
|
}
|
||||||
|
|
||||||
SPDK_NOTICELOG("fuse session for device %s created\n", cuse_device->dev_name);
|
SPDK_NOTICELOG("fuse session for device %s created\n", cuse_device->dev_name);
|
||||||
fuse_session_loop(cuse_device->session);
|
|
||||||
|
/* Receive and process fuse requests */
|
||||||
|
fds.fd = fuse_session_fd(cuse_device->session);
|
||||||
|
fds.events = POLLIN;
|
||||||
|
while (!fuse_session_exited(cuse_device->session)) {
|
||||||
|
rc = poll(&fds, 1, timeout_msecs);
|
||||||
|
if (rc <= 0) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
rc = fuse_session_receive_buf(cuse_device->session, &buf);
|
||||||
|
if (rc > 0) {
|
||||||
|
fuse_session_process_buf(cuse_device->session, &buf);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
free(buf.mem);
|
||||||
|
fuse_session_reset(cuse_device->session);
|
||||||
|
|
||||||
end:
|
end:
|
||||||
cuse_lowlevel_teardown(cuse_device->session);
|
cuse_lowlevel_teardown(cuse_device->session);
|
||||||
@ -691,14 +710,12 @@ cuse_nvme_ctrlr_stop(struct cuse_device *ctrlr_device)
|
|||||||
|
|
||||||
TAILQ_FOREACH_SAFE(ns_device, &ctrlr_device->ns_devices, tailq, tmp) {
|
TAILQ_FOREACH_SAFE(ns_device, &ctrlr_device->ns_devices, tailq, tmp) {
|
||||||
fuse_session_exit(ns_device->session);
|
fuse_session_exit(ns_device->session);
|
||||||
pthread_kill(ns_device->tid, SIGHUP);
|
|
||||||
pthread_join(ns_device->tid, NULL);
|
pthread_join(ns_device->tid, NULL);
|
||||||
TAILQ_REMOVE(&ctrlr_device->ns_devices, ns_device, tailq);
|
TAILQ_REMOVE(&ctrlr_device->ns_devices, ns_device, tailq);
|
||||||
free(ns_device);
|
free(ns_device);
|
||||||
}
|
}
|
||||||
|
|
||||||
fuse_session_exit(ctrlr_device->session);
|
fuse_session_exit(ctrlr_device->session);
|
||||||
pthread_kill(ctrlr_device->tid, SIGHUP);
|
|
||||||
pthread_join(ctrlr_device->tid, NULL);
|
pthread_join(ctrlr_device->tid, NULL);
|
||||||
TAILQ_REMOVE(&g_ctrlr_ctx_head, ctrlr_device, tailq);
|
TAILQ_REMOVE(&g_ctrlr_ctx_head, ctrlr_device, tailq);
|
||||||
free(ctrlr_device);
|
free(ctrlr_device);
|
||||||
|
@ -23,6 +23,10 @@ $rpc_py bdev_nvme_cuse_register -n Nvme0 -p spdk/nvme0
|
|||||||
|
|
||||||
sleep 5
|
sleep 5
|
||||||
|
|
||||||
|
if [ ! -c /dev/spdk/nvme0 ]; then
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
|
||||||
$rpc_py bdev_get_bdevs
|
$rpc_py bdev_get_bdevs
|
||||||
$rpc_py bdev_nvme_get_controllers
|
$rpc_py bdev_nvme_get_controllers
|
||||||
|
|
||||||
@ -43,6 +47,31 @@ for ctrlr in $(ls /dev/spdk/nvme?); do
|
|||||||
${NVME_CMD} reset $ctrlr
|
${NVME_CMD} reset $ctrlr
|
||||||
done
|
done
|
||||||
|
|
||||||
|
if [ ! -c /dev/spdk/nvme0 ]; then
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
$rpc_py bdev_nvme_cuse_unregister -n Nvme0
|
||||||
|
sleep 1
|
||||||
|
if [ -c /dev/spdk/nvme0 ]; then
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
$rpc_py bdev_nvme_cuse_register -n Nvme0 -p spdk/nvme1
|
||||||
|
sleep 1
|
||||||
|
|
||||||
|
if [ ! -c /dev/spdk/nvme1 ]; then
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
$rpc_py bdev_nvme_cuse_unregister -n Nvme0
|
||||||
|
sleep 1
|
||||||
|
if [ -c /dev/spdk/nvme1 ]; then
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
$rpc_py bdev_nvme_detach_controller Nvme0
|
||||||
|
|
||||||
trap - SIGINT SIGTERM EXIT
|
trap - SIGINT SIGTERM EXIT
|
||||||
kill $spdk_tgt_pid
|
kill $spdk_tgt_pid
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user