{
struct lttng_kernel_ring_buffer_backend *bufb = &ctx->priv.buf->backend;
struct channel_backend *chanb = &ctx->priv.chan->backend;
- size_t index, pagecpy;
+ size_t index, bytes_left_in_page;
size_t offset = ctx->priv.buf_offset;
struct lttng_kernel_ring_buffer_backend_pages *backend_pages;
lib_ring_buffer_get_backend_pages_from_ctx(config, ctx);
offset &= chanb->buf_size - 1;
index = (offset & (chanb->subbuf_size - 1)) >> PAGE_SHIFT;
- pagecpy = min_t(size_t, len, (-offset) & ~PAGE_MASK);
- if (likely(pagecpy == len)) {
+ bytes_left_in_page = min_t(size_t, len, (-offset) & ~PAGE_MASK);
+ if (likely(bytes_left_in_page == len)) {
size_t count;
count = lib_ring_buffer_do_strcpy(config,
+ (offset & ~PAGE_MASK),
'\0', 1);
} else {
- _lib_ring_buffer_strcpy(bufb, offset, src, len, 0, pad);
+ _lib_ring_buffer_strcpy(bufb, offset, src, len, pad);
}
ctx->priv.buf_offset += len;
}
{
struct lttng_kernel_ring_buffer_backend *bufb = &ctx->priv.buf->backend;
struct channel_backend *chanb = &ctx->priv.chan->backend;
- size_t index, pagecpy;
+ size_t index, bytes_left_in_page;
size_t offset = ctx->priv.buf_offset;
struct lttng_kernel_ring_buffer_backend_pages *backend_pages;
lib_ring_buffer_get_backend_pages_from_ctx(config, ctx);
offset &= chanb->buf_size - 1;
index = (offset & (chanb->subbuf_size - 1)) >> PAGE_SHIFT;
- pagecpy = min_t(size_t, len, (-offset) & ~PAGE_MASK);
+ bytes_left_in_page = min_t(size_t, len, (-offset) & ~PAGE_MASK);
if (unlikely(!lttng_access_ok(VERIFY_READ, src, len)))
goto fill_buffer;
pagefault_disable();
- if (likely(pagecpy == len)) {
+ if (likely(bytes_left_in_page == len)) {
size_t count;
count = lib_ring_buffer_do_strcpy_from_user_inatomic(config,
'\0', 1);
} else {
_lib_ring_buffer_strcpy_from_user_inatomic(bufb, offset, src,
- len, 0, pad);
+ len, pad);
}
pagefault_enable();
ctx->priv.buf_offset += len;
size_t offset, int c, size_t len,
size_t pagecpy);
extern void _lib_ring_buffer_strcpy(struct lttng_kernel_ring_buffer_backend *bufb,
- size_t offset, const char *src, size_t len,
- size_t pagecpy, int pad);
+ size_t offset, const char *src, size_t len, int pad);
extern void _lib_ring_buffer_pstrcpy(struct lttng_kernel_ring_buffer_backend *bufb,
size_t offset, const char *src, size_t len, int pad);
extern void _lib_ring_buffer_copy_from_user_inatomic(struct lttng_kernel_ring_buffer_backend *bufb,
size_t offset, const void *src,
size_t len, size_t pagecpy);
extern void _lib_ring_buffer_strcpy_from_user_inatomic(struct lttng_kernel_ring_buffer_backend *bufb,
- size_t offset, const char __user *src, size_t len,
- size_t pagecpy, int pad);
+ size_t offset, const char __user *src, size_t len, int pad);
extern void _lib_ring_buffer_pstrcpy_from_user_inatomic(struct lttng_kernel_ring_buffer_backend *bufb,
size_t offset, const char __user *src, size_t len, int pad);
* @offset : offset within the buffer
* @src : source address
* @len : length to write
- * @pagecpy : page size copied so far
* @pad : character to use for padding
*/
void _lib_ring_buffer_strcpy(struct lttng_kernel_ring_buffer_backend *bufb,
- size_t offset, const char *src, size_t len,
- size_t pagecpy, int pad)
+ size_t offset, const char *src, size_t len, int pad)
{
struct channel_backend *chanb = &bufb->chan->backend;
const struct lttng_kernel_ring_buffer_config *config = &chanb->config;
- size_t sbidx, index;
+ size_t sbidx, index, bytes_left_in_page;
struct lttng_kernel_ring_buffer_backend_pages *rpages;
unsigned long sb_bindex, id;
- int src_terminated = 0;
+ bool src_terminated = false;
CHAN_WARN_ON(chanb, !len);
- offset += pagecpy;
do {
- len -= pagecpy;
- if (!src_terminated)
- src += pagecpy;
sbidx = offset >> chanb->subbuf_size_order;
index = (offset & (chanb->subbuf_size - 1)) >> PAGE_SHIFT;
*/
CHAN_WARN_ON(chanb, offset >= chanb->buf_size);
- pagecpy = min_t(size_t, len, PAGE_SIZE - (offset & ~PAGE_MASK));
+ bytes_left_in_page = min_t(size_t, len, PAGE_SIZE - (offset & ~PAGE_MASK));
id = bufb->buf_wsb[sbidx].id;
sb_bindex = subbuffer_id_get_index(config, id);
rpages = bufb->array[sb_bindex];
if (likely(!src_terminated)) {
size_t count, to_copy;
- to_copy = pagecpy;
- if (pagecpy == len)
+ to_copy = bytes_left_in_page;
+ if (bytes_left_in_page == len)
to_copy--; /* Final '\0' */
count = lib_ring_buffer_do_strcpy(config,
rpages->p[index].virt
size_t pad_len = to_copy - count;
/* Next pages will have padding */
- src_terminated = 1;
+ src_terminated = true;
lib_ring_buffer_do_memset(rpages->p[index].virt
+ (offset & ~PAGE_MASK),
pad, pad_len);
} else {
size_t pad_len;
- pad_len = pagecpy;
- if (pagecpy == len)
+ pad_len = bytes_left_in_page;
+ if (bytes_left_in_page == len)
pad_len--; /* Final '\0' */
lib_ring_buffer_do_memset(rpages->p[index].virt
+ (offset & ~PAGE_MASK),
pad, pad_len);
offset += pad_len;
}
- } while (unlikely(len != pagecpy));
+ len -= bytes_left_in_page;
+ if (!src_terminated)
+ src += bytes_left_in_page;
+ } while (unlikely(len));
+
/* Ending '\0' */
lib_ring_buffer_do_memset(rpages->p[index].virt + (offset & ~PAGE_MASK),
'\0', 1);
* @offset : offset within the buffer
* @src : source address
* @len : length to write
- * @pagecpy : page size copied so far
* @pad : character to use for padding
*
* This function deals with userspace pointers, it should never be called
* previously.
*/
void _lib_ring_buffer_strcpy_from_user_inatomic(struct lttng_kernel_ring_buffer_backend *bufb,
- size_t offset, const char __user *src, size_t len,
- size_t pagecpy, int pad)
+ size_t offset, const char __user *src, size_t len, int pad)
{
struct channel_backend *chanb = &bufb->chan->backend;
const struct lttng_kernel_ring_buffer_config *config = &chanb->config;
- size_t sbidx, index;
+ size_t sbidx, index, bytes_left_in_page;
struct lttng_kernel_ring_buffer_backend_pages *rpages;
unsigned long sb_bindex, id;
- int src_terminated = 0;
+ bool src_terminated = false;
- offset += pagecpy;
do {
- len -= pagecpy;
- if (!src_terminated)
- src += pagecpy;
sbidx = offset >> chanb->subbuf_size_order;
index = (offset & (chanb->subbuf_size - 1)) >> PAGE_SHIFT;
*/
CHAN_WARN_ON(chanb, offset >= chanb->buf_size);
- pagecpy = min_t(size_t, len, PAGE_SIZE - (offset & ~PAGE_MASK));
+ bytes_left_in_page = min_t(size_t, len, PAGE_SIZE - (offset & ~PAGE_MASK));
id = bufb->buf_wsb[sbidx].id;
sb_bindex = subbuffer_id_get_index(config, id);
rpages = bufb->array[sb_bindex];
if (likely(!src_terminated)) {
size_t count, to_copy;
- to_copy = pagecpy;
- if (pagecpy == len)
+ to_copy = bytes_left_in_page;
+ if (bytes_left_in_page == len)
to_copy--; /* Final '\0' */
count = lib_ring_buffer_do_strcpy_from_user_inatomic(config,
rpages->p[index].virt
size_t pad_len = to_copy - count;
/* Next pages will have padding */
- src_terminated = 1;
+ src_terminated = true;
lib_ring_buffer_do_memset(rpages->p[index].virt
+ (offset & ~PAGE_MASK),
pad, pad_len);
} else {
size_t pad_len;
- pad_len = pagecpy;
- if (pagecpy == len)
+ pad_len = bytes_left_in_page;
+ if (bytes_left_in_page == len)
pad_len--; /* Final '\0' */
lib_ring_buffer_do_memset(rpages->p[index].virt
+ (offset & ~PAGE_MASK),
pad, pad_len);
offset += pad_len;
}
- } while (unlikely(len != pagecpy));
+ len -= bytes_left_in_page;
+ if (!src_terminated)
+ src += bytes_left_in_page;
+ } while (unlikely(len));
+
/* Ending '\0' */
lib_ring_buffer_do_memset(rpages->p[index].virt + (offset & ~PAGE_MASK),
'\0', 1);