LVS
lvs-devel
Google
 
Web LinuxVirtualServer.org

[lvs-devel] Fixed: [PATCH 2.6.23.1] IPVS: fixes possible real server ove

Subject: [lvs-devel] Fixed: [PATCH 2.6.23.1] IPVS: fixes possible real server overcommit on director failover.
From: horms at verge.net.au (Simon Horman)
Date: Mon, 5 Nov 2007 11:52:28 +0900
On Thu, Nov 01, 2007 at 03:28:48PM +0200, Rumen Bogdanovski wrote:
> 
> 
> > I hacked up something, though I need to double check that
> > I made all the substitutions correctly:
> 
> I think it is ok. It it is working for half an hour without a problem.
> Adding/removing real servers, connecting/disconnecting, simulating
> fail-overs no problems detected. And as I looked in the patch the
> substitutions looked correct.

Ok Great.

Sorry for messing up the posting of your other two patches (twice).
I will send them again. Once there is some response from netdev
about them we can address this patch.

> 
> Rumen
> 
> 
> 
> 
> > 
> > Index: net-2.6/include/net/ip_vs.h
> > ===================================================================
> > --- net-2.6.orig/include/net/ip_vs.h        2007-11-01 18:18:23.000000000 
> > +0900
> > +++ net-2.6/include/net/ip_vs.h     2007-11-01 18:19:22.000000000 +0900
> > @@ -949,6 +949,21 @@ extern int ip_vs_icmp_xmit
> >  (struct sk_buff *skb, struct ip_vs_conn *cp, struct ip_vs_protocol *pp, 
> > int offset);
> >  extern void ip_vs_dst_reset(struct ip_vs_dest *dest);
> >  
> > +static inline void ip_vs_dest_get(struct ip_vs_dest *dest)
> > +{
> > +   atomic_inc(&dest->refcnt);
> > +}
> > +
> > +static inline void ip_vs_dest_put(struct ip_vs_dest *dest)
> > +{
> > +   atomic_dec(&dest->refcnt);
> > +}
> > +
> > +static inline int ip_vs_dest_put_and_test(struct ip_vs_dest *dest)
> > +{
> > +   return atomic_dec_and_test(&dest->refcnt);
> > +}
> > +
> >  
> >  /*
> >   * This is a simple mechanism to ignore packets when
> > Index: net-2.6/net/ipv4/ipvs/ip_vs_conn.c
> > ===================================================================
> > --- net-2.6.orig/net/ipv4/ipvs/ip_vs_conn.c 2007-11-01 18:14:21.000000000 
> > +0900
> > +++ net-2.6/net/ipv4/ipvs/ip_vs_conn.c      2007-11-01 18:19:22.000000000 
> > +0900
> > @@ -390,7 +390,7 @@ ip_vs_bind_dest(struct ip_vs_conn *cp, s
> >             return;
> >  
> >     /* Increase the refcnt counter of the dest */
> > -   atomic_inc(&dest->refcnt);
> > +   ip_vs_dest_get(dest);
> >  
> >     /* Bind with the destination and its corresponding transmitter */
> >     cp->flags |= atomic_read(&dest->conn_flags);
> > @@ -497,7 +497,7 @@ static inline void ip_vs_unbind_dest(str
> >      * dest will be either in service's destination list
> >      * or in the trash.
> >      */
> > -   atomic_dec(&dest->refcnt);
> > +   ip_vs_dest_put(dest);
> >  }
> >  
> > 
> > Index: net-2.6/net/ipv4/ipvs/ip_vs_ctl.c
> > ===================================================================
> > --- net-2.6.orig/net/ipv4/ipvs/ip_vs_ctl.c  2007-11-01 18:14:21.000000000 
> > +0900
> > +++ net-2.6/net/ipv4/ipvs/ip_vs_ctl.c       2007-11-01 18:19:22.000000000 
> > +0900
> > @@ -601,7 +601,7 @@ struct ip_vs_dest *ip_vs_find_dest(__be3
> >             return NULL;
> >     dest = ip_vs_lookup_dest(svc, daddr, dport);
> >     if (dest)
> > -           atomic_inc(&dest->refcnt);
> > +           ip_vs_dest_get(dest);
> >     ip_vs_service_put(svc);
> >  
> >     return dest;
> > @@ -877,7 +877,7 @@ ip_vs_add_dest(struct ip_vs_service *svc
> >     /*
> >      * Add the dest entry into the list
> >      */
> > -   atomic_inc(&dest->refcnt);
> > +   ip_vs_dest_get(dest);
> >  
> >     write_lock_bh(&__ip_vs_svc_lock);
> >  
> > @@ -969,7 +969,7 @@ static void __ip_vs_del_dest(struct ip_v
> >      *  if nobody refers to it (refcnt=0). Otherwise, throw
> >      *  the destination into the trash.
> >      */
> > -   if (atomic_dec_and_test(&dest->refcnt)) {
> > +   if (ip_vs_dest_put_and_test(dest)) {
> >             ip_vs_dst_reset(dest);
> >             /* simply decrease svc->refcnt here, let the caller check
> >                and release the service if nobody refers to it.
> > @@ -984,7 +984,7 @@ static void __ip_vs_del_dest(struct ip_v
> >                       NIPQUAD(dest->addr), ntohs(dest->port),
> >                       atomic_read(&dest->refcnt));
> >             list_add(&dest->n_list, &ip_vs_dest_trash);
> > -           atomic_inc(&dest->refcnt);
> > +           ip_vs_dest_get(dest);
> >     }
> >  }
> >  
> > Index: net-2.6/net/ipv4/ipvs/ip_vs_dh.c
> > ===================================================================
> > --- net-2.6.orig/net/ipv4/ipvs/ip_vs_dh.c   2007-11-01 18:06:47.000000000 
> > +0900
> > +++ net-2.6/net/ipv4/ipvs/ip_vs_dh.c        2007-11-01 18:19:22.000000000 
> > +0900
> > @@ -103,7 +103,7 @@ ip_vs_dh_assign(struct ip_vs_dh_bucket *
> >                             p = p->next;
> >  
> >                     dest = list_entry(p, struct ip_vs_dest, n_list);
> > -                   atomic_inc(&dest->refcnt);
> > +                   ip_vs_dest_get(dest);
> >                     b->dest = dest;
> >  
> >                     p = p->next;
> > @@ -125,7 +125,7 @@ static void ip_vs_dh_flush(struct ip_vs_
> >     b = tbl;
> >     for (i=0; i<IP_VS_DH_TAB_SIZE; i++) {
> >             if (b->dest) {
> > -                   atomic_dec(&b->dest->refcnt);
> > +                   ip_vs_dest_put(b->dest);
> >                     b->dest = NULL;
> >             }
> >             b++;
> > Index: net-2.6/net/ipv4/ipvs/ip_vs_lblc.c
> > ===================================================================
> > --- net-2.6.orig/net/ipv4/ipvs/ip_vs_lblc.c 2007-11-01 18:06:47.000000000 
> > +0900
> > +++ net-2.6/net/ipv4/ipvs/ip_vs_lblc.c      2007-11-01 18:19:22.000000000 
> > +0900
> > @@ -174,7 +174,7 @@ ip_vs_lblc_new(__be32 daddr, struct ip_v
> >     INIT_LIST_HEAD(&en->list);
> >     en->addr = daddr;
> >  
> > -   atomic_inc(&dest->refcnt);
> > +   ip_vs_dest_get(dest);
> >     en->dest = dest;
> >  
> >     return en;
> > @@ -188,7 +188,7 @@ static inline void ip_vs_lblc_free(struc
> >      * We don't kfree dest because it is refered either by its service
> >      * or the trash dest list.
> >      */
> > -   atomic_dec(&en->dest->refcnt);
> > +   ip_vs_dest_put(en->dest);
> >     kfree(en);
> >  }
> >  
> > @@ -548,8 +548,8 @@ ip_vs_lblc_schedule(struct ip_vs_service
> >                             IP_VS_DBG(1, "no destination available\n");
> >                             return NULL;
> >                     }
> > -                   atomic_dec(&en->dest->refcnt);
> > -                   atomic_inc(&dest->refcnt);
> > +                   ip_vs_dest_put(en->dest);
> > +                   ip_vs_dest_get(dest);
> >                     en->dest = dest;
> >             }
> >     }
> > Index: net-2.6/net/ipv4/ipvs/ip_vs_lblcr.c
> > ===================================================================
> > --- net-2.6.orig/net/ipv4/ipvs/ip_vs_lblcr.c        2007-11-01 
> > 18:06:47.000000000 +0900
> > +++ net-2.6/net/ipv4/ipvs/ip_vs_lblcr.c     2007-11-01 18:19:22.000000000 
> > +0900
> > @@ -114,7 +114,7 @@ ip_vs_dest_set_insert(struct ip_vs_dest_
> >             return NULL;
> >     }
> >  
> > -   atomic_inc(&dest->refcnt);
> > +   ip_vs_dest_get(dest);
> >     e->dest = dest;
> >  
> >     /* link it to the list */
> > @@ -140,7 +140,7 @@ ip_vs_dest_set_erase(struct ip_vs_dest_s
> >                     *ep = e->next;
> >                     atomic_dec(&set->size);
> >                     set->lastmod = jiffies;
> > -                   atomic_dec(&e->dest->refcnt);
> > +                   ip_vs_dest_put(e->dest);
> >                     kfree(e);
> >                     break;
> >             }
> > @@ -160,7 +160,7 @@ static void ip_vs_dest_set_eraseall(stru
> >              * We don't kfree dest because it is refered either
> >              * by its service or by the trash dest list.
> >              */
> > -           atomic_dec(&e->dest->refcnt);
> > +           ip_vs_dest_put(e->dest);
> >             kfree(e);
> >     }
> >     write_unlock(&set->lock);
> > Index: net-2.6/net/ipv4/ipvs/ip_vs_sh.c
> > ===================================================================
> > --- net-2.6.orig/net/ipv4/ipvs/ip_vs_sh.c   2007-11-01 18:06:47.000000000 
> > +0900
> > +++ net-2.6/net/ipv4/ipvs/ip_vs_sh.c        2007-11-01 18:19:22.000000000 
> > +0900
> > @@ -100,7 +100,7 @@ ip_vs_sh_assign(struct ip_vs_sh_bucket *
> >                             p = p->next;
> >  
> >                     dest = list_entry(p, struct ip_vs_dest, n_list);
> > -                   atomic_inc(&dest->refcnt);
> > +                   ip_vs_dest_get(dest);
> >                     b->dest = dest;
> >  
> >                     p = p->next;
> > @@ -122,7 +122,7 @@ static void ip_vs_sh_flush(struct ip_vs_
> >     b = tbl;
> >     for (i=0; i<IP_VS_SH_TAB_SIZE; i++) {
> >             if (b->dest) {
> > -                   atomic_dec(&b->dest->refcnt);
> > +                   ip_vs_dest_put(b->dest);
> >                     b->dest = NULL;
> >             }
> >             b++;
> > 
> > LVS Development mailing list - lvs-devel at LinuxVirtualServer.org
> > Send requests to lvs-devel-request at LinuxVirtualServer.org
> > or go to http://lists.graemef.net/mailman/listinfo/lvs-devel
> 
> 
> LVS Development mailing list - lvs-devel at LinuxVirtualServer.org
> Send requests to lvs-devel-request at LinuxVirtualServer.org
> or go to http://lists.graemef.net/mailman/listinfo/lvs-devel

-- 
Horms
  H: http://www.vergenet.net/~horms/
  W: http://www.valinux.co.jp/en/



<Prev in Thread] Current Thread [Next in Thread>