From: Pavel Begunkov > Sent: 11 February 2020 11:05 > On 2/11/2020 1:07 PM, David Laight wrote: > > From: Pavel Begunkov > >> Sent: 07 February 2020 19:05 > >> Allocated iovec is freed only in io_{read,write,send,recv)(), and just > >> leaves it if an error occured. There are plenty of such cases: > >> - cancellation of non-head requests > >> - fail grabbing files in __io_queue_sqe() > >> - set REQ_F_NOWAIT and returning in __io_queue_sqe() > >> - etc. > >> > >> Add REQ_F_NEED_CLEANUP, which will force such requests with custom > >> allocated resourses go through cleanup handlers on put. > > > > This looks horribly fragile. > > Well, not as horrible as it may appear -- set the flag, whenever you > want the corresponding destructor to be called, and clear it when is not > needed anymore. > > I'd love to have something better, maybe even something more intrusive > for-next, but that shouldn't hurt the hot path. Any ideas? Given all the 'cud chewing' that happens in code paths like the one that read iov from userspace just adding: if (unlikely(foo->ptr)) kfree(foo->ptr); before 'foo' goes out of scope (or is reused) is probably not measurable. David - Registered Address Lakeside, Bramley Road, Mount Farm, Milton Keynes, MK1 1PT, UK Registration No: 1397386 (Wales)