From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1755806AbbESJW3 (ORCPT ); Tue, 19 May 2015 05:22:29 -0400 Received: from szxga02-in.huawei.com ([119.145.14.65]:26698 "EHLO szxga02-in.huawei.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1755202AbbESJNf (ORCPT ); Tue, 19 May 2015 05:13:35 -0400 From: Wang Long To: , , , CC: , , , , , , , , , Subject: [PATCH v2 08/17] tracing: Have seq_buf use full buffer Date: Tue, 19 May 2015 09:08:53 +0000 Message-ID: <1432026542-123571-9-git-send-email-long.wanglong@huawei.com> X-Mailer: git-send-email 1.8.3.4 In-Reply-To: <1432026542-123571-1-git-send-email-long.wanglong@huawei.com> References: <1432026542-123571-1-git-send-email-long.wanglong@huawei.com> MIME-Version: 1.0 Content-Type: text/plain X-Originating-IP: [10.107.197.200] X-CFilter-Loop: Reflected Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: "Steven Rostedt (Red Hat)" commit 8cd709ae7658a7fd7f6630699e3229188c2591e4 upstream. Currently seq_buf is full when all but one byte of the buffer is filled. Change it so that the seq_buf is full when all of the buffer is filled. Some of the functions would fill the buffer completely and report everything was fine. This was inconsistent with the max of size - 1. Changing this to be max of size makes all functions consistent. Link: http://lkml.kernel.org/r/20141104160222.502133196@goodmis.org Link: http://lkml.kernel.org/r/20141114011412.811957882@goodmis.org Tested-by: Jiri Kosina Acked-by: Jiri Kosina Reviewed-by: Petr Mladek [wanglong: backport to 3.10 stable] Signed-off-by: Wang Long Signed-off-by: Steven Rostedt --- include/linux/seq_buf.h | 6 +++--- kernel/trace/seq_buf.c | 9 ++++++--- 2 files changed, 9 insertions(+), 6 deletions(-) diff --git a/include/linux/seq_buf.h b/include/linux/seq_buf.h index 93718e5..0800a24 100644 --- a/include/linux/seq_buf.h +++ b/include/linux/seq_buf.h @@ -43,13 +43,13 @@ seq_buf_init(struct seq_buf *s, unsigned char *buf, unsigned int size) static inline bool seq_buf_has_overflowed(struct seq_buf *s) { - return s->len == s->size; + return s->len > s->size; } static inline void seq_buf_set_overflow(struct seq_buf *s) { - s->len = s->size; + s->len = s->size + 1; } /* @@ -61,7 +61,7 @@ seq_buf_buffer_left(struct seq_buf *s) if (seq_buf_has_overflowed(s)) return 0; - return (s->size - 1) - s->len; + return s->size - s->len; } /* How much buffer was written? */ diff --git a/kernel/trace/seq_buf.c b/kernel/trace/seq_buf.c index 6fc9d02..c53f1d5 100644 --- a/kernel/trace/seq_buf.c +++ b/kernel/trace/seq_buf.c @@ -26,7 +26,7 @@ */ static bool seq_buf_can_fit(struct seq_buf *s, size_t len) { - return s->len + len < s->size; + return s->len + len <= s->size; } /** @@ -110,8 +110,11 @@ int seq_buf_bitmask(struct seq_buf *s, const unsigned long *maskp, WARN_ON(s->size == 0); /* - * The last byte of the buffer is used to determine if we - * overflowed or not. + * Note, because bitmap_scnprintf() only returns the number of bytes + * written and not the number that would be written, we use the last + * byte of the buffer to let us know if we overflowed. There's a small + * chance that the bitmap could have fit exactly inside the buffer, but + * it's not that critical if that does happen. */ if (len > 1) { ret = bitmap_scnprintf(s->buffer + s->len, len, maskp, nmaskbits); -- 1.8.3.4