Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1756067AbYJPGNi (ORCPT ); Thu, 16 Oct 2008 02:13:38 -0400 Received: (majordomo@vger.kernel.org) by vger.kernel.org id S1754166AbYJPGMN (ORCPT ); Thu, 16 Oct 2008 02:12:13 -0400 Received: from qmta08.emeryville.ca.mail.comcast.net ([76.96.30.80]:48489 "EHLO QMTA08.emeryville.ca.mail.comcast.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1754894AbYJPGML (ORCPT ); Thu, 16 Oct 2008 02:12:11 -0400 X-Authority-Analysis: v=1.0 c=1 a=AD72gzhFuwIA:10 a=XAPvVuKKJIUA:10 a=OOGyXFxl7UeznH3UHA4A:9 a=OMgVS07xqHB1bs8zYNMA:7 a=qlRXiz_CcenCkZvbZsVc38tqouUA:4 a=i92e0Ub4el8A:10 a=d_-3mwAUsuEA:10 a=zoKOyUDlhksA:10 Subject: [RFC PATCH 4/21] relay - Add reserved param to switch-subbuf, in preparation for non-pad write/reserve. From: Tom Zanussi To: Linux Kernel Mailing List Cc: Martin Bligh , Peter Zijlstra , prasad@linux.vnet.ibm.com, Linus Torvalds , Thomas Gleixner , Mathieu Desnoyers , Steven Rostedt , od@suse.com, "Frank Ch. Eigler" , Andrew Morton , hch@lst.de, David Wilder , Jens Axboe , Pekka Enberg , Eduard - Gabriel Munteanu Content-Type: text/plain Date: Thu, 16 Oct 2008 01:05:43 -0500 Message-Id: <1224137143.16328.223.camel@charm-linux> Mime-Version: 1.0 X-Mailer: Evolution 2.12.0 Content-Transfer-Encoding: 7bit Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 4891 Lines: 150 Because a write/reserve can now cross sub-buffer boundaries, we use the length returned as a remainder for the new sub-buffer, and use the reserved param to return a pointer to the reserved space, or NULL if it couldn't be reserved. This patch also changes write/reserve to preserve their current behavior despite that change. This all goes away in a future patch, but is here now so things don't break. --- include/linux/relay.h | 24 ++++++++++++++++-------- kernel/relay.c | 12 +++++++++--- 2 files changed, 25 insertions(+), 11 deletions(-) diff --git a/include/linux/relay.h b/include/linux/relay.h index 18fd269..978fdea 100644 --- a/include/linux/relay.h +++ b/include/linux/relay.h @@ -173,13 +173,16 @@ struct rchan_callbacks * switch_subbuf - sub-buffer switch callback * @buf: the channel buffer * @length: size of current event + * @reserved: a pointer to the space reserved * * Returns either the length passed in or 0 if full. * * Performs sub-buffer-switch tasks such as updating filesize, * waking up readers, etc. */ - size_t (*switch_subbuf)(struct rchan_buf *buf, size_t length); + size_t (*switch_subbuf)(struct rchan_buf *buf, + size_t length, + void **reserved); }; /* @@ -205,7 +208,8 @@ extern void relay_reset(struct rchan *chan); extern int relay_buf_full(struct rchan_buf *buf); extern size_t switch_subbuf_default_callback(struct rchan_buf *buf, - size_t length); + size_t length, + void **reserved); /** @@ -269,12 +273,14 @@ static inline void relay_write(struct rchan *chan, { unsigned long flags; struct rchan_buf *buf; + void *reserved; local_irq_save(flags); buf = chan->buf[smp_processor_id()]; + reserved = buf->data + buf->offset; if (unlikely(buf->offset + length > chan->subbuf_size)) - length = chan->cb->switch_subbuf(buf, length); - memcpy(buf->data + buf->offset, data, length); + length = chan->cb->switch_subbuf(buf, length, &reserved); + memcpy(reserved, data, length); buf->offset += length; local_irq_restore(flags); } @@ -296,11 +302,13 @@ static inline void __relay_write(struct rchan *chan, size_t length) { struct rchan_buf *buf; + void *reserved; buf = chan->buf[get_cpu()]; + reserved = buf->data + buf->offset; if (unlikely(buf->offset + length > buf->chan->subbuf_size)) - length = chan->cb->switch_subbuf(buf, length); - memcpy(buf->data + buf->offset, data, length); + length = chan->cb->switch_subbuf(buf, length, &reserved); + memcpy(reserved, data, length); buf->offset += length; put_cpu(); } @@ -321,12 +329,12 @@ static inline void *relay_reserve(struct rchan *chan, size_t length) void *reserved; struct rchan_buf *buf = chan->buf[smp_processor_id()]; + reserved = buf->data + buf->offset; if (unlikely(buf->offset + length > buf->chan->subbuf_size)) { - length = chan->cb->switch_subbuf(buf, length); + length = chan->cb->switch_subbuf(buf, length, &reserved); if (!length) return NULL; } - reserved = buf->data + buf->offset; buf->offset += length; return reserved; diff --git a/kernel/relay.c b/kernel/relay.c index a2e06b0..6c7698a 100644 --- a/kernel/relay.c +++ b/kernel/relay.c @@ -736,13 +736,16 @@ int relay_late_setup_files(struct rchan *chan, * switch_subbuf_default_callback - switch to a new sub-buffer * @buf: channel buffer * @length: size of current event + * @reserved: a pointer to the space reserved * * Returns either the length passed in or 0 if full. * * Performs sub-buffer-switch tasks such as invoking callbacks, * updating padding counts, waking up readers, etc. */ -size_t switch_subbuf_default_callback(struct rchan_buf *buf, size_t length) +size_t switch_subbuf_default_callback(struct rchan_buf *buf, + size_t length, + void **reserved) { void *old, *new; size_t old_subbuf, new_subbuf; @@ -774,6 +777,9 @@ size_t switch_subbuf_default_callback(struct rchan_buf *buf, size_t length) if (unlikely(relay_event_toobig(buf, length + buf->offset))) goto toobig; + if (reserved) + *reserved = buf->data; + return length; toobig: @@ -860,14 +866,14 @@ void relay_flush(struct rchan *chan) return; if (chan->flags & RCHAN_GLOBAL_BUFFER && chan->buf[0]) { - chan->cb->switch_subbuf(chan->buf[0], 0); + chan->cb->switch_subbuf(chan->buf[0], 0, NULL); return; } mutex_lock(&relay_channels_mutex); for_each_possible_cpu(i) if (chan->buf[i]) - chan->cb->switch_subbuf(chan->buf[i], 0); + chan->cb->switch_subbuf(chan->buf[i], 0, NULL); mutex_unlock(&relay_channels_mutex); } EXPORT_SYMBOL_GPL(relay_flush); -- 1.5.3.5 -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/