Merge tag 's390-5.1-1' of git://git.kernel.org/pub/scm/linux/kernel/git/s390/linux
Pull s390 updates from Martin Schwidefsky: - A copy of Arnds compat wrapper generation series - Pass information about the KVM guest to the host in form the control program code and the control program version code - Map IOV resources to support PCI physical functions on s390 - Add vector load and store alignment hints to improve performance - Use the "jdd" constraint with gcc 9 to make jump labels working again - Remove amode workaround for old z/VM releases from the DCSS code - Add support for in-kernel performance measurements using the CPU measurement counter facility - Introduce a new PMU device cpum_cf_diag to capture counters and store thenn as event raw data. - Bug fixes and cleanups * tag 's390-5.1-1' of git://git.kernel.org/pub/scm/linux/kernel/git/s390/linux: (54 commits) Revert "s390/cpum_cf: Add kernel message exaplanations" s390/dasd: fix read device characteristic with CONFIG_VMAP_STACK=y s390/suspend: fix prefix register reset in swsusp_arch_resume s390: warn about clearing als implied facilities s390: allow overriding facilities via command line s390: clean up redundant facilities list setup s390/als: remove duplicated in-place implementation of stfle s390/cio: Use cpa range elsewhere within vfio-ccw s390/cio: Fix vfio-ccw handling of recursive TICs s390: vfio_ap: link the vfio_ap devices to the vfio_ap bus subsystem s390/cpum_cf: Handle EBUSY return code from CPU counter facility reservation s390/cpum_cf: Add kernel message exaplanations s390/cpum_cf_diag: Add support for s390 counter facility diagnostic trace s390/cpum_cf: add ctr_stcctm() function s390/cpum_cf: move common functions into a separate file s390/cpum_cf: introduce kernel_cpumcf_avail() function s390/cpu_mf: replace stcctm5() with the stcctm() function s390/cpu_mf: add store cpu counter multiple instruction support s390/cpum_cf: Add minimal in-kernel interface for counter measurements s390/cpum_cf: introduce kernel_cpumcf_alert() to obtain measurement alerts ...
This commit is contained in:
@@ -1335,6 +1335,16 @@ static int __match_queue_device_with_qid(struct device *dev, void *data)
|
||||
return is_queue_dev(dev) && to_ap_queue(dev)->qid == (int)(long) data;
|
||||
}
|
||||
|
||||
/*
|
||||
* Helper function to be used with bus_find_dev
|
||||
* matches any queue device with given queue id
|
||||
*/
|
||||
static int __match_queue_device_with_queue_id(struct device *dev, void *data)
|
||||
{
|
||||
return is_queue_dev(dev)
|
||||
&& AP_QID_QUEUE(to_ap_queue(dev)->qid) == (int)(long) data;
|
||||
}
|
||||
|
||||
/*
|
||||
* Helper function for ap_scan_bus().
|
||||
* Does the scan bus job for the given adapter id.
|
||||
@@ -1435,8 +1445,13 @@ static void _ap_scan_bus_adapter(int id)
|
||||
borked = aq->state == AP_STATE_BORKED;
|
||||
spin_unlock_bh(&aq->lock);
|
||||
}
|
||||
if (borked) /* Remove broken device */
|
||||
if (borked) {
|
||||
/* Remove broken device */
|
||||
AP_DBF(DBF_DEBUG,
|
||||
"removing broken queue=%02x.%04x\n",
|
||||
id, dom);
|
||||
device_unregister(dev);
|
||||
}
|
||||
put_device(dev);
|
||||
continue;
|
||||
}
|
||||
@@ -1506,7 +1521,7 @@ static void ap_scan_bus(struct work_struct *unused)
|
||||
struct device *dev =
|
||||
bus_find_device(&ap_bus_type, NULL,
|
||||
(void *)(long) ap_domain_index,
|
||||
__match_queue_device_with_qid);
|
||||
__match_queue_device_with_queue_id);
|
||||
if (dev)
|
||||
put_device(dev);
|
||||
else
|
||||
|
@@ -91,7 +91,8 @@ enum ap_state {
|
||||
AP_STATE_WORKING,
|
||||
AP_STATE_QUEUE_FULL,
|
||||
AP_STATE_SUSPEND_WAIT,
|
||||
AP_STATE_BORKED,
|
||||
AP_STATE_UNBOUND, /* momentary not bound to a driver */
|
||||
AP_STATE_BORKED, /* broken */
|
||||
NR_AP_STATES
|
||||
};
|
||||
|
||||
|
@@ -420,6 +420,10 @@ static ap_func_t *ap_jumptable[NR_AP_STATES][NR_AP_EVENTS] = {
|
||||
[AP_EVENT_POLL] = ap_sm_suspend_read,
|
||||
[AP_EVENT_TIMEOUT] = ap_sm_nop,
|
||||
},
|
||||
[AP_STATE_UNBOUND] = {
|
||||
[AP_EVENT_POLL] = ap_sm_nop,
|
||||
[AP_EVENT_TIMEOUT] = ap_sm_nop,
|
||||
},
|
||||
[AP_STATE_BORKED] = {
|
||||
[AP_EVENT_POLL] = ap_sm_nop,
|
||||
[AP_EVENT_TIMEOUT] = ap_sm_nop,
|
||||
@@ -725,6 +729,7 @@ static void __ap_flush_queue(struct ap_queue *aq)
|
||||
ap_msg->rc = -EAGAIN;
|
||||
ap_msg->receive(aq, ap_msg, NULL);
|
||||
}
|
||||
aq->queue_count = 0;
|
||||
}
|
||||
|
||||
void ap_flush_queue(struct ap_queue *aq)
|
||||
@@ -743,7 +748,7 @@ void ap_queue_remove(struct ap_queue *aq)
|
||||
/* reset with zero, also clears irq registration */
|
||||
spin_lock_bh(&aq->lock);
|
||||
ap_zapq(aq->qid);
|
||||
aq->state = AP_STATE_BORKED;
|
||||
aq->state = AP_STATE_UNBOUND;
|
||||
spin_unlock_bh(&aq->lock);
|
||||
}
|
||||
EXPORT_SYMBOL(ap_queue_remove);
|
||||
|
@@ -1079,7 +1079,7 @@ int pkey_verifykey(const struct pkey_seckey *seckey,
|
||||
rc = mkvp_cache_fetch(cardnr, domain, mkvp);
|
||||
if (rc)
|
||||
goto out;
|
||||
if (t->mkvp == mkvp[1]) {
|
||||
if (t->mkvp == mkvp[1] && t->mkvp != mkvp[0]) {
|
||||
DEBUG_DBG("%s secure key has old mkvp\n", __func__);
|
||||
if (pattributes)
|
||||
*pattributes |= PKEY_VERIFY_ATTR_OLD_MKVP;
|
||||
|
@@ -15,7 +15,6 @@
|
||||
#include "vfio_ap_private.h"
|
||||
|
||||
#define VFIO_AP_ROOT_NAME "vfio_ap"
|
||||
#define VFIO_AP_DEV_TYPE_NAME "ap_matrix"
|
||||
#define VFIO_AP_DEV_NAME "matrix"
|
||||
|
||||
MODULE_AUTHOR("IBM Corporation");
|
||||
@@ -24,10 +23,6 @@ MODULE_LICENSE("GPL v2");
|
||||
|
||||
static struct ap_driver vfio_ap_drv;
|
||||
|
||||
static struct device_type vfio_ap_dev_type = {
|
||||
.name = VFIO_AP_DEV_TYPE_NAME,
|
||||
};
|
||||
|
||||
struct ap_matrix_dev *matrix_dev;
|
||||
|
||||
/* Only type 10 adapters (CEX4 and later) are supported
|
||||
@@ -62,6 +57,22 @@ static void vfio_ap_matrix_dev_release(struct device *dev)
|
||||
kfree(matrix_dev);
|
||||
}
|
||||
|
||||
static int matrix_bus_match(struct device *dev, struct device_driver *drv)
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
|
||||
static struct bus_type matrix_bus = {
|
||||
.name = "matrix",
|
||||
.match = &matrix_bus_match,
|
||||
};
|
||||
|
||||
static struct device_driver matrix_driver = {
|
||||
.name = "vfio_ap",
|
||||
.bus = &matrix_bus,
|
||||
.suppress_bind_attrs = true,
|
||||
};
|
||||
|
||||
static int vfio_ap_matrix_dev_create(void)
|
||||
{
|
||||
int ret;
|
||||
@@ -71,6 +82,10 @@ static int vfio_ap_matrix_dev_create(void)
|
||||
if (IS_ERR(root_device))
|
||||
return PTR_ERR(root_device);
|
||||
|
||||
ret = bus_register(&matrix_bus);
|
||||
if (ret)
|
||||
goto bus_register_err;
|
||||
|
||||
matrix_dev = kzalloc(sizeof(*matrix_dev), GFP_KERNEL);
|
||||
if (!matrix_dev) {
|
||||
ret = -ENOMEM;
|
||||
@@ -87,30 +102,41 @@ static int vfio_ap_matrix_dev_create(void)
|
||||
mutex_init(&matrix_dev->lock);
|
||||
INIT_LIST_HEAD(&matrix_dev->mdev_list);
|
||||
|
||||
matrix_dev->device.type = &vfio_ap_dev_type;
|
||||
dev_set_name(&matrix_dev->device, "%s", VFIO_AP_DEV_NAME);
|
||||
matrix_dev->device.parent = root_device;
|
||||
matrix_dev->device.bus = &matrix_bus;
|
||||
matrix_dev->device.release = vfio_ap_matrix_dev_release;
|
||||
matrix_dev->device.driver = &vfio_ap_drv.driver;
|
||||
matrix_dev->vfio_ap_drv = &vfio_ap_drv;
|
||||
|
||||
ret = device_register(&matrix_dev->device);
|
||||
if (ret)
|
||||
goto matrix_reg_err;
|
||||
|
||||
ret = driver_register(&matrix_driver);
|
||||
if (ret)
|
||||
goto matrix_drv_err;
|
||||
|
||||
return 0;
|
||||
|
||||
matrix_drv_err:
|
||||
device_unregister(&matrix_dev->device);
|
||||
matrix_reg_err:
|
||||
put_device(&matrix_dev->device);
|
||||
matrix_alloc_err:
|
||||
bus_unregister(&matrix_bus);
|
||||
bus_register_err:
|
||||
root_device_unregister(root_device);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static void vfio_ap_matrix_dev_destroy(void)
|
||||
{
|
||||
struct device *root_device = matrix_dev->device.parent;
|
||||
|
||||
driver_unregister(&matrix_driver);
|
||||
device_unregister(&matrix_dev->device);
|
||||
root_device_unregister(matrix_dev->device.parent);
|
||||
bus_unregister(&matrix_bus);
|
||||
root_device_unregister(root_device);
|
||||
}
|
||||
|
||||
static int __init vfio_ap_init(void)
|
||||
|
@@ -198,8 +198,8 @@ static int vfio_ap_verify_queue_reserved(unsigned long *apid,
|
||||
qres.apqi = apqi;
|
||||
qres.reserved = false;
|
||||
|
||||
ret = driver_for_each_device(matrix_dev->device.driver, NULL, &qres,
|
||||
vfio_ap_has_queue);
|
||||
ret = driver_for_each_device(&matrix_dev->vfio_ap_drv->driver, NULL,
|
||||
&qres, vfio_ap_has_queue);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
|
@@ -40,6 +40,7 @@ struct ap_matrix_dev {
|
||||
struct ap_config_info info;
|
||||
struct list_head mdev_list;
|
||||
struct mutex lock;
|
||||
struct ap_driver *vfio_ap_drv;
|
||||
};
|
||||
|
||||
extern struct ap_matrix_dev *matrix_dev;
|
||||
|
Reference in New Issue
Block a user