diff options
author | Thomas Graf <tgraf@suug.ch> | 2015-07-21 04:44:04 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2015-07-21 13:39:07 -0400 |
commit | be4ace6e6b1bc12e18b25fe764917e09a1f96d7b (patch) | |
tree | 6b4ae588041d0245a5f1b2fe47118db445c3886f /net/openvswitch/vport-internal_dev.c | |
parent | 34ae932a40369be6bd6ea97d66b6686361b4370d (diff) |
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>
Diffstat (limited to 'net/openvswitch/vport-internal_dev.c')
-rw-r--r-- | net/openvswitch/vport-internal_dev.c | 37 |
1 files changed, 15 insertions, 22 deletions
diff --git a/net/openvswitch/vport-internal_dev.c b/net/openvswitch/vport-internal_dev.c index 6a55f7105505..a2c205d9a8d5 100644 --- a/net/openvswitch/vport-internal_dev.c +++ b/net/openvswitch/vport-internal_dev.c | |||
@@ -156,49 +156,44 @@ static void do_setup(struct net_device *netdev) | |||
156 | static struct vport *internal_dev_create(const struct vport_parms *parms) | 156 | static struct vport *internal_dev_create(const struct vport_parms *parms) |
157 | { | 157 | { |
158 | struct vport *vport; | 158 | struct vport *vport; |
159 | struct netdev_vport *netdev_vport; | ||
160 | struct internal_dev *internal_dev; | 159 | struct internal_dev *internal_dev; |
161 | int err; | 160 | int err; |
162 | 161 | ||
163 | vport = ovs_vport_alloc(sizeof(struct netdev_vport), | 162 | vport = ovs_vport_alloc(0, &ovs_internal_vport_ops, parms); |
164 | &ovs_internal_vport_ops, parms); | ||
165 | if (IS_ERR(vport)) { | 163 | if (IS_ERR(vport)) { |
166 | err = PTR_ERR(vport); | 164 | err = PTR_ERR(vport); |
167 | goto error; | 165 | goto error; |
168 | } | 166 | } |
169 | 167 | ||
170 | netdev_vport = netdev_vport_priv(vport); | 168 | vport->dev = alloc_netdev(sizeof(struct internal_dev), |
171 | 169 | parms->name, NET_NAME_UNKNOWN, do_setup); | |
172 | netdev_vport->dev = alloc_netdev(sizeof(struct internal_dev), | 170 | if (!vport->dev) { |
173 | parms->name, NET_NAME_UNKNOWN, | ||
174 | do_setup); | ||
175 | if (!netdev_vport->dev) { | ||
176 | err = -ENOMEM; | 171 | err = -ENOMEM; |
177 | goto error_free_vport; | 172 | goto error_free_vport; |
178 | } | 173 | } |
179 | 174 | ||
180 | dev_net_set(netdev_vport->dev, ovs_dp_get_net(vport->dp)); | 175 | dev_net_set(vport->dev, ovs_dp_get_net(vport->dp)); |
181 | internal_dev = internal_dev_priv(netdev_vport->dev); | 176 | internal_dev = internal_dev_priv(vport->dev); |
182 | internal_dev->vport = vport; | 177 | internal_dev->vport = vport; |
183 | 178 | ||
184 | /* Restrict bridge port to current netns. */ | 179 | /* Restrict bridge port to current netns. */ |
185 | if (vport->port_no == OVSP_LOCAL) | 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 | rtnl_lock(); | 183 | rtnl_lock(); |
189 | err = register_netdevice(netdev_vport->dev); | 184 | err = register_netdevice(vport->dev); |
190 | if (err) | 185 | if (err) |
191 | goto error_free_netdev; | 186 | goto error_free_netdev; |
192 | 187 | ||
193 | dev_set_promiscuity(netdev_vport->dev, 1); | 188 | dev_set_promiscuity(vport->dev, 1); |
194 | rtnl_unlock(); | 189 | rtnl_unlock(); |
195 | netif_start_queue(netdev_vport->dev); | 190 | netif_start_queue(vport->dev); |
196 | 191 | ||
197 | return vport; | 192 | return vport; |
198 | 193 | ||
199 | error_free_netdev: | 194 | error_free_netdev: |
200 | rtnl_unlock(); | 195 | rtnl_unlock(); |
201 | free_netdev(netdev_vport->dev); | 196 | free_netdev(vport->dev); |
202 | error_free_vport: | 197 | error_free_vport: |
203 | ovs_vport_free(vport); | 198 | ovs_vport_free(vport); |
204 | error: | 199 | error: |
@@ -207,21 +202,19 @@ error: | |||
207 | 202 | ||
208 | static void internal_dev_destroy(struct vport *vport) | 203 | static void internal_dev_destroy(struct vport *vport) |
209 | { | 204 | { |
210 | struct netdev_vport *netdev_vport = netdev_vport_priv(vport); | 205 | netif_stop_queue(vport->dev); |
211 | |||
212 | netif_stop_queue(netdev_vport->dev); | ||
213 | rtnl_lock(); | 206 | rtnl_lock(); |
214 | dev_set_promiscuity(netdev_vport->dev, -1); | 207 | dev_set_promiscuity(vport->dev, -1); |
215 | 208 | ||
216 | /* unregister_netdevice() waits for an RCU grace period. */ | 209 | /* unregister_netdevice() waits for an RCU grace period. */ |
217 | unregister_netdevice(netdev_vport->dev); | 210 | unregister_netdevice(vport->dev); |
218 | 211 | ||
219 | rtnl_unlock(); | 212 | rtnl_unlock(); |
220 | } | 213 | } |
221 | 214 | ||
222 | static int internal_dev_recv(struct vport *vport, struct sk_buff *skb) | 215 | static int internal_dev_recv(struct vport *vport, struct sk_buff *skb) |
223 | { | 216 | { |
224 | struct net_device *netdev = netdev_vport_priv(vport)->dev; | 217 | struct net_device *netdev = vport->dev; |
225 | int len; | 218 | int len; |
226 | 219 | ||
227 | if (unlikely(!(netdev->flags & IFF_UP))) { | 220 | if (unlikely(!(netdev->flags & IFF_UP))) { |