X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=datapath%2Fdatapath.c;h=5e1a352ccbd538b03caa223d663ad90179c90748;hb=85c74638ed99b77d6894385c3dce0175c4b4baa4;hp=fb23977ad80f73fb14d8be2e1558b9b987f4b489;hpb=72ca14c15430b1e06b06fa2042dab347c1c7d7df;p=openvswitch diff --git a/datapath/datapath.c b/datapath/datapath.c index fb23977a..5e1a352c 100644 --- a/datapath/datapath.c +++ b/datapath/datapath.c @@ -217,28 +217,30 @@ static int create_dp(int dp_idx, const char __user *devnamep) dp = kzalloc(sizeof *dp, GFP_KERNEL); if (dp == NULL) goto err_put_module; - + INIT_LIST_HEAD(&dp->port_list); mutex_init(&dp->mutex); dp->dp_idx = dp_idx; for (i = 0; i < DP_N_QUEUES; i++) skb_queue_head_init(&dp->queues[i]); init_waitqueue_head(&dp->waitqueue); + /* Allocate table. */ + err = -ENOMEM; + rcu_assign_pointer(dp->table, dp_table_create(DP_L1_SIZE)); + if (!dp->table) + goto err_free_dp; + /* Setup our datapath device */ dp_dev = dp_dev_create(dp, devname, ODPP_LOCAL); err = PTR_ERR(dp_dev); if (IS_ERR(dp_dev)) - goto err_free_dp; - - err = -ENOMEM; - rcu_assign_pointer(dp->table, dp_table_create(DP_L1_SIZE)); - if (!dp->table) - goto err_destroy_dp_dev; - INIT_LIST_HEAD(&dp->port_list); + goto err_destroy_table; err = new_nbp(dp, dp_dev, ODPP_LOCAL); - if (err) + if (err) { + dp_dev_destroy(dp_dev); goto err_destroy_table; + } dp->drop_frags = 0; dp->stats_percpu = alloc_percpu(struct dp_stats_percpu); @@ -258,8 +260,6 @@ err_destroy_local_port: dp_del_port(dp->ports[ODPP_LOCAL]); err_destroy_table: dp_table_destroy(dp->table, 0); -err_destroy_dp_dev: - dp_dev_destroy(dp_dev); err_free_dp: kfree(dp); err_put_module: @@ -516,7 +516,6 @@ void dp_process_received_packet(struct sk_buff *skb, struct net_bridge_port *p) struct sw_flow *flow; WARN_ON_ONCE(skb_shared(skb)); - WARN_ON_ONCE(skb->destructor); /* BHs are off so we don't have to use get_cpu()/put_cpu() here. */ stats = percpu_ptr(dp->stats_percpu, smp_processor_id());