Skip to content

Commit 183dea5

Browse files
Paolo Abenidavem330
authored andcommitted
openvswitch: do not propagate headroom updates to internal port
After commit 3a927bc ("ovs: propagate per dp max headroom to all vports") the need_headroom for the internal vport is updated accordingly to the max needed headroom in its datapath. That avoids the pskb_expand_head() costs when sending/forwarding packets towards tunnel devices, at least for some scenarios. We still require such copy when using the ovs-preferred configuration for vxlan tunnels: br_int / \ tap vxlan (remote_ip:X) br_phy \ NIC where the route towards the IP 'X' is via 'br_phy'. When forwarding traffic from the tap towards the vxlan device, we will call pskb_expand_head() in vxlan_build_skb() because br-phy->needed_headroom is equal to tun->needed_headroom. With this change we avoid updating the internal vport needed_headroom, so that in the above scenario no head copy is needed, giving 5% performance improvement in UDP throughput test. As a trade-off, packets sent from the internal port towards a tunnel device will now experience the head copy overhead. The rationale is that the latter use-case is less relevant performance-wise. Signed-off-by: Paolo Abeni <[email protected]> Acked-by: Pravin B Shelar <[email protected]> Signed-off-by: David S. Miller <[email protected]>
1 parent c5f66a8 commit 183dea5

File tree

1 file changed

+1
-8
lines changed

1 file changed

+1
-8
lines changed

net/openvswitch/vport-internal_dev.c

Lines changed: 1 addition & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -126,18 +126,12 @@ internal_get_stats(struct net_device *dev, struct rtnl_link_stats64 *stats)
126126
}
127127
}
128128

129-
static void internal_set_rx_headroom(struct net_device *dev, int new_hr)
130-
{
131-
dev->needed_headroom = new_hr < 0 ? 0 : new_hr;
132-
}
133-
134129
static const struct net_device_ops internal_dev_netdev_ops = {
135130
.ndo_open = internal_dev_open,
136131
.ndo_stop = internal_dev_stop,
137132
.ndo_start_xmit = internal_dev_xmit,
138133
.ndo_set_mac_address = eth_mac_addr,
139134
.ndo_get_stats64 = internal_get_stats,
140-
.ndo_set_rx_headroom = internal_set_rx_headroom,
141135
};
142136

143137
static struct rtnl_link_ops internal_dev_link_ops __read_mostly = {
@@ -154,7 +148,7 @@ static void do_setup(struct net_device *netdev)
154148

155149
netdev->priv_flags &= ~IFF_TX_SKB_SHARING;
156150
netdev->priv_flags |= IFF_LIVE_ADDR_CHANGE | IFF_OPENVSWITCH |
157-
IFF_PHONY_HEADROOM | IFF_NO_QUEUE;
151+
IFF_NO_QUEUE;
158152
netdev->needs_free_netdev = true;
159153
netdev->priv_destructor = internal_dev_destructor;
160154
netdev->ethtool_ops = &internal_dev_ethtool_ops;
@@ -195,7 +189,6 @@ static struct vport *internal_dev_create(const struct vport_parms *parms)
195189
err = -ENOMEM;
196190
goto error_free_netdev;
197191
}
198-
vport->dev->needed_headroom = vport->dp->max_headroom;
199192

200193
dev_net_set(vport->dev, ovs_dp_get_net(vport->dp));
201194
internal_dev = internal_dev_priv(vport->dev);

0 commit comments

Comments
 (0)