diff mbox

hw/net/opencores_eth: Allocating Large sized arrays to heap

Message ID 1461641713-32720-1-git-send-email-zhoujie2011@cn.fujitsu.com (mailing list archive)
State New, archived
Headers show

Commit Message

Zhou Jie April 26, 2016, 3:35 a.m. UTC
open_eth_start_xmit has a huge stack usage of 65536 bytes approx.
Moving large arrays to heap to reduce stack usage.

Signed-off-by: Zhou Jie <zhoujie2011@cn.fujitsu.com>
---
 hw/net/opencores_eth.c | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

Comments

Max Filippov April 26, 2016, 4:12 a.m. UTC | #1
Hi Zhou,

On Tue, Apr 26, 2016 at 6:35 AM, Zhou Jie <zhoujie2011@cn.fujitsu.com> wrote:
> open_eth_start_xmit has a huge stack usage of 65536 bytes approx.
> Moving large arrays to heap to reduce stack usage.

It's an exception, not the rule when full 65536 byte long buffer might be
needed. Can we do a little better change and not allocate and free this
buffer every time unconditionally, but instead make buf smaller (1536
bytes, maximal frame length when HUGEN bit is not set in MODER)
and only do allocation when that's not enough?
Zhou Jie April 27, 2016, 1:03 a.m. UTC | #2
On 2016/4/26 12:12, Max Filippov wrote:
> Hi Zhou,
>
> On Tue, Apr 26, 2016 at 6:35 AM, Zhou Jie <zhoujie2011@cn.fujitsu.com> wrote:
>> open_eth_start_xmit has a huge stack usage of 65536 bytes approx.
>> Moving large arrays to heap to reduce stack usage.
>
> It's an exception, not the rule when full 65536 byte long buffer might be
> needed. Can we do a little better change and not allocate and free this
> buffer every time unconditionally, but instead make buf smaller (1536
> bytes, maximal frame length when HUGEN bit is not set in MODER)
> and only do allocation when that's not enough?
>
Thank you for your suggestion.
I will modify this patch.

Sincerely,
Zhou Jie
diff mbox

Patch

diff --git a/hw/net/opencores_eth.c b/hw/net/opencores_eth.c
index c6094fb..ba23922 100644
--- a/hw/net/opencores_eth.c
+++ b/hw/net/opencores_eth.c
@@ -483,7 +483,7 @@  static NetClientInfo net_open_eth_info = {
 
 static void open_eth_start_xmit(OpenEthState *s, desc *tx)
 {
-    uint8_t buf[65536];
+    uint8_t *buf = NULL;
     unsigned len = GET_FIELD(tx->len_flags, TXD_LEN);
     unsigned tx_len = len;
 
@@ -498,6 +498,7 @@  static void open_eth_start_xmit(OpenEthState *s, desc *tx)
 
     trace_open_eth_start_xmit(tx->buf_ptr, len, tx_len);
 
+    buf = g_new(uint8_t, tx_len);
     if (len > tx_len) {
         len = tx_len;
     }
@@ -506,6 +507,7 @@  static void open_eth_start_xmit(OpenEthState *s, desc *tx)
         memset(buf + len, 0, tx_len - len);
     }
     qemu_send_packet(qemu_get_queue(s->nic), buf, tx_len);
+    g_free(buf);
 
     if (tx->len_flags & TXD_WR) {
         s->tx_desc = 0;