diff options
author | David S. Miller <davem@davemloft.net> | 2010-12-14 13:01:14 -0800 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2010-12-14 13:01:14 -0800 |
commit | d33e455337ea2c71d09d7f4367d6ad6dd32b6965 (patch) | |
tree | d1b35b1be5ab73df6f7e57b86a2e68fad2990adf /include/net | |
parent | 9fe146aef44afe5ec677d8150b6ae94e09b773f7 (diff) | |
download | kernel_samsung_smdk4412-d33e455337ea2c71d09d7f4367d6ad6dd32b6965.zip kernel_samsung_smdk4412-d33e455337ea2c71d09d7f4367d6ad6dd32b6965.tar.gz kernel_samsung_smdk4412-d33e455337ea2c71d09d7f4367d6ad6dd32b6965.tar.bz2 |
net: Abstract default MTU metric calculation behind an accessor.
Like RTAX_ADVMSS, make the default calculation go through a dst_ops
method rather than caching the computation in the routing cache
entries.
Now dst metrics are pretty much left as-is when new entries are
created, thus optimizing metric sharing becomes a real possibility.
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'include/net')
-rw-r--r-- | include/net/dst.h | 15 | ||||
-rw-r--r-- | include/net/dst_ops.h | 1 |
2 files changed, 9 insertions, 7 deletions
diff --git a/include/net/dst.h b/include/net/dst.h index 03a1c3d..93b0310 100644 --- a/include/net/dst.h +++ b/include/net/dst.h @@ -113,7 +113,8 @@ static inline u32 dst_metric(const struct dst_entry *dst, const int metric) { WARN_ON_ONCE(metric == RTAX_HOPLIMIT || - metric == RTAX_ADVMSS); + metric == RTAX_ADVMSS || + metric == RTAX_MTU); return dst_metric_raw(dst, metric); } @@ -156,11 +157,11 @@ dst_feature(const struct dst_entry *dst, u32 feature) static inline u32 dst_mtu(const struct dst_entry *dst) { - u32 mtu = dst_metric(dst, RTAX_MTU); - /* - * Alexey put it here, so ask him about it :) - */ - barrier(); + u32 mtu = dst_metric_raw(dst, RTAX_MTU); + + if (!mtu) + mtu = dst->ops->default_mtu(dst); + return mtu; } @@ -186,7 +187,7 @@ dst_allfrag(const struct dst_entry *dst) } static inline int -dst_metric_locked(struct dst_entry *dst, int metric) +dst_metric_locked(const struct dst_entry *dst, int metric) { return dst_metric(dst, RTAX_LOCK) & (1<<metric); } diff --git a/include/net/dst_ops.h b/include/net/dst_ops.h index 15fb7af..21a320b 100644 --- a/include/net/dst_ops.h +++ b/include/net/dst_ops.h @@ -17,6 +17,7 @@ struct dst_ops { int (*gc)(struct dst_ops *ops); struct dst_entry * (*check)(struct dst_entry *, __u32 cookie); unsigned int (*default_advmss)(const struct dst_entry *); + unsigned int (*default_mtu)(const struct dst_entry *); void (*destroy)(struct dst_entry *); void (*ifdown)(struct dst_entry *, struct net_device *dev, int how); |