X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=datapath%2Fvport-patch.c;h=d27509a16a963fcc27252ba82fac616daa5e8ef4;hb=cdee00f;hp=b0ae3a070f6713c38c3761d1a65bc73653bda191;hpb=7237e4f4b6155eb4854cebc0a45fe845f0950b40;p=openvswitch diff --git a/datapath/vport-patch.c b/datapath/vport-patch.c index b0ae3a07..d27509a1 100644 --- a/datapath/vport-patch.c +++ b/datapath/vport-patch.c @@ -22,6 +22,8 @@ struct device_config { }; struct patch_vport { + struct rcu_head rcu; + char name[IFNAMSIZ]; /* Protected by RTNL lock. */ @@ -128,8 +130,8 @@ static struct vport *patch_create(const struct vport_parms *parms) vport_gen_rand_ether_addr(patch_vport->devconf->eth_addr); - /* Make the default MTU fairly large so that it doesn't become the - * bottleneck on systems using jumbo frames. */ + /* Make the default MTU fairly large so that it doesn't become the + * bottleneck on systems using jumbo frames. */ patch_vport->devconf->mtu = 65535; hlist_add_head(&patch_vport->hash_node, hash_bucket(patch_vport->peer_name)); @@ -158,19 +160,22 @@ static int patch_modify(struct vport *vport, struct odp_port *port) return err; } +static void free_port_rcu(struct rcu_head *rcu) +{ + struct patch_vport *patch_vport = container_of(rcu, + struct patch_vport, rcu); + + kfree(patch_vport->devconf); + vport_free(vport_from_priv(patch_vport)); +} + static int patch_destroy(struct vport *vport) { struct patch_vport *patch_vport = patch_vport_priv(vport); update_peers(patch_vport->name, NULL); - rcu_assign_pointer(patch_vport->peer, NULL); - hlist_del(&patch_vport->hash_node); - - synchronize_rcu(); - - kfree(patch_vport->devconf); - vport_free(vport); + call_rcu(&patch_vport->rcu, free_port_rcu); return 0; }