Commit 236fb2ab authored by Martin Schwidefsky's avatar Martin Schwidefsky
Browse files

s390/zcrypt: simplify message type handling



Now that the message type modules are linked with the zcrypt_api
into a single module the zcrypt_ops_list is initialized by
the module init function of the zcyppt.ko module. After that
the list is static and all message types are present.

Drop the zcrypt_ops_list_lock spinlock and the module handling
in regard to the message types.

Signed-off-by: default avatarMartin Schwidefsky <schwidefsky@de.ibm.com>
parent fc1d3f02
Loading
Loading
Loading
Loading
+6 −43
Original line number Diff line number Diff line
@@ -71,7 +71,6 @@ EXPORT_SYMBOL(zcrypt_rescan_req);
static int zcrypt_rng_device_add(void);
static void zcrypt_rng_device_remove(void);

static DEFINE_SPINLOCK(zcrypt_ops_list_lock);
static LIST_HEAD(zcrypt_ops_list);

static debug_info_t *zcrypt_dbf_common;
@@ -318,61 +317,25 @@ EXPORT_SYMBOL(zcrypt_device_unregister);

void zcrypt_msgtype_register(struct zcrypt_ops *zops)
{
	spin_lock_bh(&zcrypt_ops_list_lock);
	list_add_tail(&zops->list, &zcrypt_ops_list);
	spin_unlock_bh(&zcrypt_ops_list_lock);
}
EXPORT_SYMBOL(zcrypt_msgtype_register);

void zcrypt_msgtype_unregister(struct zcrypt_ops *zops)
{
	spin_lock_bh(&zcrypt_ops_list_lock);
	list_del_init(&zops->list);
	spin_unlock_bh(&zcrypt_ops_list_lock);
}
EXPORT_SYMBOL(zcrypt_msgtype_unregister);

static inline
struct zcrypt_ops *__ops_lookup(unsigned char *name, int variant)
struct zcrypt_ops *zcrypt_msgtype(unsigned char *name, int variant)
{
	struct zcrypt_ops *zops;
	int found = 0;

	spin_lock_bh(&zcrypt_ops_list_lock);
	list_for_each_entry(zops, &zcrypt_ops_list, list) {
	list_for_each_entry(zops, &zcrypt_ops_list, list)
		if ((zops->variant == variant) &&
		    (!strncmp(zops->name, name, sizeof(zops->name)))) {
			found = 1;
			break;
		}
	}
	if (!found || !try_module_get(zops->owner))
		zops = NULL;

	spin_unlock_bh(&zcrypt_ops_list_lock);

		    (!strncmp(zops->name, name, sizeof(zops->name))))
			return zops;
	return NULL;
}

struct zcrypt_ops *zcrypt_msgtype_request(unsigned char *name, int variant)
{
	struct zcrypt_ops *zops = NULL;

	zops = __ops_lookup(name, variant);
	if (!zops) {
		request_module("%s", name);
		zops = __ops_lookup(name, variant);
	}
	return zops;
}
EXPORT_SYMBOL(zcrypt_msgtype_request);

void zcrypt_msgtype_release(struct zcrypt_ops *zops)
{
	if (zops)
		module_put(zops->owner);
}
EXPORT_SYMBOL(zcrypt_msgtype_release);
EXPORT_SYMBOL(zcrypt_msgtype);

/**
 * zcrypt_read (): Not supported beyond zcrypt 1.3.1.
+1 −2
Original line number Diff line number Diff line
@@ -133,8 +133,7 @@ int zcrypt_device_register(struct zcrypt_device *);
void zcrypt_device_unregister(struct zcrypt_device *);
void zcrypt_msgtype_register(struct zcrypt_ops *);
void zcrypt_msgtype_unregister(struct zcrypt_ops *);
struct zcrypt_ops *zcrypt_msgtype_request(unsigned char *, int);
void zcrypt_msgtype_release(struct zcrypt_ops *);
struct zcrypt_ops *zcrypt_msgtype(unsigned char *, int);
int zcrypt_api_init(void);
void zcrypt_api_exit(void);

+1 −5
Original line number Diff line number Diff line
@@ -122,8 +122,7 @@ static int zcrypt_cex2a_probe(struct ap_device *ap_dev)
	}
	if (!zdev)
		return -ENODEV;
	zdev->ops = zcrypt_msgtype_request(MSGTYPE50_NAME,
					   MSGTYPE50_VARIANT_DEFAULT);
	zdev->ops = zcrypt_msgtype(MSGTYPE50_NAME, MSGTYPE50_VARIANT_DEFAULT);
	zdev->ap_dev = ap_dev;
	zdev->online = 1;
	ap_device_init_reply(ap_dev, &zdev->reply);
@@ -131,7 +130,6 @@ static int zcrypt_cex2a_probe(struct ap_device *ap_dev)
	rc = zcrypt_device_register(zdev);
	if (rc) {
		ap_dev->private = NULL;
		zcrypt_msgtype_release(zdev->ops);
		zcrypt_device_free(zdev);
	}
	return rc;
@@ -144,10 +142,8 @@ static int zcrypt_cex2a_probe(struct ap_device *ap_dev)
static void zcrypt_cex2a_remove(struct ap_device *ap_dev)
{
	struct zcrypt_device *zdev = ap_dev->private;
	struct zcrypt_ops *zops = zdev->ops;

	zcrypt_device_unregister(zdev);
	zcrypt_msgtype_release(zops);
}

int __init zcrypt_cex2a_init(void)
+6 −10
Original line number Diff line number Diff line
@@ -102,7 +102,7 @@ static int zcrypt_cex4_probe(struct ap_device *ap_dev)
					CEX4A_MAX_MOD_SIZE_2K;
			}
			zdev->short_crt = 1;
			zdev->ops = zcrypt_msgtype_request(MSGTYPE50_NAME,
			zdev->ops = zcrypt_msgtype(MSGTYPE50_NAME,
						   MSGTYPE50_VARIANT_DEFAULT);
		} else if (ap_test_bit(&ap_dev->functions, AP_FUNC_COPRO)) {
			zdev = zcrypt_device_alloc(CEX4C_MAX_MESSAGE_SIZE);
@@ -120,7 +120,7 @@ static int zcrypt_cex4_probe(struct ap_device *ap_dev)
			zdev->max_mod_size = CEX4C_MAX_MOD_SIZE;
			zdev->max_exp_bit_length = CEX4C_MAX_MOD_SIZE;
			zdev->short_crt = 0;
			zdev->ops = zcrypt_msgtype_request(MSGTYPE06_NAME,
			zdev->ops = zcrypt_msgtype(MSGTYPE06_NAME,
						   MSGTYPE06_VARIANT_DEFAULT);
		} else if (ap_test_bit(&ap_dev->functions, AP_FUNC_EP11)) {
			zdev = zcrypt_device_alloc(CEX4C_MAX_MESSAGE_SIZE);
@@ -138,7 +138,7 @@ static int zcrypt_cex4_probe(struct ap_device *ap_dev)
			zdev->max_mod_size = CEX4C_MAX_MOD_SIZE;
			zdev->max_exp_bit_length = CEX4C_MAX_MOD_SIZE;
			zdev->short_crt = 0;
			zdev->ops = zcrypt_msgtype_request(MSGTYPE06_NAME,
			zdev->ops = zcrypt_msgtype(MSGTYPE06_NAME,
						   MSGTYPE06_VARIANT_EP11);
		}
		break;
@@ -151,7 +151,6 @@ static int zcrypt_cex4_probe(struct ap_device *ap_dev)
	ap_dev->private = zdev;
	rc = zcrypt_device_register(zdev);
	if (rc) {
		zcrypt_msgtype_release(zdev->ops);
		ap_dev->private = NULL;
		zcrypt_device_free(zdev);
	}
@@ -165,12 +164,9 @@ static int zcrypt_cex4_probe(struct ap_device *ap_dev)
static void zcrypt_cex4_remove(struct ap_device *ap_dev)
{
	struct zcrypt_device *zdev = ap_dev->private;
	struct zcrypt_ops *zops;

	if (zdev) {
		zops = zdev->ops;
		zcrypt_device_unregister(zdev);
		zcrypt_msgtype_release(zops);
	}
}

+4 −7
Original line number Diff line number Diff line
@@ -322,10 +322,10 @@ static int zcrypt_pcixcc_probe(struct ap_device *ap_dev)
		return rc;
	}
	if (rc)
		zdev->ops = zcrypt_msgtype_request(MSGTYPE06_NAME,
		zdev->ops = zcrypt_msgtype(MSGTYPE06_NAME,
					   MSGTYPE06_VARIANT_DEFAULT);
	else
		zdev->ops = zcrypt_msgtype_request(MSGTYPE06_NAME,
		zdev->ops = zcrypt_msgtype(MSGTYPE06_NAME,
					   MSGTYPE06_VARIANT_NORNG);
	ap_device_init_reply(ap_dev, &zdev->reply);
	ap_dev->private = zdev;
@@ -336,7 +336,6 @@ static int zcrypt_pcixcc_probe(struct ap_device *ap_dev)

 out_free:
	ap_dev->private = NULL;
	zcrypt_msgtype_release(zdev->ops);
	zcrypt_device_free(zdev);
	return rc;
}
@@ -348,10 +347,8 @@ static int zcrypt_pcixcc_probe(struct ap_device *ap_dev)
static void zcrypt_pcixcc_remove(struct ap_device *ap_dev)
{
	struct zcrypt_device *zdev = ap_dev->private;
	struct zcrypt_ops *zops = zdev->ops;

	zcrypt_device_unregister(zdev);
	zcrypt_msgtype_release(zops);
}

int __init zcrypt_pcixcc_init(void)