Hi Eric,

On Wed, 2016-09-28 at 18:42 -0700, Eric Dumazet wrote:
> On Wed, 2016-09-28 at 12:52 +0200, Paolo Abeni wrote:
> 
> > +static void udp_rmem_release(struct sock *sk, int partial)
> > +{
> > +   struct udp_sock *up = udp_sk(sk);
> > +   int fwd, amt;
> > +
> > +   if (partial && !udp_under_memory_pressure(sk))
> > +           return;
> > +
> > +   /* we can have concurrent release; if we catch any conflict
> > +    * we let only one of them do the work
> > +    */
> > +   if (atomic_dec_if_positive(&up->can_reclaim) < 0)
> > +           return;
> > +
> > +   fwd = __udp_forward(up, atomic_read(&sk->sk_rmem_alloc));
> > +   if (fwd < SK_MEM_QUANTUM + partial) {
> > +           atomic_inc(&up->can_reclaim);
> > +           return;
> > +   }
> > +
> > +   amt = (fwd - partial) & ~(SK_MEM_QUANTUM - 1);
> > +   atomic_sub(amt, &up->mem_allocated);
> > +   atomic_inc(&up->can_reclaim);
> > +
> > +   __sk_mem_reduce_allocated(sk, amt >> SK_MEM_QUANTUM_SHIFT);
> > +   sk->sk_forward_alloc = fwd - amt;
> > +}

Thank you for reviewing this!

> This is racy... 

Could you please elaborate? 

> all these atomics make me nervous...

I'd like to drop some of them if possible.

atomic_inc(&up->can_reclaim);

could probably be replaced with atomic_set(&up->can_reclaim, 1) since we
don't have concurrent processes doing that and can_reclaim.counter is
known to be 0 at that point.
Performance wise the impact is minimal, since in normal condition we do
the reclaim only on socket shutdown.

Paolo

Reply via email to