[S390] cio: kernel stack overflow.
Use different kind of assignment to make sure gcc doesn't create code that creates temp variables on the stack, assigns values to it and copies the content of the whole temp variable to the destination. This reduces stack usage of e.g. ccwgroup_driver_register from 976 to 48 bytes instead. Signed-off-by: Heiko Carstens <heiko.carstens@de.ibm.com> Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com>
This commit is contained in:
parent
8f61701bdf
commit
292888c81e
|
@ -183,11 +183,9 @@ ccwgroup_create(struct device *root,
|
|||
|
||||
gdev->creator_id = creator_id;
|
||||
gdev->count = argc;
|
||||
gdev->dev = (struct device ) {
|
||||
.bus = &ccwgroup_bus_type,
|
||||
.parent = root,
|
||||
.release = ccwgroup_release,
|
||||
};
|
||||
gdev->dev.bus = &ccwgroup_bus_type;
|
||||
gdev->dev.parent = root;
|
||||
gdev->dev.release = ccwgroup_release;
|
||||
|
||||
snprintf (gdev->dev.bus_id, BUS_ID_SIZE, "%s",
|
||||
gdev->cdev[0]->dev.bus_id);
|
||||
|
@ -391,10 +389,8 @@ int
|
|||
ccwgroup_driver_register (struct ccwgroup_driver *cdriver)
|
||||
{
|
||||
/* register our new driver with the core */
|
||||
cdriver->driver = (struct device_driver) {
|
||||
.bus = &ccwgroup_bus_type,
|
||||
.name = cdriver->name,
|
||||
};
|
||||
cdriver->driver.bus = &ccwgroup_bus_type;
|
||||
cdriver->driver.name = cdriver->name;
|
||||
|
||||
return driver_register(&cdriver->driver);
|
||||
}
|
||||
|
|
|
@ -1391,10 +1391,8 @@ new_channel_path(int chpid)
|
|||
/* fill in status, etc. */
|
||||
chp->id = chpid;
|
||||
chp->state = 1;
|
||||
chp->dev = (struct device) {
|
||||
.parent = &css[0]->device,
|
||||
.release = chp_release,
|
||||
};
|
||||
chp->dev.parent = &css[0]->device;
|
||||
chp->dev.release = chp_release;
|
||||
snprintf(chp->dev.bus_id, BUS_ID_SIZE, "chp0.%x", chpid);
|
||||
|
||||
/* Obtain channel path description and fill it in. */
|
||||
|
|
|
@ -556,12 +556,11 @@ get_disc_ccwdev_by_devno(unsigned int devno, unsigned int ssid,
|
|||
struct ccw_device *sibling)
|
||||
{
|
||||
struct device *dev;
|
||||
struct match_data data = {
|
||||
.devno = devno,
|
||||
.ssid = ssid,
|
||||
.sibling = sibling,
|
||||
};
|
||||
struct match_data data;
|
||||
|
||||
data.devno = devno;
|
||||
data.ssid = ssid;
|
||||
data.sibling = sibling;
|
||||
dev = bus_find_device(&ccw_bus_type, NULL, &data, match_devno);
|
||||
|
||||
return dev ? to_ccwdev(dev) : NULL;
|
||||
|
@ -835,10 +834,8 @@ io_subchannel_probe (struct subchannel *sch)
|
|||
return -ENOMEM;
|
||||
}
|
||||
atomic_set(&cdev->private->onoff, 0);
|
||||
cdev->dev = (struct device) {
|
||||
.parent = &sch->dev,
|
||||
.release = ccw_device_release,
|
||||
};
|
||||
cdev->dev.parent = &sch->dev;
|
||||
cdev->dev.release = ccw_device_release;
|
||||
INIT_LIST_HEAD(&cdev->private->kick_work.entry);
|
||||
/* Do first half of device_register. */
|
||||
device_initialize(&cdev->dev);
|
||||
|
@ -977,9 +974,7 @@ ccw_device_console_enable (struct ccw_device *cdev, struct subchannel *sch)
|
|||
int rc;
|
||||
|
||||
/* Initialize the ccw_device structure. */
|
||||
cdev->dev = (struct device) {
|
||||
.parent = &sch->dev,
|
||||
};
|
||||
cdev->dev.parent= &sch->dev;
|
||||
rc = io_subchannel_recog(cdev, sch);
|
||||
if (rc)
|
||||
return rc;
|
||||
|
|
|
@ -267,12 +267,10 @@ ccw_device_recog_done(struct ccw_device *cdev, int state)
|
|||
notify = 1;
|
||||
}
|
||||
/* fill out sense information */
|
||||
cdev->id = (struct ccw_device_id) {
|
||||
.cu_type = cdev->private->senseid.cu_type,
|
||||
.cu_model = cdev->private->senseid.cu_model,
|
||||
.dev_type = cdev->private->senseid.dev_type,
|
||||
.dev_model = cdev->private->senseid.dev_model,
|
||||
};
|
||||
cdev->id.cu_type = cdev->private->senseid.cu_type;
|
||||
cdev->id.cu_model = cdev->private->senseid.cu_model;
|
||||
cdev->id.dev_type = cdev->private->senseid.dev_type;
|
||||
cdev->id.dev_model = cdev->private->senseid.dev_model;
|
||||
if (notify) {
|
||||
cdev->private->state = DEV_STATE_OFFLINE;
|
||||
if (same_dev) {
|
||||
|
@ -566,12 +564,10 @@ ccw_device_verify_done(struct ccw_device *cdev, int err)
|
|||
/* Deliver fake irb to device driver, if needed. */
|
||||
if (cdev->private->flags.fake_irb) {
|
||||
memset(&cdev->private->irb, 0, sizeof(struct irb));
|
||||
cdev->private->irb.scsw = (struct scsw) {
|
||||
.cc = 1,
|
||||
.fctl = SCSW_FCTL_START_FUNC,
|
||||
.actl = SCSW_ACTL_START_PEND,
|
||||
.stctl = SCSW_STCTL_STATUS_PEND,
|
||||
};
|
||||
cdev->private->irb.scsw.cc = 1;
|
||||
cdev->private->irb.scsw.fctl = SCSW_FCTL_START_FUNC;
|
||||
cdev->private->irb.scsw.actl = SCSW_ACTL_START_PEND;
|
||||
cdev->private->irb.scsw.stctl = SCSW_STCTL_STATUS_PEND;
|
||||
cdev->private->flags.fake_irb = 0;
|
||||
if (cdev->handler)
|
||||
cdev->handler(cdev, cdev->private->intparm,
|
||||
|
|
Loading…
Reference in New Issue
Block a user