[S390] cio: kernel stack overflow.
authorHeiko Carstens <heiko.carstens@de.ibm.com>
Wed, 30 Aug 2006 12:33:35 +0000 (14:33 +0200)
committerMartin Schwidefsky <schwidefsky@de.ibm.com>
Wed, 30 Aug 2006 12:33:35 +0000 (14:33 +0200)
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>
drivers/s390/cio/ccwgroup.c
drivers/s390/cio/chsc.c
drivers/s390/cio/device.c
drivers/s390/cio/device_fsm.c

index 3cba6c9fab11ce9c049cb36e24391ad36c2fe31a..38954f5cd14c8d542c92999ddcdf3fc7f6d337ef 100644 (file)
@@ -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);
 }
index 61ce3f1d522852adc7d0b0b2cc5ec795590865f7..6405e9bd6eb3056e5961d07d997b2b320fbc3553 100644 (file)
@@ -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. */
index 585fa04233c34f0325c064af7dc55ce183f696be..646da56404015d7d614b3c469c1305962ee8e085 100644 (file)
@@ -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;
index 6d91c2eb205b05b49afec7f9587f188ab55c5d0a..35e162ba6d54a7cfbd6afd988fc2a432db43f0fc 100644 (file)
@@ -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,