[Devel] Re: [PATCH 1/2] signal checkpoint: define /proc/pid/sig/
Cedric Le Goater
clg at fr.ibm.com
Tue Jun 12 09:30:46 PDT 2007
[ ... ]
>>> +static int print_sigpending_alloc(char **bufp, struct sigpending *pending)
>>> +{
>>> + int alloced=0;
>>> + char *buf, *p;
>>> + struct sigqueue *q;
>>> + struct siginfo *info;
>>> +
>>> + alloced = PAGE_SIZE;
>>> + p = buf = kmalloc(alloced, GFP_KERNEL);
>>> + if (!buf)
>>> + return -ENOMEM;
>>> +
>>> + p += print_sigset(buf, &pending->signal);
>>> + p += sprintf(p, "\n");
>>> +
>>> + list_for_each_entry(q, &pending->list, list) {
>>> + info = &q->info;
>>> + if (p-buf+215 > alloced) {
>>> + int len=p-buf;
>>> + char *buf2;
>>> + alloced += PAGE_SIZE;
>>> + buf2 = kmalloc(alloced, GFP_KERNEL);
>>> + if (!buf2) {
>>> + kfree(buf);
>>> + return -ENOMEM;
>>> + }
>>> + memcpy(buf2, buf, alloced - PAGE_SIZE);
>>> + kfree(buf);
>>> + buf = buf2;
>>> + p = buf+len;
>>> + }
>>> +
>>> + p += sprintf(p, "sig %d: user %d flags %d",
>>> + info->si_signo, (int)q->user->uid, q->flags);
>>> + p += sprintf(p, " errno %d code %d\n",
>>> + info->si_errno, info->si_code);
>>> +
>>> + switch(info->si_signo) {
>>> + case SIGKILL:
>>> + p += sprintf(p, " spid %d suid %d\n",
>>> + info->_sifields._kill._pid,
>>> + info->_sifields._kill._uid);
>>> + break;
>>> + /* XXX skipping posix1b timers and signals for now */
>>> + case SIGCHLD:
>>> + p += sprintf(p, " pid %d uid %d status %d utime %lu stime %lu\n",
>>> + info->_sifields._sigchld._pid,
>>> + info->_sifields._sigchld._uid,
>>> + info->_sifields._sigchld._status,
>>> + info->_sifields._sigchld._utime,
>>> + info->_sifields._sigchld._stime);
>>> + break;
>>> + case SIGILL:
>>> + case SIGFPE:
>>> + case SIGSEGV:
>>> + case SIGBUS:
>>> +#ifdef __ARCH_SI_TRAPNO
>>> + p += sprintf(p, " addr %lu trapno %d\n",
>>> + (unsigned long)info->_sifields._sigfault._addr,
>>> + info->_sifields._sigfault._trapno);
>>> +#else
>>> + p += sprintf(p, " addr %lu\n",
>>> + (unsigned long)info->_sifields._sigfault._addr);
>>> +#endif
>>> + break;
>>> + case SIGPOLL:
>>> + p += sprintf(p, " band %ld fd %d\n",
>>> + (long)info->_sifields._sigpoll._band,
>>> + info->_sifields._sigpoll._fd);
>>> + break;
>>> + default:
>>> + p += sprintf(p, " Unsupported siginfo for signal %d\n",
>>> + info->si_signo);
>>> + break;
>>> + }
>>> + }
>>> + *bufp = buf;
>>> + return p-buf;
>>> +}
>> I think we are reaching the limit of /proc when we expose the pending siginfos.
>
> Why?
well, we are really exposing the internals of signal delivery, which are
not that useful for /proc. IMO, it would be better to use an "opaque" to
get/set the data we need.
C.
_______________________________________________
Containers mailing list
Containers at lists.linux-foundation.org
https://lists.linux-foundation.org/mailman/listinfo/containers
More information about the Devel
mailing list