summaryrefslogtreecommitdiffstats
path: root/net/ipv4/route.c
diff options
context:
space:
mode:
authorDave Airlie <airlied@redhat.com>2017-05-30 15:54:15 +1000
committerDave Airlie <airlied@redhat.com>2017-05-30 15:54:15 +1000
commit2a1720376adda5ecf8e636fbfb05339c7dad1c55 (patch)
treecdb76abac82306516aa556d9e9ddb15571f07517 /net/ipv4/route.c
parenta82256bc026722800d1fdeca5521f1ba487bc2ef (diff)
parent5ed02dbb497422bf225783f46e6eadd237d23d6b (diff)
downloadlinux-stable-2a1720376adda5ecf8e636fbfb05339c7dad1c55.tar.gz
linux-stable-2a1720376adda5ecf8e636fbfb05339c7dad1c55.tar.bz2
linux-stable-2a1720376adda5ecf8e636fbfb05339c7dad1c55.zip
Backmerge tag 'v4.12-rc3' into drm-next
Linux 4.12-rc3 Daniel has requested this for some drm-intel-next work.
Diffstat (limited to 'net/ipv4/route.c')
-rw-r--r--net/ipv4/route.c10
1 files changed, 9 insertions, 1 deletions
diff --git a/net/ipv4/route.c b/net/ipv4/route.c
index 655d9eebe43e..6883b3d4ba8f 100644
--- a/net/ipv4/route.c
+++ b/net/ipv4/route.c
@@ -1385,8 +1385,12 @@ static void rt_add_uncached_list(struct rtable *rt)
static void ipv4_dst_destroy(struct dst_entry *dst)
{
+ struct dst_metrics *p = (struct dst_metrics *)DST_METRICS_PTR(dst);
struct rtable *rt = (struct rtable *) dst;
+ if (p != &dst_default_metrics && atomic_dec_and_test(&p->refcnt))
+ kfree(p);
+
if (!list_empty(&rt->rt_uncached)) {
struct uncached_list *ul = rt->rt_uncached_list;
@@ -1438,7 +1442,11 @@ static void rt_set_nexthop(struct rtable *rt, __be32 daddr,
rt->rt_gateway = nh->nh_gw;
rt->rt_uses_gateway = 1;
}
- dst_init_metrics(&rt->dst, fi->fib_metrics, true);
+ dst_init_metrics(&rt->dst, fi->fib_metrics->metrics, true);
+ if (fi->fib_metrics != &dst_default_metrics) {
+ rt->dst._metrics |= DST_METRICS_REFCOUNTED;
+ atomic_inc(&fi->fib_metrics->refcnt);
+ }
#ifdef CONFIG_IP_ROUTE_CLASSID
rt->dst.tclassid = nh->nh_tclassid;
#endif