Re: [PATCH 06/10] drivers:ethernet: return -ENOMEM on allocation failure.

From: Allen
Date: Wed Sep 20 2017 - 02:50:16 EST


> static int cas_alloc_rxds(struct cas *cp)
> {
> int i;
>
> for (i = 0; i < N_RX_DESC_RINGS; i++) {
> if (cas_alloc_rx_desc(cp, i) < 0) {
> cas_free_rxds(cp);
> return -1;
> }
> }
> return 0;
> }
>
> Again, your change is correct, but in the end the value is not used.
> And if you fix it at the cas_alloc_rxds level, you also need a fix at
> the next level up:
>
> err = -ENOMEM;
> if (cas_tx_tiny_alloc(cp) < 0)
> goto err_unlock;
>
> /* alloc rx descriptors */
> if (cas_alloc_rxds(cp) < 0)
> goto err_tx_tiny;
>
> again, the return value is discarded.

Andrew,

How about the below patch as a fix?

diff --git a/drivers/net/ethernet/sun/cassini.c
b/drivers/net/ethernet/sun/cassini.c
index 382993c..a88552c 100644
--- a/drivers/net/ethernet/sun/cassini.c
+++ b/drivers/net/ethernet/sun/cassini.c
@@ -3984,19 +3984,20 @@ static inline int cas_alloc_rx_desc(struct cas
*cp, int ring)
size = RX_DESC_RINGN_SIZE(ring);
for (i = 0; i < size; i++) {
if ((page[i] = cas_page_alloc(cp, GFP_KERNEL)) == NULL)
- return -1;
+ return -ENOMEM;
}
return 0;
}

static int cas_alloc_rxds(struct cas *cp)
{
- int i;
+ int i, ret;

for (i = 0; i < N_RX_DESC_RINGS; i++) {
- if (cas_alloc_rx_desc(cp, i) < 0) {
+ ret = cas_alloc_rx_desc(cp, i);
+ if (ret < 0) {
cas_free_rxds(cp);
- return -1;
+ return ret;
}
}
return 0;
@@ -4241,7 +4242,7 @@ static int cas_tx_tiny_alloc(struct cas *cp)
static int cas_open(struct net_device *dev)
{
struct cas *cp = netdev_priv(dev);
- int hw_was_up, err;
+ int hw_was_up;
unsigned long flags;

mutex_lock(&cp->pm_mutex);
@@ -4264,7 +4265,6 @@ static int cas_open(struct net_device *dev)
cas_unlock_all_restore(cp, flags);
}

- err = -ENOMEM;
if (cas_tx_tiny_alloc(cp) < 0)
goto err_unlock;

@@ -4309,7 +4309,7 @@ static int cas_open(struct net_device *dev)
cas_tx_tiny_free(cp);
err_unlock:
mutex_unlock(&cp->pm_mutex);
- return err;
+ return -ENOMEM;
}

static int cas_close(struct net_device *dev)