From patchwork Sat Mar 16 10:50:50 2013 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Jesper Derehag X-Patchwork-Id: 228207 X-Patchwork-Delegate: davem@davemloft.net Return-Path: X-Original-To: patchwork-incoming@ozlabs.org Delivered-To: patchwork-incoming@ozlabs.org Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id B1AA02C00AC for ; Sat, 16 Mar 2013 21:51:32 +1100 (EST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1755589Ab3CPKvT (ORCPT ); Sat, 16 Mar 2013 06:51:19 -0400 Received: from mail-la0-f48.google.com ([209.85.215.48]:48549 "EHLO mail-la0-f48.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1755021Ab3CPKvS (ORCPT ); Sat, 16 Mar 2013 06:51:18 -0400 Received: by mail-la0-f48.google.com with SMTP id fq13so4501613lab.7 for ; Sat, 16 Mar 2013 03:51:16 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=x-received:sender:from:to:cc:subject:date:message-id:x-mailer :mime-version:content-type:content-transfer-encoding; bh=QRfoa6FB6O3wSDcmgct+YeBv4G4zNWRQQ0u4cGmbXuc=; b=QeVWWymu2RcIXdlw7XU1HLn9TqUT0nhYzGlwrFI3cCKrSTrrBedI0YOS4HMzrjGVEv W5kw8+IVGECy52sWcf4gFO25osoF28/tgWytcBD2Gv6NEEON9jdzSFZzqflMmQv7v3+N 7g7KhI5QgV6RpRhoHPG0tXXX5hPErwmrMpLhj/eYiS1H9rDWBBtprWyRkTqj6nbSkhr3 gksPDvsX76mZ/sE0wKisjYyBfeepF7yTlvHwT+Psir1pzpC5G+ecO4Tlfxx6SnA5ZPPs 6uP2wLhPzTh/qJVUa93gzuKXB8gm8ni7LtMA1KFhoYREQ060gy6U0LVYA4ZF6ssvx1yt PD0A== X-Received: by 10.112.9.134 with SMTP id z6mr3820541lba.72.1363431076485; Sat, 16 Mar 2013 03:51:16 -0700 (PDT) Received: from localhost.localdomain (c83-248-20-170.bredband.comhem.se. [83.248.20.170]) by mx.google.com with ESMTPS id go12sm4808679lab.3.2013.03.16.03.51.14 (version=TLSv1.2 cipher=ECDHE-RSA-RC4-SHA bits=128/128); Sat, 16 Mar 2013 03:51:15 -0700 (PDT) From: Jesper Derehag To: Evgeniy Polyakov Cc: netdev@vger.kernel.org, Jesper Derehag Subject: =?UTF-8?q?=5BPATCH=201/1=5D=20connector=3A=20Added=20coredumping=20event=20to=20the=20process=20connector?= Date: Sat, 16 Mar 2013 11:50:50 +0100 Message-Id: <1363431050-24135-1-git-send-email-jderehag@hotmail.com> X-Mailer: git-send-email 1.7.10.4 MIME-Version: 1.0 Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org Process connector can now also detect coredumping events. Could be used for instance by process-managers that want to get notified immediatly at process crash instead of waiting for exit. Signed-off-by: Jesper Derehag --- drivers/connector/cn_proc.c | 27 +++++++++++++++++++++++++++ include/linux/cn_proc.h | 4 ++++ include/uapi/linux/cn_proc.h | 6 ++++-- kernel/signal.c | 2 ++ 4 filer ändrade, 37 tillägg(+), 2 borttagningar(-) diff --git a/drivers/connector/cn_proc.c b/drivers/connector/cn_proc.c index 1110478..325f11c 100644 --- a/drivers/connector/cn_proc.c +++ b/drivers/connector/cn_proc.c @@ -232,6 +232,33 @@ void proc_comm_connector(struct task_struct *task) cn_netlink_send(msg, CN_IDX_PROC, GFP_KERNEL); } +void proc_coredump_connector(struct task_struct *task) +{ + struct cn_msg *msg; + struct proc_event *ev; + __u8 buffer[CN_PROC_MSG_SIZE]; + struct timespec ts; + + if (atomic_read(&proc_event_num_listeners) < 1) + return; + + msg = (struct cn_msg *)buffer; + ev = (struct proc_event *)msg->data; + get_seq(&msg->seq, &ev->cpu); + ktime_get_ts(&ts); /* get high res monotonic timestamp */ + put_unaligned(timespec_to_ns(&ts), (__u64 *)&ev->timestamp_ns); + ev->what = PROC_EVENT_COREDUMP; + ev->event_data.exit.process_pid = task->pid; + ev->event_data.exit.process_tgid = task->tgid; + ev->event_data.exit.exit_code = task->exit_code; + ev->event_data.exit.exit_signal = task->exit_signal; + + memcpy(&msg->id, &cn_proc_event_id, sizeof(msg->id)); + msg->ack = 0; /* not used */ + msg->len = sizeof(*ev); + cn_netlink_send(msg, CN_IDX_PROC, GFP_KERNEL); +} + void proc_exit_connector(struct task_struct *task) { struct cn_msg *msg; diff --git a/include/linux/cn_proc.h b/include/linux/cn_proc.h index 2c1bc1e..1d5b02a 100644 --- a/include/linux/cn_proc.h +++ b/include/linux/cn_proc.h @@ -26,6 +26,7 @@ void proc_id_connector(struct task_struct *task, int which_id); void proc_sid_connector(struct task_struct *task); void proc_ptrace_connector(struct task_struct *task, int which_id); void proc_comm_connector(struct task_struct *task); +void proc_coredump_connector(struct task_struct *task); void proc_exit_connector(struct task_struct *task); #else static inline void proc_fork_connector(struct task_struct *task) @@ -48,6 +49,9 @@ static inline void proc_ptrace_connector(struct task_struct *task, int ptrace_id) {} +static inline void proc_coredump_connector(struct task_struct *task) +{} + static inline void proc_exit_connector(struct task_struct *task) {} #endif /* CONFIG_PROC_EVENTS */ diff --git a/include/uapi/linux/cn_proc.h b/include/uapi/linux/cn_proc.h index 0d7b499..a46caf1 100644 --- a/include/uapi/linux/cn_proc.h +++ b/include/uapi/linux/cn_proc.h @@ -55,8 +55,10 @@ struct proc_event { PROC_EVENT_SID = 0x00000080, PROC_EVENT_PTRACE = 0x00000100, PROC_EVENT_COMM = 0x00000200, - /* "next" should be 0x00000400 */ - /* "last" is the last process event: exit */ + /* "next" should be 0x00000400 */ + /* "last" is the last process event: exit, + * while "next to last" is coredumping event */ + PROC_EVENT_COREDUMP = 0x40000000, PROC_EVENT_EXIT = 0x80000000 } what; __u32 cpu; diff --git a/kernel/signal.c b/kernel/signal.c index d63c79e..e591731 100644 --- a/kernel/signal.c +++ b/kernel/signal.c @@ -32,6 +32,7 @@ #include #include #include +#include #define CREATE_TRACE_POINTS #include @@ -2347,6 +2348,7 @@ relock: if (sig_kernel_coredump(signr)) { if (print_fatal_signals) print_fatal_signal(info->si_signo); + proc_coredump_connector(current); /* * If it was able to dump core, this kills all * other threads in the group and synchronizes with