Skip to content

Commit

Permalink
powerpc/pseries: Introduce rwlock to gatekeep DTLB usage
Browse files Browse the repository at this point in the history
Since we would be introducing a new user of the DTL buffer in a
subsequent patch, we need a way to gatekeep use of the DTL buffer.

The current debugfs interface for DTL allows registering and opening
cpu-specific DTL buffers. Cpu specific files are exposed under
debugfs 'powerpc/dtl/' node, and changing 'dtl_event_mask' in the same
directory enables controlling the event mask used when registering DTL
buffer for a particular cpu.

Subsequently, we will be introducing a user of the DTL buffers that
registers access to the DTL buffers across all cpus with the same event
mask. To ensure these two users do not step on each other, we introduce
a rwlock to gatekeep DTL buffer access. This fits the requirement of the
current debugfs interface wanting to allow multiple independent
cpu-specific users (read lock), and the subsequent user wanting
exclusive access (write lock).

Suggested-by: Michael Ellerman <[email protected]>
Signed-off-by: Naveen N. Rao <[email protected]>
Signed-off-by: Michael Ellerman <[email protected]>
  • Loading branch information
rnav authored and mpe committed Jul 4, 2019
1 parent 1c85a2a commit 06220d7
Show file tree
Hide file tree
Showing 3 changed files with 16 additions and 1 deletion.
2 changes: 2 additions & 0 deletions arch/powerpc/include/asm/lppaca.h
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@
*/
#include <linux/cache.h>
#include <linux/threads.h>
#include <linux/spinlock_types.h>
#include <asm/types.h>
#include <asm/mmu.h>
#include <asm/firmware.h>
Expand Down Expand Up @@ -166,6 +167,7 @@ struct dtl_entry {
#define DTL_LOG_ALL (DTL_LOG_CEDE | DTL_LOG_PREEMPT | DTL_LOG_FAULT)

extern struct kmem_cache *dtl_cache;
extern rwlock_t dtl_access_lock;

/*
* When CONFIG_VIRT_CPU_ACCOUNTING_NATIVE = y, the cpu accounting code controls
Expand Down
11 changes: 10 additions & 1 deletion arch/powerpc/platforms/pseries/dtl.c
Original file line number Diff line number Diff line change
Expand Up @@ -193,11 +193,16 @@ static int dtl_enable(struct dtl *dtl)
if (dtl->buf)
return -EBUSY;

/* ensure there are no other conflicting dtl users */
if (!read_trylock(&dtl_access_lock))
return -EBUSY;

n_entries = dtl_buf_entries;
buf = kmem_cache_alloc_node(dtl_cache, GFP_KERNEL, cpu_to_node(dtl->cpu));
if (!buf) {
printk(KERN_WARNING "%s: buffer alloc failed for cpu %d\n",
__func__, dtl->cpu);
read_unlock(&dtl_access_lock);
return -ENOMEM;
}

Expand All @@ -214,8 +219,11 @@ static int dtl_enable(struct dtl *dtl)
}
spin_unlock(&dtl->lock);

if (rc)
if (rc) {
read_unlock(&dtl_access_lock);
kmem_cache_free(dtl_cache, buf);
}

return rc;
}

Expand All @@ -227,6 +235,7 @@ static void dtl_disable(struct dtl *dtl)
dtl->buf = NULL;
dtl->buf_entries = 0;
spin_unlock(&dtl->lock);
read_unlock(&dtl_access_lock);
}

/* file interface */
Expand Down
4 changes: 4 additions & 0 deletions arch/powerpc/platforms/pseries/lpar.c
Original file line number Diff line number Diff line change
Expand Up @@ -113,6 +113,10 @@ void register_dtl_buffer(int cpu)
}
}

#ifdef CONFIG_PPC_SPLPAR
DEFINE_RWLOCK(dtl_access_lock);
#endif /* CONFIG_PPC_SPLPAR */

void vpa_init(int cpu)
{
int hwcpu = get_hard_smp_processor_id(cpu);
Expand Down

0 comments on commit 06220d7

Please sign in to comment.