On Tue, 2005-08-02 at 06:54 +1000, Daniel Phillips wrote:
> Hi guys,
> 
> Well I have been reading net code seriously for two days, so I am still 
> basically a complete network klutz.  But we have a nasty network-realted vm 
> deadlock that needs fixing and there seems to be little choice but to wade in 
> and try to sort things out.
> 

We are also working on a similar problem where a set of critical TCP
connections need to successfully send/receive messages even under very
low memory conditions. But the assumption is that the low memory
situation lasts only for a short time(in the order of few minutes)
which should not cause any TCP timeouts to expire so that normal
connections can recover once the low memory situation is resolved.

> Here is the plan:
> 
>   * All protocols used on an interface that supports block IO must be
>     vm-aware.
> 
> If we wish, we can leave it up to the administrator to ensure that only 
> vm-aware protocols are used on an interface that supports block IO, or we can 
> do some automatic checking.
> 
>   * Any socket to be used for block IO will be marked as a "vmhelper".

I am assuming your 'vmhelper' is similar to a critical socket which can
be marked using a new socket option(ex: SO_CRITICAL).

> 
> The number of protocols that need to have this special knowledge is quite 
> small, e.g.: tcp, udp, sctp, icmp, arp, maybe a few others.  We are talking 
> about a line or two of code in each to add the necessary awareness.
> 
>   * Inside the network driver, when memory is low we will allocate space
>     for every incoming packet from a memory reserve, regardless of whether
>     it is related to block IO or not.
> 
>   * Under low memory, we call the protocol layer synchronously instead of
>     queuing the packet through softnet.
> 
> We do not necessarily have to bypass softnet, since there is a mechanism for 
> thottling packets at this point.  However, there is a big problem with 
> throttling here: we haven't classified the packet yet, so the throttling 
> might discard some block IO packets, which is exactly what we don't want to 
> do under memory pressure.
> 
>   * The protocol receive handler does the socket lookup, then if memory is
>     low, discards any packet not belonging to a vmhelper socket.
> 
> Roughly speaking, the driver allocates each skb via:
> 
>         skb = memory_pressure ? dev_alloc_skb_reserve() : dev_alloc_skb();

Instead of changing all the drivers to make them vm aware, we could add
a new priority flag(something like GFP_CRITICAL) which can be passed to
__dev_alloc_skb(). dev_alloc_skb becomes
    return __dev_alloc_skb(length, GFP_ATOMIC|GFP_CRITICAL);

Based on the memory pressure conditon, the VM can decide if the skb
needs to allocated from an emergency reserve.

> 
> Then the driver hands off the packet to netif_rx, which does:
> 
>         if (from_reserve(skb)) {
>               netif_receive_skb(skb);
>                 return;
>       }
>
> And in the protocol handler we have:
> 
>         if (memory_pressure && !is_vmhelper(sock) && from_reserve(skb))
>                 goto drop_the_packet;

I am not sure if we need the from_reserve() checks above.
We have to assume that all incoming packets are critical until we can
find the matching sk in the protocol handler code.

> 
> That is pretty much it.  Now, being a net newbie, it is not entirely clear to 
> me that we can call netif_receive_skb directly when packets are also being 
> queued through the softnet interface.  May I have some guidance on this 
> point, please?
> 
> If that works, I am prepared to justify and prove the rest.
> 
> Regards,
> 
> Daniel
> -
> To unsubscribe from this list: send the line "unsubscribe netdev" in
> the body of a message to [EMAIL PROTECTED]
> More majordomo info at  http://vger.kernel.org/majordomo-info.html
> 

-
To unsubscribe from this list: send the line "unsubscribe netdev" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to