All of lore.kernel.org
 help / color / mirror / Atom feed
From: Jiri Olsa <jolsa@redhat.com>
To: Alexey Budankov <alexey.budankov@linux.intel.com>
Cc: Peter Zijlstra <peterz@infradead.org>,
	Ingo Molnar <mingo@redhat.com>,
	Arnaldo Carvalho de Melo <acme@kernel.org>,
	Alexander Shishkin <alexander.shishkin@linux.intel.com>,
	Namhyung Kim <namhyung@kernel.org>,
	Andi Kleen <ak@linux.intel.com>,
	linux-kernel <linux-kernel@vger.kernel.org>
Subject: Re: [PATCH v12 2/3]: perf record: enable asynchronous trace writing
Date: Thu, 11 Oct 2018 15:46:12 +0200	[thread overview]
Message-ID: <20181011134612.GE29634@krava> (raw)
In-Reply-To: <50fed9ff-adc4-d9d6-36bc-b6b27bf58c17@linux.intel.com>

On Tue, Oct 09, 2018 at 11:58:53AM +0300, Alexey Budankov wrote:

SNIP

> +#ifdef HAVE_AIO_SUPPORT
> +int perf_mmap__aio_push(struct perf_mmap *md, void *to,
> +			int push(void *to, struct aiocb *cblock, void *buf, size_t size, off_t off),
> +			off_t *off)
> +{
> +	u64 head = perf_mmap__read_head(md);
> +	unsigned char *data = md->base + page_size;
> +	unsigned long size, size0 = 0;
> +	void *buf;
> +	int rc = 0;
> +
> +	rc = perf_mmap__read_init(md);
> +	if (rc < 0)
> +		return (rc == -EAGAIN) ? 0 : -1;
> +
> +	/*
> +	 * md->base data is copied into md->data buffer to
> +	 * release space in the kernel buffer as fast as possible,
> +	 * thru perf_mmap__consume() below.
> +	 *
> +	 * That lets the kernel to proceed with storing more
> +	 * profiling data into the kernel buffer earlier than other
> +	 * per-cpu kernel buffers are handled.
> +	 *
> +	 * Coping can be done in two steps in case the chunk of
> +	 * profiling data crosses the upper bound of the kernel buffer.
> +	 * In this case we first move part of data from md->start
> +	 * till the upper bound and then the reminder from the
> +	 * beginning of the kernel buffer till the end of
> +	 * the data chunk.
> +	 */
> +
> +	size = md->end - md->start;
> +
> +	if ((md->start & md->mask) + size != (md->end & md->mask)) {
> +		buf = &data[md->start & md->mask];
> +		size = md->mask + 1 - (md->start & md->mask);
> +		md->start += size;
> +		memcpy(md->aio.data, buf, size);
> +		size0 = size;
> +	}
> +
> +	buf = &data[md->start & md->mask];
> +	size = md->end - md->start;
> +	md->start += size;
> +	memcpy(md->aio.data + size0, buf, size);
> +
> +	/*
> +	 * Increment md->refcount to guard md->data buffer
> +	 * from premature deallocation because md object can be
> +	 * released earlier than aio write request started
> +	 * on mmap->data is complete.
> +	 *
> +	 * perf_mmap__put() is done at record__aio_complete()
> +	 * after started request completion.
> +	 */
> +	perf_mmap__get(md);
> +
> +	md->prev = head;
> +	perf_mmap__consume(md);
> +
> +	rc = push(to, &(md->aio.cblock), md->aio.data, size0 + size, *off);
> +	if (!rc) {
> +		*off += size0 + size;
> +	} else {
> +		/*
> +		 * Decrement md->refcount back if aio write
> +		 * operation failed to start.
> +		 */
> +		perf_mmap__put(md);
> +	}
> +
> +	return rc;
> +}
> +#else
> +int perf_mmap__aio_push(struct perf_mmap *md __maybe_unused, void *to __maybe_unused,
> +	int push(void *to, struct aiocb *cblock, void *buf, size_t size, off_t off) __maybe_unused,
> +	off_t *off __maybe_unused)
> +{
> +	return 0;
> +}

I think you need to put this one in the header as static inline
otherwise it'd still appear in the NO_AIO=1 build, like:
  [jolsa@krava perf]$ make NO_AIO=1
  ...
  [jolsa@krava perf]$ nm -D perf | grep perf_mmap__aio_push
  00000000004c2be0 T perf_mmap__aio_push

change below makes it disappear completely

jirka


---
diff --git a/tools/perf/util/mmap.c b/tools/perf/util/mmap.c
index b176d88b3fcb..8c7516696891 100644
--- a/tools/perf/util/mmap.c
+++ b/tools/perf/util/mmap.c
@@ -445,13 +445,6 @@ int perf_mmap__aio_push(struct perf_mmap *md, void *to,
 
 	return rc;
 }
-#else
-int perf_mmap__aio_push(struct perf_mmap *md __maybe_unused, void *to __maybe_unused,
-	int push(void *to, struct aiocb *cblock, void *buf, size_t size, off_t off) __maybe_unused,
-	off_t *off __maybe_unused)
-{
-	return 0;
-}
 #endif
 
 /*
diff --git a/tools/perf/util/mmap.h b/tools/perf/util/mmap.h
index 04ff4d2ffdbe..3ccf8c925002 100644
--- a/tools/perf/util/mmap.h
+++ b/tools/perf/util/mmap.h
@@ -105,10 +105,21 @@ union perf_event *perf_mmap__read_event(struct perf_mmap *map);
 
 int perf_mmap__push(struct perf_mmap *md, void *to,
 		    int push(struct perf_mmap *map, void *to, void *buf, size_t size));
+
+#ifdef HAVE_AIO_SUPPORT
 int perf_mmap__aio_push(struct perf_mmap *md, void *to,
 			int push(void *to, struct aiocb *cblock, void *buf, size_t size, off_t off),
 			off_t *off);
 
+#else
+static inline int perf_mmap__aio_push(struct perf_mmap *md __maybe_unused, void *to __maybe_unused,
+	int push(void *to, struct aiocb *cblock, void *buf, size_t size, off_t off) __maybe_unused,
+	off_t *off __maybe_unused)
+{
+	return 0;
+}
+#endif
+
 size_t perf_mmap__mmap_len(struct perf_mmap *map);
 
 int perf_mmap__read_init(struct perf_mmap *md);

  parent reply	other threads:[~2018-10-11 13:46 UTC|newest]

Thread overview: 16+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2018-10-09  8:39 [PATCH v12 0/3]: perf: reduce data loss when profiling highly parallel CPU bound workloads Alexey Budankov
2018-10-09  8:57 ` [PATCH v12 1/3] perf util: map data buffer for preserving collected data Alexey Budankov
2018-10-09  8:58 ` [PATCH v12 2/3]: perf record: enable asynchronous trace writing Alexey Budankov
2018-10-11 13:45   ` Jiri Olsa
2018-10-11 16:15     ` Alexey Budankov
2018-10-11 13:45   ` Jiri Olsa
2018-10-11 16:15     ` Alexey Budankov
2018-10-11 13:46   ` Jiri Olsa [this message]
2018-10-11 16:29     ` Alexey Budankov
2018-10-11 14:15   ` Jiri Olsa
2018-10-11 16:31     ` Alexey Budankov
2018-10-09  8:59 ` [PATCH v12 3/3]: perf record: extend trace writing to multi AIO Alexey Budankov
2018-10-11 13:45   ` Jiri Olsa
2018-10-11 16:14     ` Alexey Budankov
2018-10-11 13:46   ` Jiri Olsa
2018-10-11 16:24     ` Alexey Budankov

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=20181011134612.GE29634@krava \
    --to=jolsa@redhat.com \
    --cc=acme@kernel.org \
    --cc=ak@linux.intel.com \
    --cc=alexander.shishkin@linux.intel.com \
    --cc=alexey.budankov@linux.intel.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=mingo@redhat.com \
    --cc=namhyung@kernel.org \
    --cc=peterz@infradead.org \
    /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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.