|
@@ -86,6 +86,8 @@ struct gtp_net {
|
|
|
|
|
|
static u32 gtp_h_initval;
|
|
static u32 gtp_h_initval;
|
|
|
|
|
|
|
|
+static void pdp_context_delete(struct pdp_ctx *pctx);
|
|
|
|
+
|
|
static inline u32 gtp0_hashfn(u64 tid)
|
|
static inline u32 gtp0_hashfn(u64 tid)
|
|
{
|
|
{
|
|
u32 *tid32 = (u32 *) &tid;
|
|
u32 *tid32 = (u32 *) &tid;
|
|
@@ -780,13 +782,10 @@ static void gtp_hashtable_free(struct gtp_dev *gtp)
|
|
struct pdp_ctx *pctx;
|
|
struct pdp_ctx *pctx;
|
|
int i;
|
|
int i;
|
|
|
|
|
|
- for (i = 0; i < gtp->hash_size; i++) {
|
|
|
|
- hlist_for_each_entry_rcu(pctx, >p->tid_hash[i], hlist_tid) {
|
|
|
|
- hlist_del_rcu(&pctx->hlist_tid);
|
|
|
|
- hlist_del_rcu(&pctx->hlist_addr);
|
|
|
|
- kfree_rcu(pctx, rcu_head);
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
|
|
+ for (i = 0; i < gtp->hash_size; i++)
|
|
|
|
+ hlist_for_each_entry_rcu(pctx, >p->tid_hash[i], hlist_tid)
|
|
|
|
+ pdp_context_delete(pctx);
|
|
|
|
+
|
|
synchronize_rcu();
|
|
synchronize_rcu();
|
|
kfree(gtp->addr_hash);
|
|
kfree(gtp->addr_hash);
|
|
kfree(gtp->tid_hash);
|
|
kfree(gtp->tid_hash);
|
|
@@ -995,6 +994,13 @@ static int ipv4_pdp_add(struct gtp_dev *gtp, struct genl_info *info)
|
|
return 0;
|
|
return 0;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+static void pdp_context_delete(struct pdp_ctx *pctx)
|
|
|
|
+{
|
|
|
|
+ hlist_del_rcu(&pctx->hlist_tid);
|
|
|
|
+ hlist_del_rcu(&pctx->hlist_addr);
|
|
|
|
+ kfree_rcu(pctx, rcu_head);
|
|
|
|
+}
|
|
|
|
+
|
|
static int gtp_genl_new_pdp(struct sk_buff *skb, struct genl_info *info)
|
|
static int gtp_genl_new_pdp(struct sk_buff *skb, struct genl_info *info)
|
|
{
|
|
{
|
|
struct gtp_dev *gtp;
|
|
struct gtp_dev *gtp;
|
|
@@ -1100,9 +1106,7 @@ static int gtp_genl_del_pdp(struct sk_buff *skb, struct genl_info *info)
|
|
netdev_dbg(pctx->dev, "GTPv1-U: deleting tunnel id = %x/%x (pdp %p)\n",
|
|
netdev_dbg(pctx->dev, "GTPv1-U: deleting tunnel id = %x/%x (pdp %p)\n",
|
|
pctx->u.v1.i_tei, pctx->u.v1.o_tei, pctx);
|
|
pctx->u.v1.i_tei, pctx->u.v1.o_tei, pctx);
|
|
|
|
|
|
- hlist_del_rcu(&pctx->hlist_tid);
|
|
|
|
- hlist_del_rcu(&pctx->hlist_addr);
|
|
|
|
- kfree_rcu(pctx, rcu_head);
|
|
|
|
|
|
+ pdp_context_delete(pctx);
|
|
|
|
|
|
out_unlock:
|
|
out_unlock:
|
|
rcu_read_unlock();
|
|
rcu_read_unlock();
|