Skip to content

Commit be4ace6

Browse files
tgrafdavem330
authored andcommitted
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 <[email protected]> Signed-off-by: Pravin B Shelar <[email protected]> Signed-off-by: David S. Miller <[email protected]>
1 parent 34ae932 commit be4ace6

File tree

6 files changed

+59
-91
lines changed

6 files changed

+59
-91
lines changed

net/openvswitch/datapath.c

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -188,7 +188,7 @@ static int get_dpifindex(const struct datapath *dp)
188188

189189
local = ovs_vport_rcu(dp, OVSP_LOCAL);
190190
if (local)
191-
ifindex = netdev_vport_priv(local)->dev->ifindex;
191+
ifindex = local->dev->ifindex;
192192
else
193193
ifindex = 0;
194194

@@ -2219,13 +2219,10 @@ static void __net_exit list_vports_from_net(struct net *net, struct net *dnet,
22192219
struct vport *vport;
22202220

22212221
hlist_for_each_entry(vport, &dp->ports[i], dp_hash_node) {
2222-
struct netdev_vport *netdev_vport;
2223-
22242222
if (vport->ops->type != OVS_VPORT_TYPE_INTERNAL)
22252223
continue;
22262224

2227-
netdev_vport = netdev_vport_priv(vport);
2228-
if (dev_net(netdev_vport->dev) == dnet)
2225+
if (dev_net(vport->dev) == dnet)
22292226
list_add(&vport->detach_list, head);
22302227
}
22312228
}

net/openvswitch/dp_notify.c

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -58,13 +58,10 @@ void ovs_dp_notify_wq(struct work_struct *work)
5858
struct hlist_node *n;
5959

6060
hlist_for_each_entry_safe(vport, n, &dp->ports[i], dp_hash_node) {
61-
struct netdev_vport *netdev_vport;
62-
6361
if (vport->ops->type != OVS_VPORT_TYPE_NETDEV)
6462
continue;
6563

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))
6865
dp_detach_port_notify(vport);
6966
}
7067
}

net/openvswitch/vport-internal_dev.c

Lines changed: 15 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -156,49 +156,44 @@ static void do_setup(struct net_device *netdev)
156156
static struct vport *internal_dev_create(const struct vport_parms *parms)
157157
{
158158
struct vport *vport;
159-
struct netdev_vport *netdev_vport;
160159
struct internal_dev *internal_dev;
161160
int err;
162161

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);
165163
if (IS_ERR(vport)) {
166164
err = PTR_ERR(vport);
167165
goto error;
168166
}
169167

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) {
176171
err = -ENOMEM;
177172
goto error_free_vport;
178173
}
179174

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);
182177
internal_dev->vport = vport;
183178

184179
/* Restrict bridge port to current netns. */
185180
if (vport->port_no == OVSP_LOCAL)
186-
netdev_vport->dev->features |= NETIF_F_NETNS_LOCAL;
181+
vport->dev->features |= NETIF_F_NETNS_LOCAL;
187182

188183
rtnl_lock();
189-
err = register_netdevice(netdev_vport->dev);
184+
err = register_netdevice(vport->dev);
190185
if (err)
191186
goto error_free_netdev;
192187

193-
dev_set_promiscuity(netdev_vport->dev, 1);
188+
dev_set_promiscuity(vport->dev, 1);
194189
rtnl_unlock();
195-
netif_start_queue(netdev_vport->dev);
190+
netif_start_queue(vport->dev);
196191

197192
return vport;
198193

199194
error_free_netdev:
200195
rtnl_unlock();
201-
free_netdev(netdev_vport->dev);
196+
free_netdev(vport->dev);
202197
error_free_vport:
203198
ovs_vport_free(vport);
204199
error:
@@ -207,21 +202,19 @@ static struct vport *internal_dev_create(const struct vport_parms *parms)
207202

208203
static void internal_dev_destroy(struct vport *vport)
209204
{
210-
struct netdev_vport *netdev_vport = netdev_vport_priv(vport);
211-
212-
netif_stop_queue(netdev_vport->dev);
205+
netif_stop_queue(vport->dev);
213206
rtnl_lock();
214-
dev_set_promiscuity(netdev_vport->dev, -1);
207+
dev_set_promiscuity(vport->dev, -1);
215208

216209
/* unregister_netdevice() waits for an RCU grace period. */
217-
unregister_netdevice(netdev_vport->dev);
210+
unregister_netdevice(vport->dev);
218211

219212
rtnl_unlock();
220213
}
221214

222215
static int internal_dev_recv(struct vport *vport, struct sk_buff *skb)
223216
{
224-
struct net_device *netdev = netdev_vport_priv(vport)->dev;
217+
struct net_device *netdev = vport->dev;
225218
int len;
226219

227220
if (unlikely(!(netdev->flags & IFF_UP))) {

net/openvswitch/vport-netdev.c

Lines changed: 39 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -83,104 +83,97 @@ static struct net_device *get_dpdev(const struct datapath *dp)
8383

8484
local = ovs_vport_ovsl(dp, OVSP_LOCAL);
8585
BUG_ON(!local);
86-
return netdev_vport_priv(local)->dev;
86+
return local->dev;
8787
}
8888

89-
static struct vport *netdev_create(const struct vport_parms *parms)
89+
static struct vport *netdev_link(struct vport *vport, const char *name)
9090
{
91-
struct vport *vport;
92-
struct netdev_vport *netdev_vport;
9391
int err;
9492

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) {
10695
err = -ENODEV;
10796
goto error_free_vport;
10897
}
10998

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)) {
113102
err = -EINVAL;
114103
goto error_put;
115104
}
116105

117106
rtnl_lock();
118-
err = netdev_master_upper_dev_link(netdev_vport->dev,
107+
err = netdev_master_upper_dev_link(vport->dev,
119108
get_dpdev(vport->dp));
120109
if (err)
121110
goto error_unlock;
122111

123-
err = netdev_rx_handler_register(netdev_vport->dev, netdev_frame_hook,
112+
err = netdev_rx_handler_register(vport->dev, netdev_frame_hook,
124113
vport);
125114
if (err)
126115
goto error_master_upper_dev_unlink;
127116

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;
131120
rtnl_unlock();
132121

133122
return vport;
134123

135124
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));
137126
error_unlock:
138127
rtnl_unlock();
139128
error_put:
140-
dev_put(netdev_vport->dev);
129+
dev_put(vport->dev);
141130
error_free_vport:
142131
ovs_vport_free(vport);
143-
error:
144132
return ERR_PTR(err);
145133
}
146134

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);
144+
}
145+
147146
static void free_port_rcu(struct rcu_head *rcu)
148147
{
149-
struct netdev_vport *netdev_vport = container_of(rcu,
150-
struct netdev_vport, rcu);
148+
struct vport *vport = container_of(rcu, struct vport, rcu);
151149

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);
154152
}
155153

156154
void ovs_netdev_detach_dev(struct vport *vport)
157155
{
158-
struct netdev_vport *netdev_vport = netdev_vport_priv(vport);
159-
160156
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);
166162
}
167163

168164
static void netdev_destroy(struct vport *vport)
169165
{
170-
struct netdev_vport *netdev_vport = netdev_vport_priv(vport);
171-
172166
rtnl_lock();
173-
if (netdev_vport->dev->priv_flags & IFF_OVS_DATAPATH)
167+
if (vport->dev->priv_flags & IFF_OVS_DATAPATH)
174168
ovs_netdev_detach_dev(vport);
175169
rtnl_unlock();
176170

177-
call_rcu(&netdev_vport->rcu, free_port_rcu);
171+
call_rcu(&vport->rcu, free_port_rcu);
178172
}
179173

180174
const char *ovs_netdev_get_name(const struct vport *vport)
181175
{
182-
const struct netdev_vport *netdev_vport = netdev_vport_priv(vport);
183-
return netdev_vport->dev->name;
176+
return vport->dev->name;
184177
}
185178

186179
static unsigned int packet_length(const struct sk_buff *skb)
@@ -195,18 +188,17 @@ static unsigned int packet_length(const struct sk_buff *skb)
195188

196189
static int netdev_send(struct vport *vport, struct sk_buff *skb)
197190
{
198-
struct netdev_vport *netdev_vport = netdev_vport_priv(vport);
199-
int mtu = netdev_vport->dev->mtu;
191+
int mtu = vport->dev->mtu;
200192
int len;
201193

202194
if (unlikely(packet_length(skb) > mtu && !skb_is_gso(skb))) {
203195
net_warn_ratelimited("%s: dropped over-mtu packet: %d > %d\n",
204-
netdev_vport->dev->name,
196+
vport->dev->name,
205197
packet_length(skb), mtu);
206198
goto drop;
207199
}
208200

209-
skb->dev = netdev_vport->dev;
201+
skb->dev = vport->dev;
210202
len = skb->len;
211203
dev_queue_xmit(skb);
212204

net/openvswitch/vport-netdev.h

Lines changed: 0 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -26,18 +26,6 @@
2626

2727
struct vport *ovs_netdev_get_vport(struct net_device *dev);
2828

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-
4129
const char *ovs_netdev_get_name(const struct vport *);
4230
void ovs_netdev_detach_dev(struct vport *);
4331

net/openvswitch/vport.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -107,7 +107,7 @@ struct vport_portids {
107107
* @detach_list: list used for detaching vport in net-exit call.
108108
*/
109109
struct vport {
110-
struct rcu_head rcu;
110+
struct net_device *dev;
111111
struct datapath *dp;
112112
struct vport_portids __rcu *upcall_portids;
113113
u16 port_no;
@@ -120,6 +120,7 @@ struct vport {
120120

121121
struct vport_err_stats err_stats;
122122
struct list_head detach_list;
123+
struct rcu_head rcu;
123124
};
124125

125126
/**

0 commit comments

Comments
 (0)