Merge branch 'for-linus' of git://git390.marist.edu/pub/scm/linux-2.6
* 'for-linus' of git://git390.marist.edu/pub/scm/linux-2.6: [S390] compile fix for latest binutils [S390] cio: prevent purging of CCW devices in the online state [S390] qdio: fix init sequence [S390] Fix parameter passing for smp_switch_to_cpu() [S390] oprofile s390: prevent stack corruption
This commit is contained in:
Коммит
bb3c90f0de
|
@ -460,7 +460,7 @@ startup:
|
||||||
#ifndef CONFIG_MARCH_G5
|
#ifndef CONFIG_MARCH_G5
|
||||||
# check capabilities against MARCH_{G5,Z900,Z990,Z9_109,Z10}
|
# check capabilities against MARCH_{G5,Z900,Z990,Z9_109,Z10}
|
||||||
xc __LC_STFL_FAC_LIST(8),__LC_STFL_FAC_LIST
|
xc __LC_STFL_FAC_LIST(8),__LC_STFL_FAC_LIST
|
||||||
stfl __LC_STFL_FAC_LIST # store facility list
|
.insn s,0xb2b10000,__LC_STFL_FAC_LIST # store facility list
|
||||||
tm __LC_STFL_FAC_LIST,0x01 # stfle available ?
|
tm __LC_STFL_FAC_LIST,0x01 # stfle available ?
|
||||||
jz 0f
|
jz 0f
|
||||||
la %r0,0
|
la %r0,0
|
||||||
|
|
|
@ -46,7 +46,9 @@ smp_restart_cpu:
|
||||||
ltr %r4,%r4 /* New stack ? */
|
ltr %r4,%r4 /* New stack ? */
|
||||||
jz 1f
|
jz 1f
|
||||||
lr %r15,%r4
|
lr %r15,%r4
|
||||||
1: basr %r14,%r2
|
1: lr %r14,%r2 /* r14: Function to call */
|
||||||
|
lr %r2,%r3 /* r2 : Parameter for function*/
|
||||||
|
basr %r14,%r14 /* Call function */
|
||||||
|
|
||||||
.gprregs_addr:
|
.gprregs_addr:
|
||||||
.long .gprregs
|
.long .gprregs
|
||||||
|
|
|
@ -42,7 +42,9 @@ smp_restart_cpu:
|
||||||
ltgr %r4,%r4 /* New stack ? */
|
ltgr %r4,%r4 /* New stack ? */
|
||||||
jz 1f
|
jz 1f
|
||||||
lgr %r15,%r4
|
lgr %r15,%r4
|
||||||
1: basr %r14,%r2
|
1: lgr %r14,%r2 /* r14: Function to call */
|
||||||
|
lgr %r2,%r3 /* r2 : Parameter for function*/
|
||||||
|
basr %r14,%r14 /* Call function */
|
||||||
|
|
||||||
.section .data,"aw",@progbits
|
.section .data,"aw",@progbits
|
||||||
.gprregs:
|
.gprregs:
|
||||||
|
|
|
@ -517,12 +517,8 @@ stop_exit:
|
||||||
|
|
||||||
static int check_hardware_prerequisites(void)
|
static int check_hardware_prerequisites(void)
|
||||||
{
|
{
|
||||||
unsigned long long facility_bits[2];
|
if (!test_facility(68))
|
||||||
|
|
||||||
memcpy(facility_bits, S390_lowcore.stfle_fac_list, 32);
|
|
||||||
if (!(facility_bits[1] & (1ULL << 59)))
|
|
||||||
return -EOPNOTSUPP;
|
return -EOPNOTSUPP;
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
/*
|
/*
|
||||||
|
|
|
@ -541,15 +541,24 @@ static ssize_t online_store (struct device *dev, struct device_attribute *attr,
|
||||||
int force, ret;
|
int force, ret;
|
||||||
unsigned long i;
|
unsigned long i;
|
||||||
|
|
||||||
if (!dev_fsm_final_state(cdev) &&
|
/* Prevent conflict between multiple on-/offline processing requests. */
|
||||||
cdev->private->state != DEV_STATE_DISCONNECTED)
|
|
||||||
return -EAGAIN;
|
|
||||||
if (atomic_cmpxchg(&cdev->private->onoff, 0, 1) != 0)
|
if (atomic_cmpxchg(&cdev->private->onoff, 0, 1) != 0)
|
||||||
return -EAGAIN;
|
return -EAGAIN;
|
||||||
|
/* Prevent conflict between internal I/Os and on-/offline processing. */
|
||||||
|
if (!dev_fsm_final_state(cdev) &&
|
||||||
|
cdev->private->state != DEV_STATE_DISCONNECTED) {
|
||||||
|
ret = -EAGAIN;
|
||||||
|
goto out_onoff;
|
||||||
|
}
|
||||||
|
/* Prevent conflict between pending work and on-/offline processing.*/
|
||||||
|
if (work_pending(&cdev->private->todo_work)) {
|
||||||
|
ret = -EAGAIN;
|
||||||
|
goto out_onoff;
|
||||||
|
}
|
||||||
|
|
||||||
if (cdev->drv && !try_module_get(cdev->drv->driver.owner)) {
|
if (cdev->drv && !try_module_get(cdev->drv->driver.owner)) {
|
||||||
atomic_set(&cdev->private->onoff, 0);
|
ret = -EINVAL;
|
||||||
return -EINVAL;
|
goto out_onoff;
|
||||||
}
|
}
|
||||||
if (!strncmp(buf, "force\n", count)) {
|
if (!strncmp(buf, "force\n", count)) {
|
||||||
force = 1;
|
force = 1;
|
||||||
|
@ -574,6 +583,7 @@ static ssize_t online_store (struct device *dev, struct device_attribute *attr,
|
||||||
out:
|
out:
|
||||||
if (cdev->drv)
|
if (cdev->drv)
|
||||||
module_put(cdev->drv->driver.owner);
|
module_put(cdev->drv->driver.owner);
|
||||||
|
out_onoff:
|
||||||
atomic_set(&cdev->private->onoff, 0);
|
atomic_set(&cdev->private->onoff, 0);
|
||||||
return (ret < 0) ? ret : count;
|
return (ret < 0) ? ret : count;
|
||||||
}
|
}
|
||||||
|
@ -1311,10 +1321,12 @@ static int purge_fn(struct device *dev, void *data)
|
||||||
|
|
||||||
spin_lock_irq(cdev->ccwlock);
|
spin_lock_irq(cdev->ccwlock);
|
||||||
if (is_blacklisted(id->ssid, id->devno) &&
|
if (is_blacklisted(id->ssid, id->devno) &&
|
||||||
(cdev->private->state == DEV_STATE_OFFLINE)) {
|
(cdev->private->state == DEV_STATE_OFFLINE) &&
|
||||||
|
(atomic_cmpxchg(&cdev->private->onoff, 0, 1) == 0)) {
|
||||||
CIO_MSG_EVENT(3, "ccw: purging 0.%x.%04x\n", id->ssid,
|
CIO_MSG_EVENT(3, "ccw: purging 0.%x.%04x\n", id->ssid,
|
||||||
id->devno);
|
id->devno);
|
||||||
ccw_device_sched_todo(cdev, CDEV_TODO_UNREG);
|
ccw_device_sched_todo(cdev, CDEV_TODO_UNREG);
|
||||||
|
atomic_set(&cdev->private->onoff, 0);
|
||||||
}
|
}
|
||||||
spin_unlock_irq(cdev->ccwlock);
|
spin_unlock_irq(cdev->ccwlock);
|
||||||
/* Abort loop in case of pending signal. */
|
/* Abort loop in case of pending signal. */
|
||||||
|
|
|
@ -1649,26 +1649,26 @@ static int __init init_QDIO(void)
|
||||||
{
|
{
|
||||||
int rc;
|
int rc;
|
||||||
|
|
||||||
rc = qdio_setup_init();
|
rc = qdio_debug_init();
|
||||||
if (rc)
|
if (rc)
|
||||||
return rc;
|
return rc;
|
||||||
|
rc = qdio_setup_init();
|
||||||
|
if (rc)
|
||||||
|
goto out_debug;
|
||||||
rc = tiqdio_allocate_memory();
|
rc = tiqdio_allocate_memory();
|
||||||
if (rc)
|
if (rc)
|
||||||
goto out_cache;
|
goto out_cache;
|
||||||
rc = qdio_debug_init();
|
|
||||||
if (rc)
|
|
||||||
goto out_ti;
|
|
||||||
rc = tiqdio_register_thinints();
|
rc = tiqdio_register_thinints();
|
||||||
if (rc)
|
if (rc)
|
||||||
goto out_debug;
|
goto out_ti;
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
out_debug:
|
|
||||||
qdio_debug_exit();
|
|
||||||
out_ti:
|
out_ti:
|
||||||
tiqdio_free_memory();
|
tiqdio_free_memory();
|
||||||
out_cache:
|
out_cache:
|
||||||
qdio_setup_exit();
|
qdio_setup_exit();
|
||||||
|
out_debug:
|
||||||
|
qdio_debug_exit();
|
||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1676,8 +1676,8 @@ static void __exit exit_QDIO(void)
|
||||||
{
|
{
|
||||||
tiqdio_unregister_thinints();
|
tiqdio_unregister_thinints();
|
||||||
tiqdio_free_memory();
|
tiqdio_free_memory();
|
||||||
qdio_debug_exit();
|
|
||||||
qdio_setup_exit();
|
qdio_setup_exit();
|
||||||
|
qdio_debug_exit();
|
||||||
}
|
}
|
||||||
|
|
||||||
module_init(init_QDIO);
|
module_init(init_QDIO);
|
||||||
|
|
Загрузка…
Ссылка в новой задаче