netdev
[Top] [All Lists]

[PATCH] ray_cs: reduce stack usage

To: netdev@xxxxxxxxxxx, jgarzik <jgarzik@xxxxxxxxx>, corey@xxxxxxxxxxxxx
Subject: [PATCH] ray_cs: reduce stack usage
From: "Randy.Dunlap" <rddunlap@xxxxxxxx>
Date: Thu, 27 Jan 2005 21:49:46 -0800
Sender: netdev-bounce@xxxxxxxxxxx
User-agent: Mozilla Thunderbird 0.9 (X11/20041103)

ray_cs: reduce local stack usage in ray_dev_ioctl
  from 1048 to 468 (on i386) by making 'range' kmalloc-ed
  instead of an automatic stack variable.
        struct iw_range range;  // 564 bytes

Signed-off-by: Randy Dunlap <rddunlap@xxxxxxxx>

diffstat:=
 drivers/net/wireless/ray_cs.c |   35 +++++++++++++++++++++--------------
 1 files changed, 21 insertions(+), 14 deletions(-)
diff -Naurp ./drivers/net/wireless/ray_cs.c~raycs_stack 
./drivers/net/wireless/ray_cs.c
--- ./drivers/net/wireless/ray_cs.c~raycs_stack 2005-01-27 20:38:05.678592648 
-0800
+++ ./drivers/net/wireless/ray_cs.c     2005-01-27 21:05:51.637328424 -0800
@@ -1467,33 +1467,39 @@ static int ray_dev_ioctl(struct net_devi
       /* Basic checking... */
       if(wrq->u.data.pointer != (caddr_t) 0)
        {
-         struct iw_range       range;
-         memset((char *) &range, 0, sizeof(struct iw_range));
+         struct iw_range       *range;
+         range = kmalloc(sizeof(struct iw_range), GFP_KERNEL);
+         if (!range) {
+           err = -ENOMEM;
+           goto ioc_out;
+         }
+         memset((char *) range, 0, sizeof(struct iw_range));
 
          /* Set the length (very important for backward compatibility) */
          wrq->u.data.length = sizeof(struct iw_range);
 
 #if WIRELESS_EXT > 10
          /* Set the Wireless Extension versions */
-         range.we_version_compiled = WIRELESS_EXT;
-         range.we_version_source = 9;
+         range->we_version_compiled = WIRELESS_EXT;
+         range->we_version_source = 9;
 #endif /* WIRELESS_EXT > 10 */
 
          /* Set information in the range struct */
-         range.throughput = 1.1 * 1000 * 1000; /* Put the right number here */
-         range.num_channels = hop_pattern_length[(int)country]; 
-         range.num_frequency = 0;
-         range.max_qual.qual = 0;
-         range.max_qual.level = 255;   /* What's the correct value ? */
-         range.max_qual.noise = 255;   /* Idem */
-         range.num_bitrates = 2;
-         range.bitrate[0] = 1000000;   /* 1 Mb/s */
-         range.bitrate[1] = 2000000;   /* 2 Mb/s */
+         range->throughput = 1.1 * 1000 * 1000;        /* Put the right number 
here */
+         range->num_channels = hop_pattern_length[(int)country]; 
+         range->num_frequency = 0;
+         range->max_qual.qual = 0;
+         range->max_qual.level = 255;  /* What's the correct value ? */
+         range->max_qual.noise = 255;  /* Idem */
+         range->num_bitrates = 2;
+         range->bitrate[0] = 1000000;  /* 1 Mb/s */
+         range->bitrate[1] = 2000000;  /* 2 Mb/s */
 
          /* Copy structure to the user buffer */
-         if(copy_to_user(wrq->u.data.pointer, &range,
+         if(copy_to_user(wrq->u.data.pointer, range,
                          sizeof(struct iw_range)))
            err = -EFAULT;
+         kfree(range);
        }
       break;
 
@@ -1632,6 +1638,7 @@ static int ray_dev_ioctl(struct net_devi
             DEBUG(0,"ray_dev_ioctl cmd = 0x%x\n", cmd);
             err = -EOPNOTSUPP;
     }
+ioc_out:
     return err;
 } /* end ray_dev_ioctl */
 /*===========================================================================*/
<Prev in Thread] Current Thread [Next in Thread>
  • [PATCH] ray_cs: reduce stack usage, Randy.Dunlap <=