spin_unlock(&batch->full_lock);
}
}
-
return element;
}
EXPORT_SYMBOL(ceph_san_batch_get);
/* If current magazine is full, move it to full pool */
if (likely(cpu_mag->mag && cpu_mag->mag->count >= CEPH_SAN_MAGAZINE_SIZE)) {
spin_lock(&batch->full_lock);
- list_add(&cpu_mag->mag->list, &batch->full_magazines);
+ list_add_tail(&cpu_mag->mag->list, &batch->full_magazines);
batch->nr_full++;
spin_unlock(&batch->full_lock);
cpu_mag->mag = NULL;
#include <linux/string.h>
#include <linux/ceph/ceph_san_logger.h>
+#define CEPH_SAN_LOG_BATCH_MAX_FULL 128
/* Global logger instance */
static struct ceph_san_logger g_logger;
{
struct ceph_san_tls_ctx *ctx;
ctx = kmem_cache_alloc(g_logger.alloc_batch.magazine_cache, GFP_KERNEL);
- if (!ctx)
+ if (!ctx) {
+ pr_err("Failed to allocate TLS context from magazine cache\n");
return NULL;
+ }
/* Initialize pagefrag */
memset(&ctx->pf, 0, sizeof(ctx->pf));
if (cephsan_pagefrag_init(&ctx->pf)) {
+ pr_err("Failed to initialize pagefrag for TLS context\n");
kmem_cache_free(g_logger.alloc_batch.magazine_cache, ctx);
return NULL;
}
/* Add context to log batch */
ceph_san_batch_put(&g_logger.log_batch, ctx);
+ /* If log_batch has too many full magazines, move one to alloc_batch */
+ if (g_logger.log_batch.nr_full > CEPH_SAN_LOG_BATCH_MAX_FULL) {
+ struct ceph_san_magazine *mag;
+ spin_lock(&g_logger.log_batch.full_lock);
+ if (!list_empty(&g_logger.log_batch.full_magazines)) {
+ mag = list_first_entry(&g_logger.log_batch.full_magazines,
+ struct ceph_san_magazine, list);
+ list_del(&mag->list);
+ g_logger.log_batch.nr_full--;
+ spin_unlock(&g_logger.log_batch.full_lock);
+
+ spin_lock(&g_logger.alloc_batch.full_lock);
+ list_add(&mag->list, &g_logger.alloc_batch.full_magazines);
+ g_logger.alloc_batch.nr_full++;
+ spin_unlock(&g_logger.alloc_batch.full_lock);
+ } else {
+ spin_unlock(&g_logger.log_batch.full_lock);
+ }
+ }
current->tls.state = NULL;
}
spin_lock(&g_logger.lock);
list_for_each_entry_safe(ctx, tmp, &g_logger.contexts, list) {
list_del(&ctx->list);
- cephsan_pagefrag_deinit(&ctx->pf);
- kfree(ctx);
+ free_tls_ctx(ctx);
}
spin_unlock(&g_logger.lock);