s390/zcrypt: move ap device reset from bus to driver code
[ Upstream commit 0c874cd042
]
This patch moves the reset invocation of an ap device when
fresh detected from the ap bus to the probe() function of
the driver responsible for this device.
The virtualisation of ap devices makes it necessary to
remove unconditioned resets on fresh appearing apqn devices.
It may be that such a device is already enabled for guest
usage. So there may be a race condition between host ap bus
and guest ap bus doing the reset. This patch moves the
reset from the ap bus to the zcrypt drivers. So if there
is no zcrypt driver bound to an ap device - for example
the ap device is bound to the vfio device driver - the
ap device is untouched passed to the vfio device driver.
Signed-off-by: Harald Freudenberger <freude@linux.ibm.com>
Signed-off-by: Vasily Gorbik <gor@linux.ibm.com>
Signed-off-by: Sasha Levin <sashal@kernel.org>
This commit is contained in:
parent
1a18f3a7db
commit
557fda798e
|
@ -793,8 +793,6 @@ static int ap_device_probe(struct device *dev)
|
||||||
drvres = ap_drv->flags & AP_DRIVER_FLAG_DEFAULT;
|
drvres = ap_drv->flags & AP_DRIVER_FLAG_DEFAULT;
|
||||||
if (!!devres != !!drvres)
|
if (!!devres != !!drvres)
|
||||||
return -ENODEV;
|
return -ENODEV;
|
||||||
/* (re-)init queue's state machine */
|
|
||||||
ap_queue_reinit_state(to_ap_queue(dev));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Add queue/card to list of active queues/cards */
|
/* Add queue/card to list of active queues/cards */
|
||||||
|
|
|
@ -261,7 +261,7 @@ void ap_queue_prepare_remove(struct ap_queue *aq);
|
||||||
void ap_queue_remove(struct ap_queue *aq);
|
void ap_queue_remove(struct ap_queue *aq);
|
||||||
void ap_queue_suspend(struct ap_device *ap_dev);
|
void ap_queue_suspend(struct ap_device *ap_dev);
|
||||||
void ap_queue_resume(struct ap_device *ap_dev);
|
void ap_queue_resume(struct ap_device *ap_dev);
|
||||||
void ap_queue_reinit_state(struct ap_queue *aq);
|
void ap_queue_init_state(struct ap_queue *aq);
|
||||||
|
|
||||||
struct ap_card *ap_card_create(int id, int queue_depth, int raw_device_type,
|
struct ap_card *ap_card_create(int id, int queue_depth, int raw_device_type,
|
||||||
int comp_device_type, unsigned int functions);
|
int comp_device_type, unsigned int functions);
|
||||||
|
|
|
@ -638,7 +638,7 @@ struct ap_queue *ap_queue_create(ap_qid_t qid, int device_type)
|
||||||
aq->ap_dev.device.type = &ap_queue_type;
|
aq->ap_dev.device.type = &ap_queue_type;
|
||||||
aq->ap_dev.device_type = device_type;
|
aq->ap_dev.device_type = device_type;
|
||||||
aq->qid = qid;
|
aq->qid = qid;
|
||||||
aq->state = AP_STATE_RESET_START;
|
aq->state = AP_STATE_UNBOUND;
|
||||||
aq->interrupt = AP_INTR_DISABLED;
|
aq->interrupt = AP_INTR_DISABLED;
|
||||||
spin_lock_init(&aq->lock);
|
spin_lock_init(&aq->lock);
|
||||||
INIT_LIST_HEAD(&aq->list);
|
INIT_LIST_HEAD(&aq->list);
|
||||||
|
@ -771,10 +771,11 @@ void ap_queue_remove(struct ap_queue *aq)
|
||||||
spin_unlock_bh(&aq->lock);
|
spin_unlock_bh(&aq->lock);
|
||||||
}
|
}
|
||||||
|
|
||||||
void ap_queue_reinit_state(struct ap_queue *aq)
|
void ap_queue_init_state(struct ap_queue *aq)
|
||||||
{
|
{
|
||||||
spin_lock_bh(&aq->lock);
|
spin_lock_bh(&aq->lock);
|
||||||
aq->state = AP_STATE_RESET_START;
|
aq->state = AP_STATE_RESET_START;
|
||||||
ap_wait(ap_sm_event(aq, AP_EVENT_POLL));
|
ap_wait(ap_sm_event(aq, AP_EVENT_POLL));
|
||||||
spin_unlock_bh(&aq->lock);
|
spin_unlock_bh(&aq->lock);
|
||||||
}
|
}
|
||||||
|
EXPORT_SYMBOL(ap_queue_init_state);
|
||||||
|
|
|
@ -175,6 +175,7 @@ static int zcrypt_cex2a_queue_probe(struct ap_device *ap_dev)
|
||||||
zq->queue = aq;
|
zq->queue = aq;
|
||||||
zq->online = 1;
|
zq->online = 1;
|
||||||
atomic_set(&zq->load, 0);
|
atomic_set(&zq->load, 0);
|
||||||
|
ap_queue_init_state(aq);
|
||||||
ap_queue_init_reply(aq, &zq->reply);
|
ap_queue_init_reply(aq, &zq->reply);
|
||||||
aq->request_timeout = CEX2A_CLEANUP_TIME,
|
aq->request_timeout = CEX2A_CLEANUP_TIME,
|
||||||
aq->private = zq;
|
aq->private = zq;
|
||||||
|
|
|
@ -220,6 +220,7 @@ static int zcrypt_cex2c_queue_probe(struct ap_device *ap_dev)
|
||||||
zq->queue = aq;
|
zq->queue = aq;
|
||||||
zq->online = 1;
|
zq->online = 1;
|
||||||
atomic_set(&zq->load, 0);
|
atomic_set(&zq->load, 0);
|
||||||
|
ap_rapq(aq->qid);
|
||||||
rc = zcrypt_cex2c_rng_supported(aq);
|
rc = zcrypt_cex2c_rng_supported(aq);
|
||||||
if (rc < 0) {
|
if (rc < 0) {
|
||||||
zcrypt_queue_free(zq);
|
zcrypt_queue_free(zq);
|
||||||
|
@ -231,6 +232,7 @@ static int zcrypt_cex2c_queue_probe(struct ap_device *ap_dev)
|
||||||
else
|
else
|
||||||
zq->ops = zcrypt_msgtype(MSGTYPE06_NAME,
|
zq->ops = zcrypt_msgtype(MSGTYPE06_NAME,
|
||||||
MSGTYPE06_VARIANT_NORNG);
|
MSGTYPE06_VARIANT_NORNG);
|
||||||
|
ap_queue_init_state(aq);
|
||||||
ap_queue_init_reply(aq, &zq->reply);
|
ap_queue_init_reply(aq, &zq->reply);
|
||||||
aq->request_timeout = CEX2C_CLEANUP_TIME;
|
aq->request_timeout = CEX2C_CLEANUP_TIME;
|
||||||
aq->private = zq;
|
aq->private = zq;
|
||||||
|
|
|
@ -381,6 +381,7 @@ static int zcrypt_cex4_queue_probe(struct ap_device *ap_dev)
|
||||||
zq->queue = aq;
|
zq->queue = aq;
|
||||||
zq->online = 1;
|
zq->online = 1;
|
||||||
atomic_set(&zq->load, 0);
|
atomic_set(&zq->load, 0);
|
||||||
|
ap_queue_init_state(aq);
|
||||||
ap_queue_init_reply(aq, &zq->reply);
|
ap_queue_init_reply(aq, &zq->reply);
|
||||||
aq->request_timeout = CEX4_CLEANUP_TIME,
|
aq->request_timeout = CEX4_CLEANUP_TIME,
|
||||||
aq->private = zq;
|
aq->private = zq;
|
||||||
|
|
Loading…
Reference in New Issue