From: Janani Venkataraman <jananive@in.ibm.com>
To: linux-kernel@vger.kernel.org
Cc: amwang@redhat.com, rdunlap@xenotime.net, andi@firstfloor.org,
aravinda@linux.vnet.ibm.com, hch@lst.de, mhiramat@redhat.com,
jeremy.fitzhardinge@citrix.com, xemul@parallels.com,
suzuki@linux.vnet.ibm.com, kosaki.motohiro@jp.fujitsu.com,
adobriyan@gmail.com, tarundsk@linux.vnet.ibm.com,
vapier@gentoo.org, roland@hack.frob.com, tj@kernel.org,
ananth@linux.vnet.ibm.com, gorcunov@openvz.org,
avagin@openvz.org, oleg@redhat.com, eparis@redhat.com,
d.hatayama@jp.fujitsu.com, james.hogan@imgtec.com,
akpm@linux-foundation.org, torvalds@linux-foundation.org
Subject: [RFC] [PATCH 00/19] Non disruptive application core dump infrastructure using task_work_add()
Date: Fri, 04 Oct 2013 16:00:12 +0530 [thread overview]
Message-ID: <20131004102532.1612.24185.stgit@f19-x64> (raw)
Hi all,
The following series implements an infrastructure for capturing the core of an
application without disrupting its process.
So ideally what we are trying to do is to export the infrastructure using
/proc/pid/core. Reading the file would give an ELF Format core-dump at that
instant non-disruptively, without sending signals.
This would involve basically three operations:
1) Holding the threads of a process without sending a signal (SIGSTOP). At this
point we can collect the register set snapshot and collect other information
required to create the ELF header. The above operation could be initiated with
the open() call.
2) Once the ELF header is created, read() can return the CORE DUMP data
including, the process memory page-by-page, based on the fpos (file position).
3) The threads could be released upon a close().
We discussed various approaches for the implemenation in the post given below.
-https://lkml.org/lkml/2013/9/3/122
This series is based on the Task work add approach. We didn't adopt the CRIU
approch because of the following reasons:
* It is not upstream yet.
* There are concerns about the security of the dump.
* It involves a lot of changes and this approach provides a UNIX style
interface.
Task work add
task_work_add() is an interface and an API. The task work add will run any
queued work before returning to user space from the kernel. So that work is
guaranteed to be done before user space can run again. So basically it queues a
work for a task which is guaranteed to be executed when the task returns from
kernel space to user space.
* Exploit this function to hold the threads when they are returning to the
user space.
* Wait until all the threads of the process to be dumped, reach task_work_add.
* Once all the threads have reached, the dump is taken and they are released.
TODO:
* A mechanism to know when all the threads have reached the task added.
* A way to handle a case when one of the threads of the task to be dumped
is blocked in the kernel.
* We could also add the infrastructure under a config option,
say:CONFIG_ELF_GENCORE
* The current implementation doesn't wait for the threads to reach
wait_for_completion(). Hence there is no guarantee of collecting the
'register set' reliably. We will address this issue in the next version.
This is a prototype implementation to get reviews and comments.
Patches 1 to 8 deals with re-arranging the ELF code to be reusable by the
infrastructure.
Patches 9 to 19 implements the infrastructure.
Please let me know your reviews and comments.
Janani Venkataraman (19):
Create elfcore-common.c for ELF class independent core generation helpers
Make vma_dump_size() generic
Make fill_psinfo generic
Rename compat versions of the reusable core generation routines
Export the reusable ELF core generation routines
Define API for reading arch specif Program Headers for Core
ia64 impelementation for elf_core_copy_extra_phdrs()
elf_core_copy_extra_phdrs() for UML
Create /proc/pid/core entry
Track the core generation requests
Check if the process is an ELF executable
Hold the threads using task_work_add
Create ELF Header
Create ELF Core notes Data
Calculate the size of the core file
Generate the data sections for ELF Core
Identify the ELF class of the process
Adding support for compat ELF class data structures
Compat ELF class core generation support
arch/ia64/kernel/elfcore.c | 34 +++
arch/x86/um/elfcore.c | 32 +++
fs/Makefile | 1
fs/binfmt_elf.c | 190 ++--------------
fs/compat_binfmt_elf.c | 7 +
fs/elfcore-common.c | 169 ++++++++++++++
fs/proc/Makefile | 2
fs/proc/base.c | 2
fs/proc/gencore-compat-elf.c | 62 +++++
fs/proc/gencore-elf.c | 458 ++++++++++++++++++++++++++++++++++++++
fs/proc/gencore.c | 262 ++++++++++++++++++++++
fs/proc/gencore.h | 74 ++++++
fs/proc/internal.h | 1
include/linux/elfcore-internal.h | 72 ++++++
include/linux/elfcore.h | 3
kernel/elfcore.c | 6
16 files changed, 1209 insertions(+), 166 deletions(-)
create mode 100644 fs/elfcore-common.c
create mode 100644 fs/proc/gencore-compat-elf.c
create mode 100644 fs/proc/gencore-elf.c
create mode 100644 fs/proc/gencore.c
create mode 100644 fs/proc/gencore.h
create mode 100644 include/linux/elfcore-internal.h
--
Janani
next reply other threads:[~2013-10-04 10:30 UTC|newest]
Thread overview: 31+ messages / expand[flat|nested] mbox.gz Atom feed top
2013-10-04 10:30 Janani Venkataraman [this message]
2013-10-04 10:30 ` [PATCH 01/19] Create elfcore-common.c for ELF class independent core generation helpers Janani Venkataraman
2013-10-04 10:30 ` [PATCH 02/19] Make vma_dump_size() generic Janani Venkataraman
2013-10-08 0:23 ` Ryan Mallon
2013-10-08 3:52 ` Janani Venkataraman1
2013-10-04 10:31 ` [PATCH 03/19] Make fill_psinfo generic Janani Venkataraman
2013-10-04 10:31 ` [PATCH 04/19] Rename compat versions of the reusable core generation routines Janani Venkataraman
2013-10-04 10:31 ` [PATCH 05/19] Export the reusable ELF " Janani Venkataraman
2013-10-04 10:31 ` [PATCH 06/19] Define API for reading arch specif Program Headers for Core Janani Venkataraman
2013-10-04 10:31 ` [PATCH 07/19] ia64 impelementation for elf_core_copy_extra_phdrs() Janani Venkataraman
2013-10-04 10:31 ` [PATCH 08/19] elf_core_copy_extra_phdrs() for UML Janani Venkataraman
2013-10-04 10:31 ` [PATCH 09/19] Create /proc/pid/core entry Janani Venkataraman
2013-10-04 10:31 ` [PATCH 10/19] Track the core generation requests Janani Venkataraman
2013-10-04 10:31 ` [PATCH 11/19] Check if the process is an ELF executable Janani Venkataraman
2013-10-04 10:32 ` [PATCH 12/19] Hold the threads using task_work_add Janani Venkataraman
2013-10-04 10:32 ` [PATCH 13/19] Create ELF Header Janani Venkataraman
2013-10-04 10:32 ` [PATCH 14/19] Create ELF Core notes Data Janani Venkataraman
2013-10-04 10:32 ` [PATCH 15/19] Calculate the size of the core file Janani Venkataraman
2013-10-04 10:32 ` [PATCH 16/19] Generate the data sections for ELF Core Janani Venkataraman
2013-10-04 10:32 ` [PATCH 17/19] Identify the ELF class of the process Janani Venkataraman
2013-10-04 10:33 ` [PATCH 18/19] Adding support for compat ELF class data structures Janani Venkataraman
2013-10-04 10:33 ` [PATCH 19/19] Compat ELF class core generation support Janani Venkataraman
2013-10-04 10:38 ` [RFC] [PATCH 00/19] Non disruptive application core dump infrastructure using task_work_add() Pavel Emelyanov
2013-10-07 18:57 ` Tejun Heo
2013-10-08 10:14 ` Janani Venkataraman1
2013-10-08 10:12 ` Janani Venkataraman1
2013-10-09 8:57 ` Pavel Emelyanov
2013-10-04 13:44 ` Andi Kleen
2013-10-07 6:07 ` Suzuki K. Poulose
2013-10-07 13:58 ` Oleg Nesterov
2013-10-07 18:10 ` Andi Kleen
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20131004102532.1612.24185.stgit@f19-x64 \
--to=jananive@in.ibm.com \
--cc=adobriyan@gmail.com \
--cc=akpm@linux-foundation.org \
--cc=amwang@redhat.com \
--cc=ananth@linux.vnet.ibm.com \
--cc=andi@firstfloor.org \
--cc=aravinda@linux.vnet.ibm.com \
--cc=avagin@openvz.org \
--cc=d.hatayama@jp.fujitsu.com \
--cc=eparis@redhat.com \
--cc=gorcunov@openvz.org \
--cc=hch@lst.de \
--cc=james.hogan@imgtec.com \
--cc=jeremy.fitzhardinge@citrix.com \
--cc=kosaki.motohiro@jp.fujitsu.com \
--cc=linux-kernel@vger.kernel.org \
--cc=mhiramat@redhat.com \
--cc=oleg@redhat.com \
--cc=rdunlap@xenotime.net \
--cc=roland@hack.frob.com \
--cc=suzuki@linux.vnet.ibm.com \
--cc=tarundsk@linux.vnet.ibm.com \
--cc=tj@kernel.org \
--cc=torvalds@linux-foundation.org \
--cc=vapier@gentoo.org \
--cc=xemul@parallels.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox