Hello, On Sat, 10 Aug 2013, Simon Kirby wrote: > On Fri, Aug 09, 2013 at 12:02:11PM +0300, Julian Anastasov wrote: > > > Looks good to me, even if you add space > > between "(__s64)" cast and "loh"/"doh". > > I think (__s64)loh * doh makes more sense as the cast applies to the > variable before the multiply is evaluated. OK > > But after your fix for ip_vs_dest_conn_overhead > > I see that also ip_vs_nq_dest_overhead and ip_vs_sed_dest_overhead > > need to return int instead of unsigned int. I'll ack > > v2 with these changes. > > Ok, fixed. :) Thanks! > > Also, shorter subject is preferred, you can use > > 'ipvs: fix overflow on dest weight multiply' or something > > else that you feel is better, '()' and '*' does not look > > good in subject. Thanks! > > -- 8< -- > > Schedulers such as lblc and lblcr require the weight to be as high as the > maximum number of active connections. In commit b552f7e3a9524abcbcdf, the > consideration of inactconns and activeconns was cleaned up to always > count activeconns as 256 times more important than inactconns. In cases > where 3000 or more connections are expected, a weight of 3000 * 256 * > 3000 connections overflows the 32-bit signed result used to determine if > rescheduling is required. > > On amd64, this merely changes the multiply and comparison instructions to > 64-bit. On x86, a 64-bit result is already present from imull, so only > a few more comparison instructions are emitted. > > Signed-off-by: Simon Kirby <sim@xxxxxxxxxx> Acked-by: Julian Anastasov <ja@xxxxxx> Horms, please apply! > --- > include/net/ip_vs.h | 2 +- > net/netfilter/ipvs/ip_vs_lblc.c | 4 ++-- > net/netfilter/ipvs/ip_vs_lblcr.c | 12 ++++++------ > net/netfilter/ipvs/ip_vs_nq.c | 8 ++++---- > net/netfilter/ipvs/ip_vs_sed.c | 8 ++++---- > net/netfilter/ipvs/ip_vs_wlc.c | 6 +++--- > 6 files changed, 20 insertions(+), 20 deletions(-) > > diff --git a/include/net/ip_vs.h b/include/net/ip_vs.h > index f0d70f0..fe782ed 100644 > --- a/include/net/ip_vs.h > +++ b/include/net/ip_vs.h > @@ -1649,7 +1649,7 @@ static inline void ip_vs_conn_drop_conntrack(struct ip_vs_conn *cp) > /* CONFIG_IP_VS_NFCT */ > #endif > > -static inline unsigned int > +static inline int > ip_vs_dest_conn_overhead(struct ip_vs_dest *dest) > { > /* > diff --git a/net/netfilter/ipvs/ip_vs_lblc.c b/net/netfilter/ipvs/ip_vs_lblc.c > index 1383b0e..eb814bf 100644 > --- a/net/netfilter/ipvs/ip_vs_lblc.c > +++ b/net/netfilter/ipvs/ip_vs_lblc.c > @@ -443,8 +443,8 @@ __ip_vs_lblc_schedule(struct ip_vs_service *svc) > continue; > > doh = ip_vs_dest_conn_overhead(dest); > - if (loh * atomic_read(&dest->weight) > > - doh * atomic_read(&least->weight)) { > + if ((__s64)loh * atomic_read(&dest->weight) > > + (__s64)doh * atomic_read(&least->weight)) { > least = dest; > loh = doh; > } > diff --git a/net/netfilter/ipvs/ip_vs_lblcr.c b/net/netfilter/ipvs/ip_vs_lblcr.c > index 5199448..e65f7c5 100644 > --- a/net/netfilter/ipvs/ip_vs_lblcr.c > +++ b/net/netfilter/ipvs/ip_vs_lblcr.c > @@ -200,8 +200,8 @@ static inline struct ip_vs_dest *ip_vs_dest_set_min(struct ip_vs_dest_set *set) > continue; > > doh = ip_vs_dest_conn_overhead(dest); > - if ((loh * atomic_read(&dest->weight) > > - doh * atomic_read(&least->weight)) > + if (((__s64)loh * atomic_read(&dest->weight) > > + (__s64)doh * atomic_read(&least->weight)) > && (dest->flags & IP_VS_DEST_F_AVAILABLE)) { > least = dest; > loh = doh; > @@ -246,8 +246,8 @@ static inline struct ip_vs_dest *ip_vs_dest_set_max(struct ip_vs_dest_set *set) > dest = rcu_dereference_protected(e->dest, 1); > doh = ip_vs_dest_conn_overhead(dest); > /* moh/mw < doh/dw ==> moh*dw < doh*mw, where mw,dw>0 */ > - if ((moh * atomic_read(&dest->weight) < > - doh * atomic_read(&most->weight)) > + if (((__s64)moh * atomic_read(&dest->weight) < > + (__s64)doh * atomic_read(&most->weight)) > && (atomic_read(&dest->weight) > 0)) { > most = dest; > moh = doh; > @@ -611,8 +611,8 @@ __ip_vs_lblcr_schedule(struct ip_vs_service *svc) > continue; > > doh = ip_vs_dest_conn_overhead(dest); > - if (loh * atomic_read(&dest->weight) > > - doh * atomic_read(&least->weight)) { > + if ((__s64)loh * atomic_read(&dest->weight) > > + (__s64)doh * atomic_read(&least->weight)) { > least = dest; > loh = doh; > } > diff --git a/net/netfilter/ipvs/ip_vs_nq.c b/net/netfilter/ipvs/ip_vs_nq.c > index d8d9860..961a6de 100644 > --- a/net/netfilter/ipvs/ip_vs_nq.c > +++ b/net/netfilter/ipvs/ip_vs_nq.c > @@ -40,7 +40,7 @@ > #include <net/ip_vs.h> > > > -static inline unsigned int > +static inline int > ip_vs_nq_dest_overhead(struct ip_vs_dest *dest) > { > /* > @@ -59,7 +59,7 @@ ip_vs_nq_schedule(struct ip_vs_service *svc, const struct sk_buff *skb, > struct ip_vs_iphdr *iph) > { > struct ip_vs_dest *dest, *least = NULL; > - unsigned int loh = 0, doh; > + int loh = 0, doh; > > IP_VS_DBG(6, "%s(): Scheduling...\n", __func__); > > @@ -92,8 +92,8 @@ ip_vs_nq_schedule(struct ip_vs_service *svc, const struct sk_buff *skb, > } > > if (!least || > - (loh * atomic_read(&dest->weight) > > - doh * atomic_read(&least->weight))) { > + ((__s64)loh * atomic_read(&dest->weight) > > + (__s64)doh * atomic_read(&least->weight))) { > least = dest; > loh = doh; > } > diff --git a/net/netfilter/ipvs/ip_vs_sed.c b/net/netfilter/ipvs/ip_vs_sed.c > index a5284cc..e446b9f 100644 > --- a/net/netfilter/ipvs/ip_vs_sed.c > +++ b/net/netfilter/ipvs/ip_vs_sed.c > @@ -44,7 +44,7 @@ > #include <net/ip_vs.h> > > > -static inline unsigned int > +static inline int > ip_vs_sed_dest_overhead(struct ip_vs_dest *dest) > { > /* > @@ -63,7 +63,7 @@ ip_vs_sed_schedule(struct ip_vs_service *svc, const struct sk_buff *skb, > struct ip_vs_iphdr *iph) > { > struct ip_vs_dest *dest, *least; > - unsigned int loh, doh; > + int loh, doh; > > IP_VS_DBG(6, "%s(): Scheduling...\n", __func__); > > @@ -99,8 +99,8 @@ ip_vs_sed_schedule(struct ip_vs_service *svc, const struct sk_buff *skb, > if (dest->flags & IP_VS_DEST_F_OVERLOAD) > continue; > doh = ip_vs_sed_dest_overhead(dest); > - if (loh * atomic_read(&dest->weight) > > - doh * atomic_read(&least->weight)) { > + if ((__s64)loh * atomic_read(&dest->weight) > > + (__s64)doh * atomic_read(&least->weight)) { > least = dest; > loh = doh; > } > diff --git a/net/netfilter/ipvs/ip_vs_wlc.c b/net/netfilter/ipvs/ip_vs_wlc.c > index 6dc1fa1..b5b4650 100644 > --- a/net/netfilter/ipvs/ip_vs_wlc.c > +++ b/net/netfilter/ipvs/ip_vs_wlc.c > @@ -35,7 +35,7 @@ ip_vs_wlc_schedule(struct ip_vs_service *svc, const struct sk_buff *skb, > struct ip_vs_iphdr *iph) > { > struct ip_vs_dest *dest, *least; > - unsigned int loh, doh; > + int loh, doh; > > IP_VS_DBG(6, "ip_vs_wlc_schedule(): Scheduling...\n"); > > @@ -71,8 +71,8 @@ ip_vs_wlc_schedule(struct ip_vs_service *svc, const struct sk_buff *skb, > if (dest->flags & IP_VS_DEST_F_OVERLOAD) > continue; > doh = ip_vs_dest_conn_overhead(dest); > - if (loh * atomic_read(&dest->weight) > > - doh * atomic_read(&least->weight)) { > + if ((__s64)loh * atomic_read(&dest->weight) > > + (__s64)doh * atomic_read(&least->weight)) { > least = dest; > loh = doh; > } > -- > 1.8.4.rc1 Regards -- Julian Anastasov <ja@xxxxxx> -- To unsubscribe from this list: send the line "unsubscribe lvs-devel" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html