From patchwork Mon Jul 21 13:02:37 2014 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Alex Elder X-Patchwork-Id: 33960 Return-Path: X-Original-To: linaro@patches.linaro.org Delivered-To: linaro@patches.linaro.org Received: from mail-pa0-f70.google.com (mail-pa0-f70.google.com [209.85.220.70]) by ip-10-151-82-157.ec2.internal (Postfix) with ESMTPS id A55D020672 for ; Mon, 21 Jul 2014 13:03:03 +0000 (UTC) Received: by mail-pa0-f70.google.com with SMTP id lf10sf55295797pab.5 for ; Mon, 21 Jul 2014 06:03:02 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:delivered-to:from:to:cc:subject:date:message-id :in-reply-to:references:mime-version:sender:precedence:list-id :x-original-sender:x-original-authentication-results:mailing-list :list-post:list-help:list-archive:list-unsubscribe:content-type :content-transfer-encoding; bh=yQ+7CuZedvyT4W6J2Ro0hPhIvltfO9JfCxmLcBJOKfM=; b=jmBNtBXSwg8P52441SaZbXanruuZ8Dwhwlv9wNwuk6oUlYO67nTTW2kYbjC4Lt7wis DPqdDY2FGIZpXEd66d8s5z2EuNfzLREZA4KVCiCBw4md2L/oiN1MZbXRGGP2j9UQNM3e REQ0HVydGU8xyWeMHjTF+juF9Nj8ctgcaeeipt1hiUTmTx4OUPDGvF+4cU3qFxqr5ovb ZhdVv22NNw0m4JlDYByJybhMpLmC44ahRHyIvpQcz1qvARkcDBmHDN/kfOqftzJLeung 1qm8ky7a+8WZ2cv83gNyAUaM6sEGl8iZaavx6fmPMbg7Mdy+qHxd6GN4GMaRututjEqo Cuvg== X-Gm-Message-State: ALoCoQkRykyhmob6MQSEWVCNqYmeRfUeC4UnnoC5qv+5pjcvDbprnVfRMsFBDl5q83GZbl5lS3uO X-Received: by 10.66.151.140 with SMTP id uq12mr12568351pab.23.1405947782672; Mon, 21 Jul 2014 06:03:02 -0700 (PDT) X-BeenThere: patchwork-forward@linaro.org Received: by 10.140.106.119 with SMTP id d110ls1722691qgf.47.gmail; Mon, 21 Jul 2014 06:03:02 -0700 (PDT) X-Received: by 10.52.38.105 with SMTP id f9mr23751446vdk.17.1405947782509; Mon, 21 Jul 2014 06:03:02 -0700 (PDT) Received: from mail-vc0-f182.google.com (mail-vc0-f182.google.com [209.85.220.182]) by mx.google.com with ESMTPS id sd9si11236376vdc.26.2014.07.21.06.03.01 for (version=TLSv1 cipher=ECDHE-RSA-RC4-SHA bits=128/128); Mon, 21 Jul 2014 06:03:01 -0700 (PDT) Received-SPF: pass (google.com: domain of patch+caf_=patchwork-forward=linaro.org@linaro.org designates 209.85.220.182 as permitted sender) client-ip=209.85.220.182; Received: by mail-vc0-f182.google.com with SMTP id hy4so12316657vcb.27 for ; Mon, 21 Jul 2014 06:03:01 -0700 (PDT) X-Received: by 10.221.26.10 with SMTP id rk10mr29225200vcb.0.1405947781751; Mon, 21 Jul 2014 06:03:01 -0700 (PDT) X-Forwarded-To: patchwork-forward@linaro.org X-Forwarded-For: patch@linaro.org patchwork-forward@linaro.org Delivered-To: patch@linaro.org Received: by 10.221.37.5 with SMTP id tc5csp110328vcb; Mon, 21 Jul 2014 06:03:01 -0700 (PDT) X-Received: by 10.70.47.106 with SMTP id c10mr24974257pdn.7.1405947780833; Mon, 21 Jul 2014 06:03:00 -0700 (PDT) Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id bp9si7086570pdb.478.2014.07.21.06.02.59 for ; Mon, 21 Jul 2014 06:02:59 -0700 (PDT) Received-SPF: none (google.com: linux-kernel-owner@vger.kernel.org does not designate permitted sender hosts) client-ip=209.132.180.67; Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S932358AbaGUNCt (ORCPT + 13 others); Mon, 21 Jul 2014 09:02:49 -0400 Received: from mail-ig0-f180.google.com ([209.85.213.180]:58013 "EHLO mail-ig0-f180.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1755001AbaGUNCl (ORCPT ); Mon, 21 Jul 2014 09:02:41 -0400 Received: by mail-ig0-f180.google.com with SMTP id l13so2770116iga.1 for ; Mon, 21 Jul 2014 06:02:41 -0700 (PDT) X-Received: by 10.50.79.232 with SMTP id m8mr4938326igx.39.1405947761029; Mon, 21 Jul 2014 06:02:41 -0700 (PDT) Received: from localhost.localdomain (c-24-245-18-91.hsd1.mn.comcast.net. [24.245.18.91]) by mx.google.com with ESMTPSA id ri8sm38580163igc.0.2014.07.21.06.02.40 for (version=TLSv1.2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Mon, 21 Jul 2014 06:02:40 -0700 (PDT) From: Alex Elder To: akpm@linux-foundation.org Cc: kay@vrfy.org, pmladek@suse.cz, bp@suse.de, john.stultz@linaro.org, jack@suse.cz, linux-kernel@vger.kernel.org Subject: [PATCH v5 3/7] printk: initialize syslog_prev and console_prev Date: Mon, 21 Jul 2014 08:02:37 -0500 Message-Id: <1405947761-26004-4-git-send-email-elder@linaro.org> X-Mailer: git-send-email 1.9.1 In-Reply-To: <1405947761-26004-1-git-send-email-elder@linaro.org> References: <1405947761-26004-1-git-send-email-elder@linaro.org> MIME-Version: 1.0 Sender: linux-kernel-owner@vger.kernel.org Precedence: list List-ID: X-Mailing-List: linux-kernel@vger.kernel.org X-Removed-Original-Auth: Dkim didn't pass. X-Original-Sender: elder@linaro.org X-Original-Authentication-Results: mx.google.com; spf=pass (google.com: domain of patch+caf_=patchwork-forward=linaro.org@linaro.org designates 209.85.220.182 as permitted sender) smtp.mail=patch+caf_=patchwork-forward=linaro.org@linaro.org Mailing-list: list patchwork-forward@linaro.org; contact patchwork-forward+owners@linaro.org X-Google-Group-Id: 836684582541 List-Post: , List-Help: , List-Archive: List-Unsubscribe: , Two global variables, "syslog_prev" and "console_prev", maintain a copy of the flags value used in the log record most recently formatted for syslog or the console, respectively. Initially there is no previous formatted log record, and these variables simply have an initial value 0. And occasionally log records can get consumed at a rate such that syslog or the console can't keep up, in which case those variables (along with their corresponding position variables) must be reset. Here too, they're reset to 0. This patch changes it so the initial value used is LOG_NEWLINE. That is, if we know nothing about the prevously-formatted log record, we can assume it was complete, and ended with a newline. One exception is that occasionally we reset our syslog or console (etc.) position variables. In that case the previously-formatted record flags value is still valid, so we preserve that information. This is being done to support the next patch. Initializing these variables this way makes LOG_NEWLINE and LOG_CONT be mutually exclusive, and the next patch uses that fact to simplify some logic. Signed-off-by: Alex Elder Reviewed-by: Petr Mládek --- kernel/printk/printk.c | 44 ++++++++++++++++++++++++++++++-------------- 1 file changed, 30 insertions(+), 14 deletions(-) diff --git a/kernel/printk/printk.c b/kernel/printk/printk.c index 9f11eab..2f43116 100644 --- a/kernel/printk/printk.c +++ b/kernel/printk/printk.c @@ -236,7 +236,7 @@ DECLARE_WAIT_QUEUE_HEAD(log_wait); /* the next printk record to read by syslog(READ) or /proc/kmsg */ static u64 syslog_seq; static u32 syslog_idx; -static enum log_flags syslog_prev; +static enum log_flags syslog_prev = LOG_NEWLINE; static size_t syslog_partial; /* index and sequence number of the first record stored in the buffer */ @@ -250,7 +250,7 @@ static u32 log_next_idx; /* the next printk record to write to the console */ static u64 console_seq; static u32 console_idx; -static enum log_flags console_prev; +static enum log_flags console_prev = LOG_NEWLINE; /* the next printk record to read after the last 'clear' command */ static u64 clear_seq; @@ -1078,10 +1078,14 @@ static int syslog_print(char __user *buf, int size) raw_spin_lock_irq(&logbuf_lock); if (syslog_seq < log_first_seq) { - /* messages are gone, move to first one */ + /* + * Messages are gone, move to first one. + * Don't discard what we know about the + * previously-formatted record. + */ syslog_seq = log_first_seq; syslog_idx = log_first_idx; - syslog_prev = 0; + syslog_prev &= LOG_NEWLINE|LOG_CONT; syslog_partial = 0; } if (syslog_seq == log_next_seq) { @@ -1154,7 +1158,7 @@ static int syslog_print_all(char __user *buf, int size, bool clear) */ seq = clear_seq; idx = clear_idx; - prev = 0; + prev = LOG_NEWLINE; while (seq < log_next_seq) { struct printk_log *msg = log_from_idx(idx); @@ -1167,7 +1171,7 @@ static int syslog_print_all(char __user *buf, int size, bool clear) /* move first record forward until length fits into the buffer */ seq = clear_seq; idx = clear_idx; - prev = 0; + prev = LOG_NEWLINE; while (len > size && seq < log_next_seq) { struct printk_log *msg = log_from_idx(idx); @@ -1203,10 +1207,14 @@ static int syslog_print_all(char __user *buf, int size, bool clear) raw_spin_lock_irq(&logbuf_lock); if (seq < log_first_seq) { - /* messages are gone, move to next one */ + /* + * Messages are gone, move to first one. + * Don't discard what we know about the + * previously-formatted record. + */ seq = log_first_seq; idx = log_first_idx; - prev = 0; + prev &= LOG_NEWLINE|LOG_CONT; } } } @@ -1308,10 +1316,14 @@ int do_syslog(int type, char __user *buf, int len, bool from_file) case SYSLOG_ACTION_SIZE_UNREAD: raw_spin_lock_irq(&logbuf_lock); if (syslog_seq < log_first_seq) { - /* messages are gone, move to first one */ + /* + * Messages are gone, move to first one. + * Don't discard what we know about the + * previously-formatted record. + */ syslog_seq = log_first_seq; syslog_idx = log_first_idx; - syslog_prev = 0; + syslog_prev &= LOG_NEWLINE|LOG_CONT; syslog_partial = 0; } if (from_file) { @@ -2156,10 +2168,14 @@ again: "%s** %u printk messages dropped **\n", (console_prev & LOG_CONT) ? "\n" : "", (unsigned)(log_first_seq - console_seq)); - /* messages are gone, move to first one */ + /* + * Messages are gone, move to first one. + * Don't discard what we know about the + * previously-formatted record. + */ console_seq = log_first_seq; console_idx = log_first_idx; - console_prev = 0; + console_prev &= LOG_NEWLINE|LOG_CONT; } else { len = 0; } @@ -2873,7 +2889,7 @@ bool kmsg_dump_get_buffer(struct kmsg_dumper *dumper, bool syslog, /* calculate length of entire buffer */ seq = dumper->cur_seq; idx = dumper->cur_idx; - prev = 0; + prev = LOG_NEWLINE; while (seq < dumper->next_seq) { struct printk_log *msg = log_from_idx(idx); @@ -2886,7 +2902,7 @@ bool kmsg_dump_get_buffer(struct kmsg_dumper *dumper, bool syslog, /* move first record forward until length fits into the buffer */ seq = dumper->cur_seq; idx = dumper->cur_idx; - prev = 0; + prev = LOG_NEWLINE; while (l > size && seq < dumper->next_seq) { struct printk_log *msg = log_from_idx(idx);