tech-kern archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

Re: sleeping instead of ENOBUFS on write to socket?



> [...], as local SOCK_DGRAM sockets will return ENOBUFS when kernel is
> out of buffer memory.  As I understand, there is no way to sleeep
> instead.

I've never investigated it in detail, but my understanding is that
that's the usual semantic for SOCK_DGRAM.

> I thought this was specific to SOCK_DGRAM, since SOCK_DGRAM is not
> supposed to be reliable.  I therefore added support for
> SOCK_SEQPACKET (SOCK_STREAM is not relevant, I need atomicity) in the
> kernel, but I face the very same problem, except that SOCK_SEQPACKET
> local sockets will return EMSGSIZE when kernel is out of buffer
> memory.

Does SOCK_SEQPACKET even work?  socket(2) on a handy 4.0.1 machine says
"presently implemented only for PF_NS"; someone must have added it to
AF_LOCAL, either after 4.0.1 or without updating socket(2).  Neat.

My reading is that SOCK_SEQPACKET is supposed to sleep: "...sequenced,
reliable, two-way connection-based data transmission path for
datagrams...".

> The questions:

> - did I miss a way to sleep on write when kernel is out of buffer
> memory?

Not AFAIK, FWTMBW.

> - if this is impossible, what about adding a socket option for that?

Good idea, I'd say.  (Not necessarily easy; I haven't looked at the
code.  But good.)

> - would it make sense to have such an option be the default for
> SOCK_STREAM and SOCK_SEQPACKET?

I think it is, for SOCK_STREAM.  I've certainly not run into a case
where it errors rather than sleeping when sleeping could alleviate a
resource shortage.

For SOCK_SEQPACKET, yes, I think it should be the default.

Might even make sense to implement it for AF_LOCAL SOCK_DGRAM.

/~\ The ASCII                             Mouse
\ / Ribbon Campaign
 X  Against HTML                mouse%rodents-montreal.org@localhost
/ \ Email!           7D C8 61 52 5D E7 2D 39  4E F1 31 3E E8 B3 27 4B


Home | Main Index | Thread Index | Old Index