You've already forked linux-apfs
mirror of
https://github.com/linux-apfs/linux-apfs.git
synced 2026-05-01 15:00:59 -07:00
Merge branch 'for-linus' of git://git390.osdl.marist.edu/pub/scm/linux-2.6
* 'for-linus' of git://git390.osdl.marist.edu/pub/scm/linux-2.6: [S390] zcrypt: fix possible race when unloading zcrypt driver modules [S390] zcrypt: fix possible dead lock in AP bus module [S390] Wire up sys_utimes. [S390] reboot from and dump to SCSI under z/VM fails. [S390] Wire up compat_sys_epoll_pwait. [S390] strlcpy is smart enough [S390] memory detection: fix off by one bug. [S390] cio: qdio slsb setup
This commit is contained in:
+18
-8
@@ -210,9 +210,11 @@ again:
|
||||
goto again;
|
||||
}
|
||||
if (rc < 0) {
|
||||
QDIO_DBF_TEXT3(1,trace,"sqberr");
|
||||
sprintf(dbf_text,"%2x,%2x,%d,%d",tmp_cnt,*cnt,ccq,q_no);
|
||||
QDIO_DBF_TEXT3(1,trace,dbf_text);
|
||||
QDIO_DBF_TEXT3(1,trace,"sqberr");
|
||||
sprintf(dbf_text,"%2x,%2x",tmp_cnt,*cnt);
|
||||
QDIO_DBF_TEXT3(1,trace,dbf_text);
|
||||
sprintf(dbf_text,"%d,%d",ccq,q_no);
|
||||
QDIO_DBF_TEXT3(1,trace,dbf_text);
|
||||
q->handler(q->cdev,QDIO_STATUS_ACTIVATE_CHECK_CONDITION|
|
||||
QDIO_STATUS_LOOK_FOR_ERROR,
|
||||
0, 0, 0, -1, -1, q->int_parm);
|
||||
@@ -1250,7 +1252,6 @@ qdio_is_inbound_q_done(struct qdio_q *q)
|
||||
if (!no_used) {
|
||||
QDIO_DBF_TEXT4(0,trace,"inqisdnA");
|
||||
QDIO_DBF_HEX4(0,trace,&q,sizeof(void*));
|
||||
QDIO_DBF_TEXT4(0,trace,dbf_text);
|
||||
return 1;
|
||||
}
|
||||
if (irq->is_qebsm) {
|
||||
@@ -3371,10 +3372,15 @@ qdio_do_qdio_fill_input(struct qdio_q *q, unsigned int qidx,
|
||||
unsigned int count, struct qdio_buffer *buffers)
|
||||
{
|
||||
struct qdio_irq *irq = (struct qdio_irq *) q->irq_ptr;
|
||||
int tmp = 0;
|
||||
|
||||
qidx &= (QDIO_MAX_BUFFERS_PER_Q - 1);
|
||||
if (irq->is_qebsm) {
|
||||
while (count)
|
||||
set_slsb(q, &qidx, SLSB_CU_INPUT_EMPTY, &count);
|
||||
while (count) {
|
||||
tmp = set_slsb(q, &qidx, SLSB_CU_INPUT_EMPTY, &count);
|
||||
if (!tmp)
|
||||
return;
|
||||
}
|
||||
return;
|
||||
}
|
||||
for (;;) {
|
||||
@@ -3390,11 +3396,15 @@ qdio_do_qdio_fill_output(struct qdio_q *q, unsigned int qidx,
|
||||
unsigned int count, struct qdio_buffer *buffers)
|
||||
{
|
||||
struct qdio_irq *irq = (struct qdio_irq *) q->irq_ptr;
|
||||
int tmp = 0;
|
||||
|
||||
qidx &= (QDIO_MAX_BUFFERS_PER_Q - 1);
|
||||
if (irq->is_qebsm) {
|
||||
while (count)
|
||||
set_slsb(q, &qidx, SLSB_CU_OUTPUT_PRIMED, &count);
|
||||
while (count) {
|
||||
tmp = set_slsb(q, &qidx, SLSB_CU_OUTPUT_PRIMED, &count);
|
||||
if (!tmp)
|
||||
return;
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
@@ -65,6 +65,8 @@ module_param_named(poll_thread, ap_thread_flag, int, 0000);
|
||||
MODULE_PARM_DESC(poll_thread, "Turn on/off poll thread, default is 1 (on).");
|
||||
|
||||
static struct device *ap_root_device = NULL;
|
||||
static DEFINE_SPINLOCK(ap_device_lock);
|
||||
static LIST_HEAD(ap_device_list);
|
||||
|
||||
/**
|
||||
* Workqueue & timer for bus rescan.
|
||||
@@ -457,6 +459,9 @@ static int ap_device_probe(struct device *dev)
|
||||
int rc;
|
||||
|
||||
ap_dev->drv = ap_drv;
|
||||
spin_lock_bh(&ap_device_lock);
|
||||
list_add(&ap_dev->list, &ap_device_list);
|
||||
spin_unlock_bh(&ap_device_lock);
|
||||
rc = ap_drv->probe ? ap_drv->probe(ap_dev) : -ENODEV;
|
||||
return rc;
|
||||
}
|
||||
@@ -497,6 +502,9 @@ static int ap_device_remove(struct device *dev)
|
||||
ap_flush_queue(ap_dev);
|
||||
if (ap_drv->remove)
|
||||
ap_drv->remove(ap_dev);
|
||||
spin_lock_bh(&ap_device_lock);
|
||||
list_del_init(&ap_dev->list);
|
||||
spin_unlock_bh(&ap_device_lock);
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -772,6 +780,7 @@ static void ap_scan_bus(struct work_struct *unused)
|
||||
spin_lock_init(&ap_dev->lock);
|
||||
INIT_LIST_HEAD(&ap_dev->pendingq);
|
||||
INIT_LIST_HEAD(&ap_dev->requestq);
|
||||
INIT_LIST_HEAD(&ap_dev->list);
|
||||
if (device_type == 0)
|
||||
ap_probe_device_type(ap_dev);
|
||||
else
|
||||
@@ -1033,14 +1042,13 @@ static void ap_poll_timeout(unsigned long unused)
|
||||
* polling until bit 2^0 of the control flags is not set. If bit 2^1
|
||||
* of the control flags has been set arm the poll timer.
|
||||
*/
|
||||
static int __ap_poll_all(struct device *dev, void *data)
|
||||
static int __ap_poll_all(struct ap_device *ap_dev, unsigned long *flags)
|
||||
{
|
||||
struct ap_device *ap_dev = to_ap_dev(dev);
|
||||
int rc;
|
||||
|
||||
spin_lock(&ap_dev->lock);
|
||||
if (!ap_dev->unregistered) {
|
||||
rc = ap_poll_queue(to_ap_dev(dev), (unsigned long *) data);
|
||||
rc = ap_poll_queue(ap_dev, flags);
|
||||
if (rc)
|
||||
ap_dev->unregistered = 1;
|
||||
} else
|
||||
@@ -1054,10 +1062,15 @@ static int __ap_poll_all(struct device *dev, void *data)
|
||||
static void ap_poll_all(unsigned long dummy)
|
||||
{
|
||||
unsigned long flags;
|
||||
struct ap_device *ap_dev;
|
||||
|
||||
do {
|
||||
flags = 0;
|
||||
bus_for_each_dev(&ap_bus_type, NULL, &flags, __ap_poll_all);
|
||||
spin_lock(&ap_device_lock);
|
||||
list_for_each_entry(ap_dev, &ap_device_list, list) {
|
||||
__ap_poll_all(ap_dev, &flags);
|
||||
}
|
||||
spin_unlock(&ap_device_lock);
|
||||
} while (flags & 1);
|
||||
if (flags & 2)
|
||||
ap_schedule_poll_timer();
|
||||
@@ -1075,6 +1088,7 @@ static int ap_poll_thread(void *data)
|
||||
DECLARE_WAITQUEUE(wait, current);
|
||||
unsigned long flags;
|
||||
int requests;
|
||||
struct ap_device *ap_dev;
|
||||
|
||||
set_user_nice(current, 19);
|
||||
while (1) {
|
||||
@@ -1092,10 +1106,12 @@ static int ap_poll_thread(void *data)
|
||||
set_current_state(TASK_RUNNING);
|
||||
remove_wait_queue(&ap_poll_wait, &wait);
|
||||
|
||||
local_bh_disable();
|
||||
flags = 0;
|
||||
bus_for_each_dev(&ap_bus_type, NULL, &flags, __ap_poll_all);
|
||||
local_bh_enable();
|
||||
spin_lock_bh(&ap_device_lock);
|
||||
list_for_each_entry(ap_dev, &ap_device_list, list) {
|
||||
__ap_poll_all(ap_dev, &flags);
|
||||
}
|
||||
spin_unlock_bh(&ap_device_lock);
|
||||
}
|
||||
set_current_state(TASK_RUNNING);
|
||||
remove_wait_queue(&ap_poll_wait, &wait);
|
||||
|
||||
@@ -106,6 +106,7 @@ struct ap_device {
|
||||
struct device device;
|
||||
struct ap_driver *drv; /* Pointer to AP device driver. */
|
||||
spinlock_t lock; /* Per device lock. */
|
||||
struct list_head list; /* private list of all AP devices. */
|
||||
|
||||
ap_qid_t qid; /* AP queue id. */
|
||||
int queue_depth; /* AP queue depth.*/
|
||||
|
||||
@@ -298,14 +298,14 @@ static long zcrypt_rsa_modexpo(struct ica_rsa_modexpo *mex)
|
||||
get_device(&zdev->ap_dev->device);
|
||||
zdev->request_count++;
|
||||
__zcrypt_decrease_preference(zdev);
|
||||
spin_unlock_bh(&zcrypt_device_lock);
|
||||
if (try_module_get(zdev->ap_dev->drv->driver.owner)) {
|
||||
spin_unlock_bh(&zcrypt_device_lock);
|
||||
rc = zdev->ops->rsa_modexpo(zdev, mex);
|
||||
spin_lock_bh(&zcrypt_device_lock);
|
||||
module_put(zdev->ap_dev->drv->driver.owner);
|
||||
}
|
||||
else
|
||||
rc = -EAGAIN;
|
||||
spin_lock_bh(&zcrypt_device_lock);
|
||||
zdev->request_count--;
|
||||
__zcrypt_increase_preference(zdev);
|
||||
put_device(&zdev->ap_dev->device);
|
||||
@@ -373,14 +373,14 @@ static long zcrypt_rsa_crt(struct ica_rsa_modexpo_crt *crt)
|
||||
get_device(&zdev->ap_dev->device);
|
||||
zdev->request_count++;
|
||||
__zcrypt_decrease_preference(zdev);
|
||||
spin_unlock_bh(&zcrypt_device_lock);
|
||||
if (try_module_get(zdev->ap_dev->drv->driver.owner)) {
|
||||
spin_unlock_bh(&zcrypt_device_lock);
|
||||
rc = zdev->ops->rsa_modexpo_crt(zdev, crt);
|
||||
spin_lock_bh(&zcrypt_device_lock);
|
||||
module_put(zdev->ap_dev->drv->driver.owner);
|
||||
}
|
||||
else
|
||||
rc = -EAGAIN;
|
||||
spin_lock_bh(&zcrypt_device_lock);
|
||||
zdev->request_count--;
|
||||
__zcrypt_increase_preference(zdev);
|
||||
put_device(&zdev->ap_dev->device);
|
||||
@@ -408,14 +408,14 @@ static long zcrypt_send_cprb(struct ica_xcRB *xcRB)
|
||||
get_device(&zdev->ap_dev->device);
|
||||
zdev->request_count++;
|
||||
__zcrypt_decrease_preference(zdev);
|
||||
spin_unlock_bh(&zcrypt_device_lock);
|
||||
if (try_module_get(zdev->ap_dev->drv->driver.owner)) {
|
||||
spin_unlock_bh(&zcrypt_device_lock);
|
||||
rc = zdev->ops->send_cprb(zdev, xcRB);
|
||||
spin_lock_bh(&zcrypt_device_lock);
|
||||
module_put(zdev->ap_dev->drv->driver.owner);
|
||||
}
|
||||
else
|
||||
rc = -EAGAIN;
|
||||
spin_lock_bh(&zcrypt_device_lock);
|
||||
zdev->request_count--;
|
||||
__zcrypt_increase_preference(zdev);
|
||||
put_device(&zdev->ap_dev->device);
|
||||
|
||||
Reference in New Issue
Block a user