Skip to content

Commit 8fe0129

Browse files
committed
Merge branch 'net_of_node_put'
Julia Lawall says: ==================== add missing of_node_put The various for_each device_node iterators performs an of_node_get on each iteration, so a break out of the loop requires an of_node_put. The complete semantic patch that fixes this problem is (http://coccinelle.lip6.fr): // <smpl> @r@ local idexpression n; expression e1,e2; iterator name for_each_node_by_name, for_each_node_by_type, for_each_compatible_node, for_each_matching_node, for_each_matching_node_and_match, for_each_child_of_node, for_each_available_child_of_node, for_each_node_with_property; iterator i; statement S; expression list [n1] es; @@ ( ( for_each_node_by_name(n,e1) S | for_each_node_by_type(n,e1) S | for_each_compatible_node(n,e1,e2) S | for_each_matching_node(n,e1) S | for_each_matching_node_and_match(n,e1,e2) S | for_each_child_of_node(e1,n) S | for_each_available_child_of_node(e1,n) S | for_each_node_with_property(n,e1) S ) & i(es,n,...) S ) @@ local idexpression r.n; iterator r.i; expression e; expression list [r.n1] es; @@ i(es,n,...) { ... ( of_node_put(n); | e = n | return n; | + of_node_put(n); ? return ...; ) ... } @@ local idexpression r.n; iterator r.i; expression e; expression list [r.n1] es; @@ i(es,n,...) { ... ( of_node_put(n); | e = n | + of_node_put(n); ? break; ) ... } ... when != n @@ local idexpression r.n; iterator r.i; expression e; identifier l; expression list [r.n1] es; @@ i(es,n,...) { ... ( of_node_put(n); | e = n | + of_node_put(n); ? goto l; ) ... } ... l: ... when != n// </smpl> ==================== Signed-off-by: David S. Miller <[email protected]>
2 parents 7e3b6e7 + 26b7974 commit 8fe0129

File tree

6 files changed

+16
-4
lines changed

6 files changed

+16
-4
lines changed

drivers/net/ethernet/cavium/thunder/thunder_bgx.c

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -977,8 +977,10 @@ static int bgx_init_of_phy(struct bgx *bgx)
977977
SET_NETDEV_DEV(&bgx->lmac[lmac].netdev, &bgx->pdev->dev);
978978
bgx->lmac[lmac].lmacid = lmac;
979979
lmac++;
980-
if (lmac == MAX_LMAC_PER_BGX)
980+
if (lmac == MAX_LMAC_PER_BGX) {
981+
of_node_put(np_child);
981982
break;
983+
}
982984
}
983985
return 0;
984986
}

drivers/net/ethernet/marvell/mv643xx_eth.c

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2817,8 +2817,10 @@ static int mv643xx_eth_shared_of_probe(struct platform_device *pdev)
28172817

28182818
for_each_available_child_of_node(np, pnp) {
28192819
ret = mv643xx_eth_shared_of_add_port(pdev, pnp);
2820-
if (ret)
2820+
if (ret) {
2821+
of_node_put(pnp);
28212822
return ret;
2823+
}
28222824
}
28232825
return 0;
28242826
}

drivers/net/ethernet/ti/netcp_ethss.c

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2637,8 +2637,10 @@ static void init_secondary_ports(struct gbe_priv *gbe_dev,
26372637
mac_phy_link = true;
26382638

26392639
slave->open = true;
2640-
if (gbe_dev->num_slaves >= gbe_dev->max_num_slaves)
2640+
if (gbe_dev->num_slaves >= gbe_dev->max_num_slaves) {
2641+
of_node_put(port);
26412642
break;
2643+
}
26422644
}
26432645

26442646
/* of_phy_connect() is needed only for MAC-PHY interface */
@@ -3137,8 +3139,10 @@ static int gbe_probe(struct netcp_device *netcp_device, struct device *dev,
31373139
continue;
31383140
}
31393141
gbe_dev->num_slaves++;
3140-
if (gbe_dev->num_slaves >= gbe_dev->max_num_slaves)
3142+
if (gbe_dev->num_slaves >= gbe_dev->max_num_slaves) {
3143+
of_node_put(interface);
31413144
break;
3145+
}
31423146
}
31433147
of_node_put(interfaces);
31443148

drivers/net/phy/mdio-mux-mmioreg.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -113,12 +113,14 @@ static int mdio_mux_mmioreg_probe(struct platform_device *pdev)
113113
if (!iprop || len != sizeof(uint32_t)) {
114114
dev_err(&pdev->dev, "mdio-mux child node %s is "
115115
"missing a 'reg' property\n", np2->full_name);
116+
of_node_put(np2);
116117
return -ENODEV;
117118
}
118119
if (be32_to_cpup(iprop) & ~s->mask) {
119120
dev_err(&pdev->dev, "mdio-mux child node %s has "
120121
"a 'reg' value with unmasked bits\n",
121122
np2->full_name);
123+
of_node_put(np2);
122124
return -ENODEV;
123125
}
124126
}

drivers/net/phy/mdio-mux.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -144,6 +144,7 @@ int mdio_mux_init(struct device *dev,
144144
dev_err(dev,
145145
"Error: Failed to allocate memory for child\n");
146146
ret_val = -ENOMEM;
147+
of_node_put(child_bus_node);
147148
break;
148149
}
149150
cb->bus_number = v;

drivers/net/wireless/ath/ath6kl/init.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -715,6 +715,7 @@ static bool check_device_tree(struct ath6kl *ar)
715715
board_filename, ret);
716716
continue;
717717
}
718+
of_node_put(node);
718719
return true;
719720
}
720721
return false;

0 commit comments

Comments
 (0)