* Dual LGPL v2.1/GPL v2 license.
*/
+#define _GNU_SOURCE
#include <urcu/arch.h>
-
-#include "lttng/core.h"
+#include <limits.h>
#include <lttng/ringbuffer-config.h>
#include "vatomic.h"
if (!name)
return -EPERM;
- if (!(subbuf_size && num_subbuf))
- return -EPERM;
-
/* Check that the subbuffer size is larger than a page. */
if (subbuf_size < PAGE_SIZE)
return -EINVAL;
/*
- * Make sure the number of subbuffers and subbuffer size are power of 2.
+ * Make sure the number of subbuffers and subbuffer size are
+ * power of 2, and nonzero.
*/
- CHAN_WARN_ON(chanb, hweight32(subbuf_size) != 1);
- CHAN_WARN_ON(chanb, hweight32(num_subbuf) != 1);
+ if (!subbuf_size || (subbuf_size & (subbuf_size - 1)))
+ return -EINVAL;
+ if (!num_subbuf || (num_subbuf & (num_subbuf - 1)))
+ return -EINVAL;
ret = subbuffer_id_check_index(config, num_subbuf);
if (ret)
buf = shmp(handle, chanb->buf[0].shmp);
if (!buf)
goto end;
+ set_shmp(buf->self, chanb->buf[0].shmp._ref);
ret = lib_ring_buffer_create(buf, chanb, -1,
handle, shmobj);
if (ret)