Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

openvswitch: Move dev pointer into vport itself

This is the first step in representing all OVS vports as regular
struct net_devices. Move the net_device pointer into the vport
structure itself to get rid of struct vport_netdev.

Signed-off-by: Thomas Graf <tgraf@suug.ch>
Signed-off-by: Pravin B Shelar <pshelar@nicira.com>
Signed-off-by: David S. Miller <davem@davemloft.net>

authored by

Thomas Graf and committed by
David S. Miller
be4ace6e 34ae932a

+59 -91
+2 -5
net/openvswitch/datapath.c
··· 188 188 189 189 local = ovs_vport_rcu(dp, OVSP_LOCAL); 190 190 if (local) 191 - ifindex = netdev_vport_priv(local)->dev->ifindex; 191 + ifindex = local->dev->ifindex; 192 192 else 193 193 ifindex = 0; 194 194 ··· 2219 2219 struct vport *vport; 2220 2220 2221 2221 hlist_for_each_entry(vport, &dp->ports[i], dp_hash_node) { 2222 - struct netdev_vport *netdev_vport; 2223 - 2224 2222 if (vport->ops->type != OVS_VPORT_TYPE_INTERNAL) 2225 2223 continue; 2226 2224 2227 - netdev_vport = netdev_vport_priv(vport); 2228 - if (dev_net(netdev_vport->dev) == dnet) 2225 + if (dev_net(vport->dev) == dnet) 2229 2226 list_add(&vport->detach_list, head); 2230 2227 } 2231 2228 }
+1 -4
net/openvswitch/dp_notify.c
··· 58 58 struct hlist_node *n; 59 59 60 60 hlist_for_each_entry_safe(vport, n, &dp->ports[i], dp_hash_node) { 61 - struct netdev_vport *netdev_vport; 62 - 63 61 if (vport->ops->type != OVS_VPORT_TYPE_NETDEV) 64 62 continue; 65 63 66 - netdev_vport = netdev_vport_priv(vport); 67 - if (!(netdev_vport->dev->priv_flags & IFF_OVS_DATAPATH)) 64 + if (!(vport->dev->priv_flags & IFF_OVS_DATAPATH)) 68 65 dp_detach_port_notify(vport); 69 66 } 70 67 }
+15 -22
net/openvswitch/vport-internal_dev.c
··· 156 156 static struct vport *internal_dev_create(const struct vport_parms *parms) 157 157 { 158 158 struct vport *vport; 159 - struct netdev_vport *netdev_vport; 160 159 struct internal_dev *internal_dev; 161 160 int err; 162 161 163 - vport = ovs_vport_alloc(sizeof(struct netdev_vport), 164 - &ovs_internal_vport_ops, parms); 162 + vport = ovs_vport_alloc(0, &ovs_internal_vport_ops, parms); 165 163 if (IS_ERR(vport)) { 166 164 err = PTR_ERR(vport); 167 165 goto error; 168 166 } 169 167 170 - netdev_vport = netdev_vport_priv(vport); 171 - 172 - netdev_vport->dev = alloc_netdev(sizeof(struct internal_dev), 173 - parms->name, NET_NAME_UNKNOWN, 174 - do_setup); 175 - if (!netdev_vport->dev) { 168 + vport->dev = alloc_netdev(sizeof(struct internal_dev), 169 + parms->name, NET_NAME_UNKNOWN, do_setup); 170 + if (!vport->dev) { 176 171 err = -ENOMEM; 177 172 goto error_free_vport; 178 173 } 179 174 180 - dev_net_set(netdev_vport->dev, ovs_dp_get_net(vport->dp)); 181 - internal_dev = internal_dev_priv(netdev_vport->dev); 175 + dev_net_set(vport->dev, ovs_dp_get_net(vport->dp)); 176 + internal_dev = internal_dev_priv(vport->dev); 182 177 internal_dev->vport = vport; 183 178 184 179 /* Restrict bridge port to current netns. */ 185 180 if (vport->port_no == OVSP_LOCAL) 186 - netdev_vport->dev->features |= NETIF_F_NETNS_LOCAL; 181 + vport->dev->features |= NETIF_F_NETNS_LOCAL; 187 182 188 183 rtnl_lock(); 189 - err = register_netdevice(netdev_vport->dev); 184 + err = register_netdevice(vport->dev); 190 185 if (err) 191 186 goto error_free_netdev; 192 187 193 - dev_set_promiscuity(netdev_vport->dev, 1); 188 + dev_set_promiscuity(vport->dev, 1); 194 189 rtnl_unlock(); 195 - netif_start_queue(netdev_vport->dev); 190 + netif_start_queue(vport->dev); 196 191 197 192 return vport; 198 193 199 194 error_free_netdev: 200 195 rtnl_unlock(); 201 - free_netdev(netdev_vport->dev); 196 + free_netdev(vport->dev); 202 197 error_free_vport: 203 198 ovs_vport_free(vport); 204 199 error: ··· 202 207 203 208 static void internal_dev_destroy(struct vport *vport) 204 209 { 205 - struct netdev_vport *netdev_vport = netdev_vport_priv(vport); 206 - 207 - netif_stop_queue(netdev_vport->dev); 210 + netif_stop_queue(vport->dev); 208 211 rtnl_lock(); 209 - dev_set_promiscuity(netdev_vport->dev, -1); 212 + dev_set_promiscuity(vport->dev, -1); 210 213 211 214 /* unregister_netdevice() waits for an RCU grace period. */ 212 - unregister_netdevice(netdev_vport->dev); 215 + unregister_netdevice(vport->dev); 213 216 214 217 rtnl_unlock(); 215 218 } 216 219 217 220 static int internal_dev_recv(struct vport *vport, struct sk_buff *skb) 218 221 { 219 - struct net_device *netdev = netdev_vport_priv(vport)->dev; 222 + struct net_device *netdev = vport->dev; 220 223 int len; 221 224 222 225 if (unlikely(!(netdev->flags & IFF_UP))) {
+39 -47
net/openvswitch/vport-netdev.c
··· 83 83 84 84 local = ovs_vport_ovsl(dp, OVSP_LOCAL); 85 85 BUG_ON(!local); 86 - return netdev_vport_priv(local)->dev; 86 + return local->dev; 87 87 } 88 88 89 - static struct vport *netdev_create(const struct vport_parms *parms) 89 + static struct vport *netdev_link(struct vport *vport, const char *name) 90 90 { 91 - struct vport *vport; 92 - struct netdev_vport *netdev_vport; 93 91 int err; 94 92 95 - vport = ovs_vport_alloc(sizeof(struct netdev_vport), 96 - &ovs_netdev_vport_ops, parms); 97 - if (IS_ERR(vport)) { 98 - err = PTR_ERR(vport); 99 - goto error; 100 - } 101 - 102 - netdev_vport = netdev_vport_priv(vport); 103 - 104 - netdev_vport->dev = dev_get_by_name(ovs_dp_get_net(vport->dp), parms->name); 105 - if (!netdev_vport->dev) { 93 + vport->dev = dev_get_by_name(ovs_dp_get_net(vport->dp), name); 94 + if (!vport->dev) { 106 95 err = -ENODEV; 107 96 goto error_free_vport; 108 97 } 109 98 110 - if (netdev_vport->dev->flags & IFF_LOOPBACK || 111 - netdev_vport->dev->type != ARPHRD_ETHER || 112 - ovs_is_internal_dev(netdev_vport->dev)) { 99 + if (vport->dev->flags & IFF_LOOPBACK || 100 + vport->dev->type != ARPHRD_ETHER || 101 + ovs_is_internal_dev(vport->dev)) { 113 102 err = -EINVAL; 114 103 goto error_put; 115 104 } 116 105 117 106 rtnl_lock(); 118 - err = netdev_master_upper_dev_link(netdev_vport->dev, 107 + err = netdev_master_upper_dev_link(vport->dev, 119 108 get_dpdev(vport->dp)); 120 109 if (err) 121 110 goto error_unlock; 122 111 123 - err = netdev_rx_handler_register(netdev_vport->dev, netdev_frame_hook, 112 + err = netdev_rx_handler_register(vport->dev, netdev_frame_hook, 124 113 vport); 125 114 if (err) 126 115 goto error_master_upper_dev_unlink; 127 116 128 - dev_disable_lro(netdev_vport->dev); 129 - dev_set_promiscuity(netdev_vport->dev, 1); 130 - netdev_vport->dev->priv_flags |= IFF_OVS_DATAPATH; 117 + dev_disable_lro(vport->dev); 118 + dev_set_promiscuity(vport->dev, 1); 119 + vport->dev->priv_flags |= IFF_OVS_DATAPATH; 131 120 rtnl_unlock(); 132 121 133 122 return vport; 134 123 135 124 error_master_upper_dev_unlink: 136 - netdev_upper_dev_unlink(netdev_vport->dev, get_dpdev(vport->dp)); 125 + netdev_upper_dev_unlink(vport->dev, get_dpdev(vport->dp)); 137 126 error_unlock: 138 127 rtnl_unlock(); 139 128 error_put: 140 - dev_put(netdev_vport->dev); 129 + dev_put(vport->dev); 141 130 error_free_vport: 142 131 ovs_vport_free(vport); 143 - error: 144 132 return ERR_PTR(err); 133 + } 134 + 135 + static struct vport *netdev_create(const struct vport_parms *parms) 136 + { 137 + struct vport *vport; 138 + 139 + vport = ovs_vport_alloc(0, &ovs_netdev_vport_ops, parms); 140 + if (IS_ERR(vport)) 141 + return vport; 142 + 143 + return netdev_link(vport, parms->name); 145 144 } 146 145 147 146 static void free_port_rcu(struct rcu_head *rcu) 148 147 { 149 - struct netdev_vport *netdev_vport = container_of(rcu, 150 - struct netdev_vport, rcu); 148 + struct vport *vport = container_of(rcu, struct vport, rcu); 151 149 152 - dev_put(netdev_vport->dev); 153 - ovs_vport_free(vport_from_priv(netdev_vport)); 150 + dev_put(vport->dev); 151 + ovs_vport_free(vport); 154 152 } 155 153 156 154 void ovs_netdev_detach_dev(struct vport *vport) 157 155 { 158 - struct netdev_vport *netdev_vport = netdev_vport_priv(vport); 159 - 160 156 ASSERT_RTNL(); 161 - netdev_vport->dev->priv_flags &= ~IFF_OVS_DATAPATH; 162 - netdev_rx_handler_unregister(netdev_vport->dev); 163 - netdev_upper_dev_unlink(netdev_vport->dev, 164 - netdev_master_upper_dev_get(netdev_vport->dev)); 165 - dev_set_promiscuity(netdev_vport->dev, -1); 157 + vport->dev->priv_flags &= ~IFF_OVS_DATAPATH; 158 + netdev_rx_handler_unregister(vport->dev); 159 + netdev_upper_dev_unlink(vport->dev, 160 + netdev_master_upper_dev_get(vport->dev)); 161 + dev_set_promiscuity(vport->dev, -1); 166 162 } 167 163 168 164 static void netdev_destroy(struct vport *vport) 169 165 { 170 - struct netdev_vport *netdev_vport = netdev_vport_priv(vport); 171 - 172 166 rtnl_lock(); 173 - if (netdev_vport->dev->priv_flags & IFF_OVS_DATAPATH) 167 + if (vport->dev->priv_flags & IFF_OVS_DATAPATH) 174 168 ovs_netdev_detach_dev(vport); 175 169 rtnl_unlock(); 176 170 177 - call_rcu(&netdev_vport->rcu, free_port_rcu); 171 + call_rcu(&vport->rcu, free_port_rcu); 178 172 } 179 173 180 174 const char *ovs_netdev_get_name(const struct vport *vport) 181 175 { 182 - const struct netdev_vport *netdev_vport = netdev_vport_priv(vport); 183 - return netdev_vport->dev->name; 176 + return vport->dev->name; 184 177 } 185 178 186 179 static unsigned int packet_length(const struct sk_buff *skb) ··· 188 195 189 196 static int netdev_send(struct vport *vport, struct sk_buff *skb) 190 197 { 191 - struct netdev_vport *netdev_vport = netdev_vport_priv(vport); 192 - int mtu = netdev_vport->dev->mtu; 198 + int mtu = vport->dev->mtu; 193 199 int len; 194 200 195 201 if (unlikely(packet_length(skb) > mtu && !skb_is_gso(skb))) { 196 202 net_warn_ratelimited("%s: dropped over-mtu packet: %d > %d\n", 197 - netdev_vport->dev->name, 203 + vport->dev->name, 198 204 packet_length(skb), mtu); 199 205 goto drop; 200 206 } 201 207 202 - skb->dev = netdev_vport->dev; 208 + skb->dev = vport->dev; 203 209 len = skb->len; 204 210 dev_queue_xmit(skb); 205 211
-12
net/openvswitch/vport-netdev.h
··· 26 26 27 27 struct vport *ovs_netdev_get_vport(struct net_device *dev); 28 28 29 - struct netdev_vport { 30 - struct rcu_head rcu; 31 - 32 - struct net_device *dev; 33 - }; 34 - 35 - static inline struct netdev_vport * 36 - netdev_vport_priv(const struct vport *vport) 37 - { 38 - return vport_priv(vport); 39 - } 40 - 41 29 const char *ovs_netdev_get_name(const struct vport *); 42 30 void ovs_netdev_detach_dev(struct vport *); 43 31
+2 -1
net/openvswitch/vport.h
··· 107 107 * @detach_list: list used for detaching vport in net-exit call. 108 108 */ 109 109 struct vport { 110 - struct rcu_head rcu; 110 + struct net_device *dev; 111 111 struct datapath *dp; 112 112 struct vport_portids __rcu *upcall_portids; 113 113 u16 port_no; ··· 120 120 121 121 struct vport_err_stats err_stats; 122 122 struct list_head detach_list; 123 + struct rcu_head rcu; 123 124 }; 124 125 125 126 /**