Message ID | 1461641713-32720-1-git-send-email-zhoujie2011@cn.fujitsu.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
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?
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 --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;
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(-)