vhost-scsi: separatate scsi device state from scsi session state

For session context we need only a few fields from
spdk_scsi_dev_vhost_state structure, so introduce
its stripped variant as a separate structure.

Change-Id: I1be4e77447443d156f86033450892cb7cb464cb9
Signed-off-by: Pawel Wodkowski <pawelx.wodkowski@intel.com>
Signed-off-by: Darek Stojaczyk <dariusz.stojaczyk@intel.com>
Reviewed-on: https://review.gerrithub.io/c/spdk/spdk/+/447072
Tested-by: SPDK CI Jenkins <sys_sgci@intel.com>
Reviewed-by: Changpeng Liu <changpeng.liu@intel.com>
Reviewed-by: Jim Harris <james.r.harris@intel.com>
This commit is contained in:
Pawel Wodkowski 2019-03-05 09:00:30 +01:00 committed by Jim Harris
parent 3fd405c54a
commit 346b59bd40

View File

@ -81,6 +81,7 @@ enum spdk_scsi_dev_vhost_status {
VHOST_SCSI_DEV_REMOVED,
};
/** Context for a SCSI target in a vhost device */
struct spdk_scsi_dev_vhost_state {
struct spdk_scsi_dev *dev;
enum spdk_scsi_dev_vhost_status status;
@ -96,12 +97,18 @@ struct spdk_vhost_scsi_dev {
int32_t lcore;
} __rte_cache_aligned;
/** Context for a SCSI target in a vhost session */
struct spdk_scsi_dev_session_state {
struct spdk_scsi_dev *dev;
enum spdk_scsi_dev_vhost_status status;
};
struct spdk_vhost_scsi_session {
struct spdk_vhost_session vsession;
struct spdk_vhost_scsi_dev *svdev;
/** Local copy of the device state */
struct spdk_scsi_dev_vhost_state scsi_dev_state[SPDK_VHOST_SCSI_CTRLR_MAX_DEVS];
struct spdk_scsi_dev_session_state scsi_dev_state[SPDK_VHOST_SCSI_CTRLR_MAX_DEVS];
struct spdk_poller *requestq_poller;
struct spdk_poller *mgmt_poller;
struct spdk_poller *stop_poller;
@ -199,7 +206,7 @@ spdk_vhost_scsi_session_process_removed(struct spdk_vhost_dev *vdev,
{
unsigned scsi_tgt_num = (unsigned)(uintptr_t)ctx;
struct spdk_vhost_scsi_session *svsession;
struct spdk_scsi_dev_vhost_state *state;
struct spdk_scsi_dev_session_state *state;
if (vsession == NULL) {
/* all sessions have already detached the device */
@ -228,7 +235,7 @@ static void
process_removed_devs(struct spdk_vhost_scsi_session *svsession)
{
struct spdk_scsi_dev *dev;
struct spdk_scsi_dev_vhost_state *state;
struct spdk_scsi_dev_session_state *state;
int i;
for (i = 0; i < SPDK_VHOST_SCSI_CTRLR_MAX_DEVS; ++i) {
@ -379,7 +386,7 @@ static int
spdk_vhost_scsi_task_init_target(struct spdk_vhost_scsi_task *task, const __u8 *lun)
{
struct spdk_vhost_scsi_session *svsession = task->svsession;
struct spdk_scsi_dev_vhost_state *state;
struct spdk_scsi_dev_session_state *state;
uint16_t lun_id = (((uint16_t)lun[2] << 8) | lun[3]) & 0x3FFF;
SPDK_LOGDUMP(SPDK_LOG_VHOST_SCSI_QUEUE, "LUN", lun, 8);
@ -921,6 +928,8 @@ spdk_vhost_scsi_session_add_tgt(struct spdk_vhost_dev *vdev,
{
unsigned scsi_tgt_num = (unsigned)(uintptr_t)ctx;
struct spdk_vhost_scsi_session *svsession;
struct spdk_scsi_dev_vhost_state *vhost_sdev;
struct spdk_scsi_dev_session_state *session_sdev;
int rc;
if (vsession == NULL) {
@ -929,8 +938,11 @@ spdk_vhost_scsi_session_add_tgt(struct spdk_vhost_dev *vdev,
}
svsession = (struct spdk_vhost_scsi_session *)vsession;
/* copy the entire device state */
svsession->scsi_dev_state[scsi_tgt_num] = svsession->svdev->scsi_dev_state[scsi_tgt_num];
vhost_sdev = &svsession->svdev->scsi_dev_state[scsi_tgt_num];
session_sdev = &svsession->scsi_dev_state[scsi_tgt_num];
session_sdev->dev = vhost_sdev->dev;
session_sdev->status = vhost_sdev->status;
if (vsession->lcore == -1) {
/* All done. */
@ -943,11 +955,11 @@ spdk_vhost_scsi_session_add_tgt(struct spdk_vhost_dev *vdev,
scsi_tgt_num, vdev->name);
/* unset the SCSI target so that all I/O to it will be rejected */
svsession->scsi_dev_state[scsi_tgt_num].dev = NULL;
session_sdev->dev = NULL;
/* Set status to EMPTY so that we won't reply with SCSI hotremove
* sense codes - the device hasn't ever been added.
*/
svsession->scsi_dev_state[scsi_tgt_num].status = VHOST_SCSI_DEV_EMPTY;
session_sdev->status = VHOST_SCSI_DEV_EMPTY;
/* Return with no error. We'll continue allocating io_channels for
* other sessions on this device in hopes they succeed. The sessions
@ -1048,7 +1060,7 @@ spdk_vhost_scsi_session_remove_tgt(struct spdk_vhost_dev *vdev,
{
unsigned scsi_tgt_num = (unsigned)(uintptr_t)ctx;
struct spdk_vhost_scsi_session *svsession;
struct spdk_scsi_dev_vhost_state *state;
struct spdk_scsi_dev_session_state *state;
int rc = 0;
if (vsession == NULL) {
@ -1291,7 +1303,8 @@ spdk_vhost_scsi_start_cb(struct spdk_vhost_dev *vdev,
if (state->dev == NULL) {
continue;
}
svsession->scsi_dev_state[i] = *state;
svsession->scsi_dev_state[i].dev = state->dev;
svsession->scsi_dev_state[i].status = state->status;
rc = spdk_scsi_dev_allocate_io_channels(state->dev);
if (rc != 0) {
SPDK_ERRLOG("%s: failed to alloc io_channel for SCSI target %"PRIu32"\n", vdev->name, i);
@ -1356,7 +1369,7 @@ destroy_session_poller_cb(void *arg)
{
struct spdk_vhost_scsi_session *svsession = arg;
struct spdk_vhost_session *vsession = &svsession->vsession;
struct spdk_scsi_dev_vhost_state *state;
struct spdk_scsi_dev_session_state *state;
uint32_t i;
if (vsession->task_cnt > 0) {