Re: [PATCH 15/23] net: Avoid dynamic stack allocation

2021-05-06 Thread Jason Wang



在 2021/5/6 上午5:10, Philippe Mathieu-Daudé 写道:

Use autofree heap allocation instead of variable-length
array on the stack.

Signed-off-by: Philippe Mathieu-Daudé 



Acked-by: Jason Wang 



---
  hw/net/fsl_etsec/rings.c  | 9 -
  hw/net/rocker/rocker_of_dpa.c | 2 +-
  net/dump.c| 2 +-
  net/tap.c | 2 +-
  4 files changed, 7 insertions(+), 8 deletions(-)

diff --git a/hw/net/fsl_etsec/rings.c b/hw/net/fsl_etsec/rings.c
index 8f084464155..1abdcb5a29c 100644
--- a/hw/net/fsl_etsec/rings.c
+++ b/hw/net/fsl_etsec/rings.c
@@ -381,8 +381,6 @@ static void fill_rx_bd(eTSEC  *etsec,
  uint16_t to_write;
  hwaddr   bufptr = bd->bufptr +
  ((hwaddr)(etsec->regs[TBDBPH].value & 0xF) << 32);
-uint8_t  padd[etsec->rx_padding];
-uint8_t  rem;
  
  RING_DEBUG("eTSEC fill Rx buffer @ 0x%016" HWADDR_PRIx

 " size:%zu(padding + crc:%u) + fcb:%u\n",
@@ -423,11 +421,12 @@ static void fill_rx_bd(eTSEC  *etsec,
  /* The remaining bytes are only for padding which is not actually
   * allocated in the data buffer.
   */
-
-rem = MIN(etsec->regs[MRBLR].value - bd->length, etsec->rx_padding);
+uint8_t  rem = MIN(etsec->regs[MRBLR].value - bd->length,
+   etsec->rx_padding);
  
  if (rem > 0) {

-memset(padd, 0x0, sizeof(padd));
+g_autofree uint8_t *padd = g_malloc0(etsec->rx_padding);
+
  etsec->rx_padding -= rem;
  *size -= rem;
  bd->length+= rem;
diff --git a/hw/net/rocker/rocker_of_dpa.c b/hw/net/rocker/rocker_of_dpa.c
index b3b8c5bb6d4..3e400ceaef7 100644
--- a/hw/net/rocker/rocker_of_dpa.c
+++ b/hw/net/rocker/rocker_of_dpa.c
@@ -1043,7 +1043,7 @@ static void of_dpa_flow_ig_tbl(OfDpaFlowContext *fc, 
uint32_t tbl_id)
  static ssize_t of_dpa_ig(World *world, uint32_t pport,
   const struct iovec *iov, int iovcnt)
  {
-struct iovec iov_copy[iovcnt + 2];
+g_autofree struct iovec *iov_copy = g_new(struct iovec, iovcnt + 2);
  OfDpaFlowContext fc = {
  .of_dpa = world_private(world),
  .in_pport = pport,
diff --git a/net/dump.c b/net/dump.c
index 4d538d82a69..b830302e27d 100644
--- a/net/dump.c
+++ b/net/dump.c
@@ -68,7 +68,7 @@ static ssize_t dump_receive_iov(DumpState *s, const struct 
iovec *iov, int cnt)
  int64_t ts;
  int caplen;
  size_t size = iov_size(iov, cnt);
-struct iovec dumpiov[cnt + 1];
+g_autofree struct iovec *dumpiov = g_new(struct iovec, cnt + 1);
  
  /* Early return in case of previous error. */

  if (s->fd < 0) {
diff --git a/net/tap.c b/net/tap.c
index bae895e2874..2b9ed8a2cd8 100644
--- a/net/tap.c
+++ b/net/tap.c
@@ -120,7 +120,7 @@ static ssize_t tap_receive_iov(NetClientState *nc, const 
struct iovec *iov,
  {
  TAPState *s = DO_UPCAST(TAPState, nc, nc);
  const struct iovec *iovp = iov;
-struct iovec iov_copy[iovcnt + 1];
+g_autofree struct iovec *iov_copy = g_new(struct iovec, iovcnt + 1);
  struct virtio_net_hdr_mrg_rxbuf hdr = { };
  
  if (s->host_vnet_hdr_len && !s->using_vnet_hdr) {





Re: [PATCH 15/23] net: Avoid dynamic stack allocation

2021-05-05 Thread David Gibson
On Wed, May 05, 2021 at 11:10:39PM +0200, Philippe Mathieu-Daudé wrote:
> Use autofree heap allocation instead of variable-length
> array on the stack.
> 
> Signed-off-by: Philippe Mathieu-Daudé 

fsl_etsec parts
Acked-by: David Gibson 


> ---
>  hw/net/fsl_etsec/rings.c  | 9 -
>  hw/net/rocker/rocker_of_dpa.c | 2 +-
>  net/dump.c| 2 +-
>  net/tap.c | 2 +-
>  4 files changed, 7 insertions(+), 8 deletions(-)
> 
> diff --git a/hw/net/fsl_etsec/rings.c b/hw/net/fsl_etsec/rings.c
> index 8f084464155..1abdcb5a29c 100644
> --- a/hw/net/fsl_etsec/rings.c
> +++ b/hw/net/fsl_etsec/rings.c
> @@ -381,8 +381,6 @@ static void fill_rx_bd(eTSEC  *etsec,
>  uint16_t to_write;
>  hwaddr   bufptr = bd->bufptr +
>  ((hwaddr)(etsec->regs[TBDBPH].value & 0xF) << 32);
> -uint8_t  padd[etsec->rx_padding];
> -uint8_t  rem;
>  
>  RING_DEBUG("eTSEC fill Rx buffer @ 0x%016" HWADDR_PRIx
> " size:%zu(padding + crc:%u) + fcb:%u\n",
> @@ -423,11 +421,12 @@ static void fill_rx_bd(eTSEC  *etsec,
>  /* The remaining bytes are only for padding which is not actually
>   * allocated in the data buffer.
>   */
> -
> -rem = MIN(etsec->regs[MRBLR].value - bd->length, etsec->rx_padding);
> +uint8_t  rem = MIN(etsec->regs[MRBLR].value - bd->length,
> +   etsec->rx_padding);
>  
>  if (rem > 0) {
> -memset(padd, 0x0, sizeof(padd));
> +g_autofree uint8_t *padd = g_malloc0(etsec->rx_padding);
> +
>  etsec->rx_padding -= rem;
>  *size -= rem;
>  bd->length+= rem;
> diff --git a/hw/net/rocker/rocker_of_dpa.c b/hw/net/rocker/rocker_of_dpa.c
> index b3b8c5bb6d4..3e400ceaef7 100644
> --- a/hw/net/rocker/rocker_of_dpa.c
> +++ b/hw/net/rocker/rocker_of_dpa.c
> @@ -1043,7 +1043,7 @@ static void of_dpa_flow_ig_tbl(OfDpaFlowContext *fc, 
> uint32_t tbl_id)
>  static ssize_t of_dpa_ig(World *world, uint32_t pport,
>   const struct iovec *iov, int iovcnt)
>  {
> -struct iovec iov_copy[iovcnt + 2];
> +g_autofree struct iovec *iov_copy = g_new(struct iovec, iovcnt + 2);
>  OfDpaFlowContext fc = {
>  .of_dpa = world_private(world),
>  .in_pport = pport,
> diff --git a/net/dump.c b/net/dump.c
> index 4d538d82a69..b830302e27d 100644
> --- a/net/dump.c
> +++ b/net/dump.c
> @@ -68,7 +68,7 @@ static ssize_t dump_receive_iov(DumpState *s, const struct 
> iovec *iov, int cnt)
>  int64_t ts;
>  int caplen;
>  size_t size = iov_size(iov, cnt);
> -struct iovec dumpiov[cnt + 1];
> +g_autofree struct iovec *dumpiov = g_new(struct iovec, cnt + 1);
>  
>  /* Early return in case of previous error. */
>  if (s->fd < 0) {
> diff --git a/net/tap.c b/net/tap.c
> index bae895e2874..2b9ed8a2cd8 100644
> --- a/net/tap.c
> +++ b/net/tap.c
> @@ -120,7 +120,7 @@ static ssize_t tap_receive_iov(NetClientState *nc, const 
> struct iovec *iov,
>  {
>  TAPState *s = DO_UPCAST(TAPState, nc, nc);
>  const struct iovec *iovp = iov;
> -struct iovec iov_copy[iovcnt + 1];
> +g_autofree struct iovec *iov_copy = g_new(struct iovec, iovcnt + 1);
>  struct virtio_net_hdr_mrg_rxbuf hdr = { };
>  
>  if (s->host_vnet_hdr_len && !s->using_vnet_hdr) {

-- 
David Gibson| I'll have my music baroque, and my code
david AT gibson.dropbear.id.au  | minimalist, thank you.  NOT _the_ _other_
| _way_ _around_!
http://www.ozlabs.org/~dgibson


signature.asc
Description: PGP signature


[PATCH 15/23] net: Avoid dynamic stack allocation

2021-05-05 Thread Philippe Mathieu-Daudé
Use autofree heap allocation instead of variable-length
array on the stack.

Signed-off-by: Philippe Mathieu-Daudé 
---
 hw/net/fsl_etsec/rings.c  | 9 -
 hw/net/rocker/rocker_of_dpa.c | 2 +-
 net/dump.c| 2 +-
 net/tap.c | 2 +-
 4 files changed, 7 insertions(+), 8 deletions(-)

diff --git a/hw/net/fsl_etsec/rings.c b/hw/net/fsl_etsec/rings.c
index 8f084464155..1abdcb5a29c 100644
--- a/hw/net/fsl_etsec/rings.c
+++ b/hw/net/fsl_etsec/rings.c
@@ -381,8 +381,6 @@ static void fill_rx_bd(eTSEC  *etsec,
 uint16_t to_write;
 hwaddr   bufptr = bd->bufptr +
 ((hwaddr)(etsec->regs[TBDBPH].value & 0xF) << 32);
-uint8_t  padd[etsec->rx_padding];
-uint8_t  rem;
 
 RING_DEBUG("eTSEC fill Rx buffer @ 0x%016" HWADDR_PRIx
" size:%zu(padding + crc:%u) + fcb:%u\n",
@@ -423,11 +421,12 @@ static void fill_rx_bd(eTSEC  *etsec,
 /* The remaining bytes are only for padding which is not actually
  * allocated in the data buffer.
  */
-
-rem = MIN(etsec->regs[MRBLR].value - bd->length, etsec->rx_padding);
+uint8_t  rem = MIN(etsec->regs[MRBLR].value - bd->length,
+   etsec->rx_padding);
 
 if (rem > 0) {
-memset(padd, 0x0, sizeof(padd));
+g_autofree uint8_t *padd = g_malloc0(etsec->rx_padding);
+
 etsec->rx_padding -= rem;
 *size -= rem;
 bd->length+= rem;
diff --git a/hw/net/rocker/rocker_of_dpa.c b/hw/net/rocker/rocker_of_dpa.c
index b3b8c5bb6d4..3e400ceaef7 100644
--- a/hw/net/rocker/rocker_of_dpa.c
+++ b/hw/net/rocker/rocker_of_dpa.c
@@ -1043,7 +1043,7 @@ static void of_dpa_flow_ig_tbl(OfDpaFlowContext *fc, 
uint32_t tbl_id)
 static ssize_t of_dpa_ig(World *world, uint32_t pport,
  const struct iovec *iov, int iovcnt)
 {
-struct iovec iov_copy[iovcnt + 2];
+g_autofree struct iovec *iov_copy = g_new(struct iovec, iovcnt + 2);
 OfDpaFlowContext fc = {
 .of_dpa = world_private(world),
 .in_pport = pport,
diff --git a/net/dump.c b/net/dump.c
index 4d538d82a69..b830302e27d 100644
--- a/net/dump.c
+++ b/net/dump.c
@@ -68,7 +68,7 @@ static ssize_t dump_receive_iov(DumpState *s, const struct 
iovec *iov, int cnt)
 int64_t ts;
 int caplen;
 size_t size = iov_size(iov, cnt);
-struct iovec dumpiov[cnt + 1];
+g_autofree struct iovec *dumpiov = g_new(struct iovec, cnt + 1);
 
 /* Early return in case of previous error. */
 if (s->fd < 0) {
diff --git a/net/tap.c b/net/tap.c
index bae895e2874..2b9ed8a2cd8 100644
--- a/net/tap.c
+++ b/net/tap.c
@@ -120,7 +120,7 @@ static ssize_t tap_receive_iov(NetClientState *nc, const 
struct iovec *iov,
 {
 TAPState *s = DO_UPCAST(TAPState, nc, nc);
 const struct iovec *iovp = iov;
-struct iovec iov_copy[iovcnt + 1];
+g_autofree struct iovec *iov_copy = g_new(struct iovec, iovcnt + 1);
 struct virtio_net_hdr_mrg_rxbuf hdr = { };
 
 if (s->host_vnet_hdr_len && !s->using_vnet_hdr) {
-- 
2.26.3