From: Alex Z. <aj...@ca...> - 2002-07-22 08:58:12
|
Clive Nicolson wrote: > On Fri, 19 Jul 2002, Alex Zeffertt wrote: > The driver in question (Conexant's AccessRunner CnxADSL.o) was not calling > atm_charge(), the only effect was to cause that message when the device was > taken down. > > I added a call to atm_charge() just prior to push() . > > I assume that rx_inuse and tx_inuse are part of some "speed" control mechanism. No, I think it's to do with memory allocation control. The problem is that if one VC is receiving very fast, but the process that owns the socket is not reading, the driver will queue up more and more sk_buffs until allocatable memory is exhausted. To prevent this happening the kernel maintains a per socket value called rx_inuse. This represents the total memory allocated in the RX queue. The ATM driver should call atm_charge() to confirm that vcc->push()ing a new sk_buff would not cause rx_inuse to exceed vcc->sk->rcvbuf. If atm_charge() fails the driver should drop the sk_buff. This prevents memory exhaustion. Similarly for the send queue. BTW, here's how you set the sndbuf size from userland: int bufsize = 4096; setsockopt(fd,SOL_SOCKET,SO_SNDBUF, &bufsize ,sizeof(bufsize)) Alex > > Thanks > Clive > > > |