return -EINVAL;
if (!num_subbuf || (num_subbuf & (num_subbuf - 1)))
return -EINVAL;
+ /*
+ * Overwrite mode buffers require at least 2 subbuffers per
+ * buffer.
+ */
+ if (config->mode == RING_BUFFER_OVERWRITE && num_subbuf < 2)
+ return -EINVAL;
ret = subbuffer_id_check_index(config, num_subbuf);
if (ret)
}
#ifdef CONFIG_HOTPLUG_CPU
put_online_cpus();
+ unregister_hotcpu_notifier(&chanb->cpu_hp_notifier);
#endif
free_percpu(chanb->buf);
} else
* @pagecpy : page size copied so far
*/
void _lib_ring_buffer_write(struct lib_ring_buffer_backend *bufb, size_t offset,
- const void *src, size_t len, ssize_t pagecpy)
+ const void *src, size_t len, size_t pagecpy)
{
struct channel_backend *chanb = &bufb->chan->backend;
const struct lib_ring_buffer_config *config = &chanb->config;
*/
void _lib_ring_buffer_memset(struct lib_ring_buffer_backend *bufb,
size_t offset,
- int c, size_t len, ssize_t pagecpy)
+ int c, size_t len, size_t pagecpy)
{
struct channel_backend *chanb = &bufb->chan->backend;
const struct lib_ring_buffer_config *config = &chanb->config;
void _lib_ring_buffer_copy_from_user_inatomic(struct lib_ring_buffer_backend *bufb,
size_t offset,
const void __user *src, size_t len,
- ssize_t pagecpy)
+ size_t pagecpy)
{
struct channel_backend *chanb = &bufb->chan->backend;
const struct lib_ring_buffer_config *config = &chanb->config;
+ (offset & ~PAGE_MASK),
src, pagecpy) != 0;
if (ret > 0) {
- offset += (pagecpy - ret);
- len -= (pagecpy - ret);
+ /* Copy failed. */
_lib_ring_buffer_memset(bufb, offset, 0, len, 0);
break; /* stop copy */
}
{
struct channel_backend *chanb = &bufb->chan->backend;
const struct lib_ring_buffer_config *config = &chanb->config;
- size_t index;
- ssize_t pagecpy, orig_len;
+ size_t index, pagecpy, orig_len;
struct lib_ring_buffer_backend_pages *rpages;
unsigned long sb_bindex, id;