Commit 3020a6fb authored by Changpeng Liu's avatar Changpeng Liu Committed by Tomasz Zawadzki
Browse files

nvme/opal: use static locking ranges table



There are maximum 8 locking ranges per TPer, so we don't need to use
calloc() for each range.

Change-Id: Ie9d96ba28736dd7a91cb615ece99ebcefa695fc8
Signed-off-by: default avatarChangpeng Liu <changpeng.liu@intel.com>
Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/1209


Tested-by: default avatarSPDK CI Jenkins <sys_sgci@intel.com>
Reviewed-by: default avatarShuhei Matsumoto <shuhei.matsumoto.xt@hitachi.com>
Reviewed-by: default avatarJim Harris <james.r.harris@intel.com>
parent 2fe1f500
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -81,6 +81,8 @@

#define SPDK_OPAL_MAX_PASSWORD_SIZE		32 /* in bytes */

#define SPDK_OPAL_MAX_LOCKING_RANGE		8 /* maximum 8 ranges defined  by spec */

/*
 * Feature Code
 */
+19 −36
Original line number Diff line number Diff line
@@ -927,11 +927,6 @@ void
spdk_opal_dev_destruct(struct spdk_opal_dev *dev)
{
	pthread_mutex_destroy(&dev->mutex_lock);
	if (dev->max_ranges > 0) {
		for (int i = 0; i < dev->max_ranges; i++) {
			spdk_opal_free_locking_range_info(dev, i);
		}
	}
	free(dev);
}

@@ -1471,27 +1466,22 @@ opal_get_max_ranges(struct spdk_opal_dev *dev)
}

static int
opal_get_locking_range_info_cb(struct spdk_opal_dev *dev, void *data)
opal_get_locking_range_info_cb(struct spdk_opal_dev *dev, void *cb_arg)
{
	int error = 0;
	uint8_t id = *(uint8_t *)data;
	struct spdk_opal_locking_range_info *info = cb_arg;

	error = opal_parse_and_check_status(dev, NULL);
	if (error) {
		return error;
	}

	if (dev->max_ranges != 0 && id > dev->max_ranges) {
		SPDK_ERRLOG("Locking range ID not valid\n");
		return -EINVAL;
	}

	dev->locking_range_info[id]->range_start = opal_response_get_u64(&dev->parsed_resp, 4);
	dev->locking_range_info[id]->range_length = opal_response_get_u64(&dev->parsed_resp, 8);
	dev->locking_range_info[id]->read_lock_enabled = opal_response_get_u8(&dev->parsed_resp, 12);
	dev->locking_range_info[id]->write_lock_enabled = opal_response_get_u8(&dev->parsed_resp, 16);
	dev->locking_range_info[id]->read_locked = opal_response_get_u8(&dev->parsed_resp, 20);
	dev->locking_range_info[id]->write_locked = opal_response_get_u8(&dev->parsed_resp, 24);
	info->range_start = opal_response_get_u64(&dev->parsed_resp, 4);
	info->range_length = opal_response_get_u64(&dev->parsed_resp, 8);
	info->read_lock_enabled = opal_response_get_u8(&dev->parsed_resp, 12);
	info->write_lock_enabled = opal_response_get_u8(&dev->parsed_resp, 16);
	info->read_locked = opal_response_get_u8(&dev->parsed_resp, 20);
	info->write_locked = opal_response_get_u8(&dev->parsed_resp, 24);

	return 0;
}
@@ -1509,19 +1499,10 @@ opal_get_locking_range_info(struct spdk_opal_dev *dev,
		return err;
	}

	if (dev->locking_range_info[locking_range_id] == NULL) {
		info = calloc(1, sizeof(struct spdk_opal_locking_range_info));
		if (info == NULL) {
			SPDK_ERRLOG("Memory allocation failed for spdk_opal_locking_range_info\n");
			return -ENOMEM;
		}
		info->locking_range_id = locking_range_id;
		dev->locking_range_info[locking_range_id] = info;
	} else {
		info = dev->locking_range_info[locking_range_id];
	assert(locking_range_id < SPDK_OPAL_MAX_LOCKING_RANGE);
	info = &dev->locking_ranges[locking_range_id];
	memset(info, 0, sizeof(*info));
	info->locking_range_id = locking_range_id;
	}

	opal_clear_cmd(dev);
	opal_set_comid(dev, dev->comid);
@@ -1549,7 +1530,7 @@ opal_get_locking_range_info(struct spdk_opal_dev *dev,
		return err;
	}

	return opal_finalize_and_send(dev, 1, opal_get_locking_range_info_cb, &locking_range_id);
	return opal_finalize_and_send(dev, 1, opal_get_locking_range_info_cb, (void *)info);
}

static int
@@ -2484,16 +2465,18 @@ spdk_opal_supported(struct spdk_opal_dev *dev)
struct spdk_opal_locking_range_info *
spdk_opal_get_locking_range_info(struct spdk_opal_dev *dev, enum spdk_opal_locking_range id)
{
	return dev->locking_range_info[id];
	assert(id < SPDK_OPAL_MAX_LOCKING_RANGE);
	return &dev->locking_ranges[id];
}

void
spdk_opal_free_locking_range_info(struct spdk_opal_dev *dev, enum spdk_opal_locking_range id)
{
	struct spdk_opal_locking_range_info *info = dev->locking_range_info[id];
	struct spdk_opal_locking_range_info *info;

	free(info);
	dev->locking_range_info[id] = NULL;
	assert(id < SPDK_OPAL_MAX_LOCKING_RANGE);
	info = &dev->locking_ranges[id];
	memset(info, 0, sizeof(*info));
}

uint8_t
+1 −2
Original line number Diff line number Diff line
@@ -42,7 +42,6 @@
#define MAX_TOKS			64
#define OPAL_KEY_MAX			256
#define OPAL_UID_LENGTH			8
#define OPAL_MAX_LRS			8 /* minimum 8 defined by spec */

#define SPDK_OPAL_TPER_TIMEOUT		600 /* seconds */

@@ -286,7 +285,7 @@ struct spdk_opal_dev {

	uint64_t timeout;   /* seconds */
	uint8_t max_ranges; /* max locking range number */
	struct spdk_opal_locking_range_info *locking_range_info[OPAL_MAX_LRS];
	struct spdk_opal_locking_range_info locking_ranges[SPDK_OPAL_MAX_LOCKING_RANGE];

	pthread_mutex_t mutex_lock; /* some structs are accessed by current thread only */
	spdk_opal_revert_cb revert_cb_fn;