Hello, On Thu, 8 Aug 2013, Simon Kirby wrote: > On Tue, Aug 06, 2013 at 09:45:24AM +0300, Julian Anastasov wrote: > > > Reading your reply I see that the key issue you are > > missing here is that the type of loh/doh matters, it should > > match the type of atomic_read (and its signedness). > > I'm not missing it, I was just trying to determine if the weight _should_ > be signed or not. :) I've never seen a negative weight documented > anywhere. Weight should be >= 0, there is a 'server weight less than zero' error otherwise. > > It is faster because your loh/doh are u32 and single mul is > > generated while for u64*s32 we have u64=u32*s32 which obviously > > is not implemented with single imul/mul. Our goal is single imul. > > Ok, well, it turns out that GCC doesn't care and uses the signal register > instruction form of imull anyway :) -> OK, so everything is as expected :) > Ok, here is a patch (on current ipvs-next) that makes everything "int" > and adds only a (__s64) cast in front of the loh and doh during > multiplication to solve the original overflow problem. Very good, thanks! > Simon- > > > Some scheduling modules such as lblc and lblcr require weight to be as > high as the maximum number of expected active connections. Meanwhile, > commit b552f7e3a9524abcbcdf, which appeared in 2.6.39-rc, cleaned up the > consideration of inactconns and activeconns to always count activeconns > as 256 times more important than inactconns. > > In our case, this exposed an integer overflow because we regularly exceed > 3000 active connections to a real server. A weight of 3000 * 256 * 3000 > connections overflows the signed integer used when determining when to > reschedule. The original factor of 50 did not overflow, though was close. > > On amd64, this merely changes the multiply and comparison instructions to > 64-bit. On x86, the 64-bit result is already present from imull, so only > a few more comparisons are emitted. > > Signed-off-by: Simon Kirby <sim@xxxxxxxxxx> Looks good to me, even if you add space between "(__s64)" cast and "loh"/"doh". 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. 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! > --- > 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 | 6 +++--- > net/netfilter/ipvs/ip_vs_sed.c | 6 +++--- > net/netfilter/ipvs/ip_vs_wlc.c | 6 +++--- > 6 files changed, 18 insertions(+), 18 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) > { > /* 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