@@ -1262,11 +1262,12 @@ static void veth_set_xdp_features(struct net_device *dev)
1262
1262
1263
1263
peer = rtnl_dereference (priv -> peer );
1264
1264
if (peer && peer -> real_num_tx_queues <= dev -> real_num_rx_queues ) {
1265
+ struct veth_priv * priv_peer = netdev_priv (peer );
1265
1266
xdp_features_t val = NETDEV_XDP_ACT_BASIC |
1266
1267
NETDEV_XDP_ACT_REDIRECT |
1267
1268
NETDEV_XDP_ACT_RX_SG ;
1268
1269
1269
- if (priv -> _xdp_prog || veth_gro_requested (dev ))
1270
+ if (priv_peer -> _xdp_prog || veth_gro_requested (peer ))
1270
1271
val |= NETDEV_XDP_ACT_NDO_XMIT |
1271
1272
NETDEV_XDP_ACT_NDO_XMIT_SG ;
1272
1273
xdp_set_features_flag (dev , val );
@@ -1504,19 +1505,23 @@ static int veth_set_features(struct net_device *dev,
1504
1505
{
1505
1506
netdev_features_t changed = features ^ dev -> features ;
1506
1507
struct veth_priv * priv = netdev_priv (dev );
1508
+ struct net_device * peer ;
1507
1509
int err ;
1508
1510
1509
1511
if (!(changed & NETIF_F_GRO ) || !(dev -> flags & IFF_UP ) || priv -> _xdp_prog )
1510
1512
return 0 ;
1511
1513
1514
+ peer = rtnl_dereference (priv -> peer );
1512
1515
if (features & NETIF_F_GRO ) {
1513
1516
err = veth_napi_enable (dev );
1514
1517
if (err )
1515
1518
return err ;
1516
1519
1517
- xdp_features_set_redirect_target (dev , true);
1520
+ if (peer )
1521
+ xdp_features_set_redirect_target (peer , true);
1518
1522
} else {
1519
- xdp_features_clear_redirect_target (dev );
1523
+ if (peer )
1524
+ xdp_features_clear_redirect_target (peer );
1520
1525
veth_napi_del (dev );
1521
1526
}
1522
1527
return 0 ;
@@ -1598,13 +1603,13 @@ static int veth_xdp_set(struct net_device *dev, struct bpf_prog *prog,
1598
1603
peer -> max_mtu = max_mtu ;
1599
1604
}
1600
1605
1601
- xdp_features_set_redirect_target (dev , true);
1606
+ xdp_features_set_redirect_target (peer , true);
1602
1607
}
1603
1608
1604
1609
if (old_prog ) {
1605
1610
if (!prog ) {
1606
- if (!veth_gro_requested (dev ))
1607
- xdp_features_clear_redirect_target (dev );
1611
+ if (peer && !veth_gro_requested (dev ))
1612
+ xdp_features_clear_redirect_target (peer );
1608
1613
1609
1614
if (dev -> flags & IFF_UP )
1610
1615
veth_disable_xdp (dev );
0 commit comments