*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
*/
#include <errno.h>
* RING_BUFFER_WAKEUP_NONE does not perform any wakeup whatsoever. The client
* has the responsibility to perform wakeups.
*/
-#define LTTNG_UST_RING_BUFFER_CONFIG_PADDING 32
+#define LTTNG_UST_RING_BUFFER_CONFIG_PADDING 20
+
+enum lttng_ust_lib_ring_buffer_alloc_types {
+ RING_BUFFER_ALLOC_PER_CPU,
+ RING_BUFFER_ALLOC_GLOBAL,
+};
+
+enum lttng_ust_lib_ring_buffer_sync_types {
+ RING_BUFFER_SYNC_PER_CPU, /* Wait-free */
+ RING_BUFFER_SYNC_GLOBAL, /* Lock-free */
+};
+
+enum lttng_ust_lib_ring_buffer_mode_types {
+ RING_BUFFER_OVERWRITE, /* Overwrite when buffer full */
+ RING_BUFFER_DISCARD, /* Discard when buffer full */
+};
+
+enum lttng_ust_lib_ring_buffer_output_types {
+ RING_BUFFER_SPLICE,
+ RING_BUFFER_MMAP,
+ RING_BUFFER_READ, /* TODO */
+ RING_BUFFER_ITERATOR,
+ RING_BUFFER_NONE,
+};
+
+enum lttng_ust_lib_ring_buffer_backend_types {
+ RING_BUFFER_PAGE,
+ RING_BUFFER_VMAP, /* TODO */
+ RING_BUFFER_STATIC, /* TODO */
+};
+
+enum lttng_ust_lib_ring_buffer_oops_types {
+ RING_BUFFER_NO_OOPS_CONSISTENCY,
+ RING_BUFFER_OOPS_CONSISTENCY,
+};
+
+enum lttng_ust_lib_ring_buffer_ipi_types {
+ RING_BUFFER_IPI_BARRIER,
+ RING_BUFFER_NO_IPI_BARRIER,
+};
+
+enum lttng_ust_lib_ring_buffer_wakeup_types {
+ RING_BUFFER_WAKEUP_BY_TIMER, /* wake up performed by timer */
+ RING_BUFFER_WAKEUP_BY_WRITER, /*
+ * writer wakes up reader,
+ * not lock-free
+ * (takes spinlock).
+ */
+};
+
struct lttng_ust_lib_ring_buffer_config {
- enum {
- RING_BUFFER_ALLOC_PER_CPU,
- RING_BUFFER_ALLOC_GLOBAL,
- } alloc;
- enum {
- RING_BUFFER_SYNC_PER_CPU, /* Wait-free */
- RING_BUFFER_SYNC_GLOBAL, /* Lock-free */
- } sync;
- enum {
- RING_BUFFER_OVERWRITE, /* Overwrite when buffer full */
- RING_BUFFER_DISCARD, /* Discard when buffer full */
- } mode;
- enum {
- RING_BUFFER_SPLICE,
- RING_BUFFER_MMAP,
- RING_BUFFER_READ, /* TODO */
- RING_BUFFER_ITERATOR,
- RING_BUFFER_NONE,
- } output;
- enum {
- RING_BUFFER_PAGE,
- RING_BUFFER_VMAP, /* TODO */
- RING_BUFFER_STATIC, /* TODO */
- } backend;
- enum {
- RING_BUFFER_NO_OOPS_CONSISTENCY,
- RING_BUFFER_OOPS_CONSISTENCY,
- } oops;
- enum {
- RING_BUFFER_IPI_BARRIER,
- RING_BUFFER_NO_IPI_BARRIER,
- } ipi;
- enum {
- RING_BUFFER_WAKEUP_BY_TIMER, /* wake up performed by timer */
- RING_BUFFER_WAKEUP_BY_WRITER, /*
- * writer wakes up reader,
- * not lock-free
- * (takes spinlock).
- */
- } wakeup;
+ enum lttng_ust_lib_ring_buffer_alloc_types alloc;
+ enum lttng_ust_lib_ring_buffer_sync_types sync;
+ enum lttng_ust_lib_ring_buffer_mode_types mode;
+ enum lttng_ust_lib_ring_buffer_output_types output;
+ enum lttng_ust_lib_ring_buffer_backend_types backend;
+ enum lttng_ust_lib_ring_buffer_oops_types oops;
+ enum lttng_ust_lib_ring_buffer_ipi_types ipi;
+ enum lttng_ust_lib_ring_buffer_wakeup_types wakeup;
/*
* tsc_bits: timestamp bits saved at each record.
* 0 and 64 disable the timestamp compression scheme.
* callbacks and update the cb pointers.
*/
int client_type;
+ int _unused1;
+ const struct lttng_ust_lib_ring_buffer_client_cb *cb_ptr;
char padding[LTTNG_UST_RING_BUFFER_CONFIG_PADDING];
};
* UST. Fields need to be only added at the end, never reordered, never
* removed.
*/
-#define LTTNG_UST_RING_BUFFER_CTX_PADDING 24
+#define LTTNG_UST_RING_BUFFER_CTX_PADDING \
+ (24 - sizeof(int) - sizeof(void *))
struct lttng_ust_lib_ring_buffer_ctx {
/* input received by lib_ring_buffer_reserve(), saved here. */
struct channel *chan; /* channel */
*/
uint64_t tsc; /* time-stamp counter value */
unsigned int rflags; /* reservation flags */
- char padding[LTTNG_UST_RING_BUFFER_CTX_PADDING];
+ unsigned int padding1; /* padding to realign on pointer */
+ void *ip; /* caller ip address */
+ char padding2[LTTNG_UST_RING_BUFFER_CTX_PADDING];
};
/**
ctx->cpu = cpu;
ctx->rflags = 0;
ctx->handle = handle;
- memset(ctx->padding, 0, LTTNG_UST_RING_BUFFER_CTX_PADDING);
+ ctx->padding1 = 0;
+ ctx->ip = 0;
+ memset(ctx->padding2, 0, LTTNG_UST_RING_BUFFER_CTX_PADDING);
}
/*