On Wed, Aug 31, 2016 at 06:04:22AM -0600, nayden wrote:
> Addressing "this function needs a cleanup block, lots of free(blah); return 
> (0)"
> comment for vioblk_notifyq() and doing the same for vionet_enq_rx(). 
> 

go for it, thanks.

> Index: virtio.c
> ===================================================================
> RCS file: /home/nayden/cvsync/src/usr.sbin/vmd/virtio.c,v
> retrieving revision 1.17
> diff -u -p -r1.17 virtio.c
> --- virtio.c  17 Aug 2016 05:07:13 -0000      1.17
> +++ virtio.c  31 Aug 2016 10:35:55 -0000
> @@ -353,8 +353,7 @@ vioblk_do_write(struct vioblk_dev *dev, 
>  }
>  
>  /*
> - * XXX this function needs a cleanup block, lots of free(blah); return (0)
> - *     in various cases, ds should be set to VIRTIO_BLK_S_IOERR, if we can
> + * XXX in various cases, ds should be set to VIRTIO_BLK_S_IOERR, if we can
>   * XXX cant trust ring data from VM, be extra cautious.
>   */
>  int
> @@ -390,8 +389,7 @@ vioblk_notifyq(struct vioblk_dev *dev)
>  
>       if (read_mem(q_gpa, vr, vr_sz)) {
>               log_warnx("error reading gpa 0x%llx", q_gpa);
> -             free(vr);
> -             return (0);
> +             goto out;
>       }
>  
>       /* Compute offsets in ring of descriptors, avail ring, and used ring */
> @@ -406,8 +404,7 @@ vioblk_notifyq(struct vioblk_dev *dev)
>  
>       if ((avail->idx & VIOBLK_QUEUE_MASK) == idx) {
>               log_warnx("vioblk queue notify - nothing to do?");
> -             free(vr);
> -             return (0);
> +             goto out;
>       }
>  
>       cmd_desc_idx = avail->ring[idx] & VIOBLK_QUEUE_MASK;
> @@ -416,16 +413,14 @@ vioblk_notifyq(struct vioblk_dev *dev)
>       if ((cmd_desc->flags & VRING_DESC_F_NEXT) == 0) {
>               log_warnx("unchained vioblk cmd descriptor received "
>                   "(idx %d)", cmd_desc_idx);
> -             free(vr);
> -             return (0);
> +             goto out;
>       }
>  
>       /* Read command from descriptor ring */
>       if (read_mem(cmd_desc->addr, &cmd, cmd_desc->len)) {
>               log_warnx("vioblk: command read_mem error @ 0x%llx",
>                   cmd_desc->addr);
> -             free(vr);
> -             return (0);
> +             goto out;
>       }
>  
>       switch (cmd.type) {
> @@ -437,8 +432,7 @@ vioblk_notifyq(struct vioblk_dev *dev)
>               if ((secdata_desc->flags & VRING_DESC_F_NEXT) == 0) {
>                       log_warnx("unchained vioblk data descriptor "
>                           "received (idx %d)", cmd_desc_idx);
> -                     free(vr);
> -                     return (0);
> +                     goto out;
>               }
>  
>               secbias = 0;
> @@ -453,8 +447,7 @@ vioblk_notifyq(struct vioblk_dev *dev)
>                       if (secdata == NULL) {
>                               log_warnx("vioblk: block read error, "
>                                   "sector %lld", cmd.sector);
> -                             free(vr);
> -                             return (0);
> +                             goto out;
>                       }
>  
>                       if (write_mem(secdata_desc->addr, secdata,
> @@ -463,9 +456,8 @@ vioblk_notifyq(struct vioblk_dev *dev)
>                                   "data to gpa @ 0x%llx",
>                                   secdata_desc->addr);
>                               dump_descriptor_chain(desc, cmd_desc_idx);
> -                             free(vr);
>                               free(secdata);
> -                             return (0);
> +                             goto out;
>                       }
>  
>                       free(secdata);
> @@ -484,8 +476,7 @@ vioblk_notifyq(struct vioblk_dev *dev)
>                       log_warnx("can't write device status data @ "
>                           "0x%llx", ds_desc->addr);
>                       dump_descriptor_chain(desc, cmd_desc_idx);
> -                     free(vr);
> -                     return (0);
> +                     goto out;
>               }
>  
>  
> @@ -509,16 +500,14 @@ vioblk_notifyq(struct vioblk_dev *dev)
>               if ((secdata_desc->flags & VRING_DESC_F_NEXT) == 0) {
>                       log_warnx("wr vioblk: unchained vioblk data "
>                           "descriptor received (idx %d)", cmd_desc_idx);
> -                     free(vr);
> -                     return (0);
> +                     goto out;
>               }
>  
>               secdata = malloc(MAXPHYS);
>               if (secdata == NULL) {
>                       log_warn("wr vioblk: malloc error, len %d",
>                           secdata_desc->len);
> -                     free(vr);
> -                     return (0);
> +                     goto out;
>               }
>  
>               secbias = 0;
> @@ -529,17 +518,15 @@ vioblk_notifyq(struct vioblk_dev *dev)
>                                   "sector data @ 0x%llx",
>                                   secdata_desc->addr);
>                               dump_descriptor_chain(desc, cmd_desc_idx);
> -                             free(vr);
>                               free(secdata);
> -                             return (0);
> +                             goto out;
>                       }
>  
>                       if (vioblk_do_write(dev, cmd.sector + secbias,
>                           secdata, (ssize_t)secdata_desc->len)) {
>                               log_warnx("wr vioblk: disk write error");
> -                             free(vr);
>                               free(secdata);
> -                             return (0);
> +                             goto out;
>                       }
>  
>                       secbias += secdata_desc->len / VIRTIO_BLK_SECTOR_SIZE;
> @@ -559,8 +546,7 @@ vioblk_notifyq(struct vioblk_dev *dev)
>                       log_warnx("wr vioblk: can't write device status "
>                           "data @ 0x%llx", ds_desc->addr);
>                       dump_descriptor_chain(desc, cmd_desc_idx);
> -                     free(vr);
> -                     return (0);
> +                     goto out;
>               }
>  
>               ret = 1;
> @@ -584,8 +570,7 @@ vioblk_notifyq(struct vioblk_dev *dev)
>                       log_warnx("fl vioblk: can't write device status "
>                           "data @ 0x%llx", ds_desc->addr);
>                       dump_descriptor_chain(desc, cmd_desc_idx);
> -                     free(vr);
> -                     return (0);
> +                     goto out;
>               }
>  
>               ret = 1;
> @@ -601,9 +586,8 @@ vioblk_notifyq(struct vioblk_dev *dev)
>               }
>               break;
>       }
> -
> +out:
>       free(vr);
> -
>       return (ret);
>  }
>  
> @@ -810,8 +794,7 @@ vionet_enq_rx(struct vionet_dev *dev, ch
>  
>       if (read_mem(q_gpa, vr, vr_sz)) {
>               log_warnx("rx enq: error reading gpa 0x%llx", q_gpa);
> -             free(vr);
> -             return (0);
> +             goto out;
>       }
>  
>       /* Compute offsets in ring of descriptors, avail ring, and used ring */
> @@ -825,8 +808,7 @@ vionet_enq_rx(struct vionet_dev *dev, ch
>  
>       if ((dev->vq[0].notified_avail & VIONET_QUEUE_MASK) == idx) {
>               log_warnx("vionet queue notify - no space, dropping packet");
> -             free(vr);
> -             return (0);
> +             goto out;
>       }
>  
>       hdr_desc_idx = avail->ring[idx] & VIONET_QUEUE_MASK;
> @@ -839,16 +821,14 @@ vionet_enq_rx(struct vionet_dev *dev, ch
>       if ((pkt_desc->flags & VRING_DESC_F_WRITE) == 0) {
>               log_warnx("unexpected readable rx descriptor %d",
>                   pkt_desc_idx);
> -             free(vr);
> -             return (0);
> +             goto out;
>       }
>  
>       /* Write packet to descriptor ring */
>       if (write_mem(pkt_desc->addr, pkt, sz)) {
>               log_warnx("vionet: rx enq packet write_mem error @ "
>                   "0x%llx", pkt_desc->addr);
> -             free(vr);
> -             return (0);
> +             goto out;
>       }
>  
>       ret = 1;
> @@ -868,9 +848,8 @@ vionet_enq_rx(struct vionet_dev *dev, ch
>               if (write_mem(q_gpa + off, &used->idx, sizeof used->idx))
>                       log_warnx("vionet: error writing vio ring");
>       }
> -
> +out:
>       free(vr);
> -
>       return (ret);
>  }
>  
> 

Reply via email to