kern/60550: [PATCH] hitting process limits produces sub-optimal
error messages
Bruce Evans
bde at zeta.org.au
Wed Dec 24 21:40:12 PST 2003
The following reply was made to PR kern/60550; it has been noted by GNATS.
From: Bruce Evans <bde at zeta.org.au>
To: Lowell Gilbert <freebsd-bugs-local at be-well.no-ip.com>
Cc: FreeBSD-gnats-submit at FreeBSD.org, silby at FreeBSD.org,
freebsd-gnats-submit at FreeBSD.org
Subject: Re: kern/60550: [PATCH] hitting process limits produces sub-optimal
error messages
Date: Thu, 25 Dec 2003 16:29:59 +1100 (EST)
On Wed, 24 Dec 2003, Lowell Gilbert wrote:
> >Description:
>
> Recent changes to the fork code (to control boot-time interrupt
> storms) added some error messages for the cases where process limits
> are hit. These list the UID hitting the limit, but not a process ID,
> which would be useful also.
I agree.
> >Fix:
>
> I have a proposed patch which just adds the current PID to the printf
> statement. However, I wonder whether it might be even better to
> remove the printf completely for the case where process limits (as
> opposed to maxproc) are being hit. [If a task hits other process
> limits, there are no comparable messages produced.]
Removing the printf() would also decrease the numbers of printf format
errors and style bugs instead of increasing them.
> *** kern_fork.c.ORIG Wed Nov 12 10:40:22 2003
> --- kern_fork.c Wed Dec 24 18:51:32 2003
> ***************
> *** 239,245 ****
> uid = p1->p_cred->p_ruid;
> if ((nprocs >= maxproc - 10 && uid != 0) || nprocs >= maxproc) {
> if (ppsratecheck(&lastfail, &curfail, 1))
> ! printf("maxproc limit exceeded by uid %d, please see tuning(7) and login.conf(5).\n", uid);
> tsleep(&forksleep, PUSER, "fork", hz / 2);
> return (EAGAIN);
> }
> --- 239,245 ----
> uid = p1->p_cred->p_ruid;
> if ((nprocs >= maxproc - 10 && uid != 0) || nprocs >= maxproc) {
> if (ppsratecheck(&lastfail, &curfail, 1))
> ! printf("maxproc limit exceeded by uid %d (pid %d), please see tuning(7) and login.conf(5).\n", uid, p1->p_pid);
> tsleep(&forksleep, PUSER, "fork", hz / 2);
> return (EAGAIN);
> }
> ***************
> *** 261,267 ****
> */
> nprocs--;
> if (ppsratecheck(&lastfail, &curfail, 1))
> ! printf("maxproc limit exceeded by uid %d, please see tuning(7) and login.conf(5).\n", uid);
> tsleep(&forksleep, PUSER, "fork", hz / 2);
> return (EAGAIN);
> }
> --- 261,267 ----
> */
> nprocs--;
> if (ppsratecheck(&lastfail, &curfail, 1))
> ! printf("maxproc limit exceeded by uid %d (pid %d), please see tuning(7) and login.conf(5).\n", uid, p1->p_pid);
> tsleep(&forksleep, PUSER, "fork", hz / 2);
> return (EAGAIN);
> }
New printf format errors (old ones duplicated)
- unsigned type uid_t printed using signed format %d
- typedefed type uid_t printf using a format that is only suitable for
printing ints. uid_t actually currently has type uint32_t which is
never int.
New style bugs:
- source level: too-long lines longer than before.
- user-visible level: not-too-long lines now too long. (The lines were
shorter than 80 columns assuming that PID_MAX is not much larger than
its current value of 99999.)
I use the following patches for the old printf format errors and style
bugs in -current. Almost all of the messages about tuning(7) have the
same bugs. The bugs fixed here are:
Printf format:
- errors as above.
- %i is a weird style (AAIK, %i is just an archaic spelling of %d).
Style:
- English error: comma splice.
- verboseness. "please" adds nothing and there is not enough space for it.
- punctuation. Kernel messages are conventionally not terminated by a "."
except possibly for multi-sentence messages, but the one here was.
- indentation. The continuation indent in KNF is 4, but 8 was used.
%%%
Index: kern_fork.c
===================================================================
RCS file: /home/ncvs/src/sys/kern/kern_fork.c,v
retrieving revision 1.208
diff -u -2 -r1.208 kern_fork.c
--- kern_fork.c 29 Oct 2003 15:23:09 -0000 1.208
+++ kern_fork.c 12 Nov 2003 16:05:21 -0000
@@ -731,9 +749,10 @@
return (0);
fail:
- if (ppsratecheck(&lastfail, &curfail, 1))
- printf("maxproc limit exceeded by uid %i, please see tuning(7) and login.conf(5).\n",
- uid);
sx_xunlock(&allproc_lock);
uma_zfree(proc_zone, newproc);
+ if (ppsratecheck(&lastfail, &curfail, 1))
+ printf(
+ "maxproc limit exceeded by uid %lu; see tuning(7) and login.conf(5)\n",
+ (u_long)uid);
if (p1->p_flag & P_SA) {
PROC_LOCK(p1);
%%%
Bruce
More information about the freebsd-bugs
mailing list