sbrk(2) broken
Robert Watson
rwatson at FreeBSD.org
Thu Jan 3 16:31:57 PST 2008
On Thu, 3 Jan 2008, Scott Long wrote:
>>> That is a pretty damning argument in my mind. Why make such a major
>>> change right before the release when it's effectively useless?
>>
>> The motivation for the change is to preserve POLA as malloc() does honor
>> RLIMIT_DATA in previous releases (4.x, 6.x, etc.). That said, I think
>> RLIMIT_VMEM is probably more useful going forward. I know at work we have
>> lots of hacks to deal with maxdsiz and trying to allow apps that use large
>> malloc() and large mmap both cooperate. Having one resource limit for
>> malloc + mmap is probably best for the future.
The reason I'm more of a fan of introducing LIMIT_SWAP is that I'd like to be
able to specifically avoid swap exhaustion by a process without preventing it
from memory mapping large files.
> If it were happening on a stable branch, I'd agree more with the POLA
> argument. The tradeoff between last minute destabilization, which is exactly
> what happened here, and the highly imperfect and antiquated justification,
> is pretty bogus.
When Alan proposed this as the approach, it was presumably under the
assumption that it would be non-disruptive. As it has proven highly
disruptive, it's obviously not getting MFC'd for the release. Instead we'll
have to work on a solution for after .0, but make sure to document that the
default swap resource limits effectively enforced in all prior FreeBSD
releases are *not* enforced on 7.0, and that administrators wanting to prevent
users from exhausting swap accidentally with something like the following:
int
main(int argc, char *argv[])
{
char *c;
while (1) {
c = malloc(getpagsize());
if (c == NULL)
err(-1, "malloc");
*c = 'a';
}
}
will need to now manually set the virtual memory limit in login.conf. Note
that the above strongly resembles frequently run CGI scripts written by many
naive CGI script authors, so is something that we'd like to be robust against
in the same way we prefer to be robust against:
int
main(int argc, char *argv[])
{
while (1) {
fork();
}
}
Smacking the user is obviously a good idea, but taking down the multi-user web
server is not.
Robert N M Watson
Computer Laboratory
University of Cambridge
More information about the freebsd-current
mailing list