Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 89382
b: refs/heads/master
c: d234154
h: refs/heads/master
v: v3
  • Loading branch information
David Chinner authored and Lachlan McIlroy committed Apr 18, 2008
1 parent 7824ff9 commit af17a19
Show file tree
Hide file tree
Showing 3 changed files with 16 additions and 9 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 6ee4752ffe782be6e86bea1403a2fe0f682aa71a
refs/heads/master: d234154125197053d5215711b5df867979e55ebd
22 changes: 14 additions & 8 deletions trunk/fs/xfs/support/ktrace.c
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ static int ktrace_zentries;
void __init
ktrace_init(int zentries)
{
ktrace_zentries = zentries;
ktrace_zentries = roundup_pow_of_two(zentries);

ktrace_hdr_zone = kmem_zone_init(sizeof(ktrace_t),
"ktrace_hdr");
Expand All @@ -47,13 +47,16 @@ ktrace_uninit(void)
* ktrace_alloc()
*
* Allocate a ktrace header and enough buffering for the given
* number of entries.
* number of entries. Round the number of entries up to a
* power of 2 so we can do fast masking to get the index from
* the atomic index counter.
*/
ktrace_t *
ktrace_alloc(int nentries, unsigned int __nocast sleep)
{
ktrace_t *ktp;
ktrace_entry_t *ktep;
int entries;

ktp = (ktrace_t*)kmem_zone_alloc(ktrace_hdr_zone, sleep);

Expand All @@ -70,11 +73,12 @@ ktrace_alloc(int nentries, unsigned int __nocast sleep)
/*
* Special treatment for buffers with the ktrace_zentries entries
*/
if (nentries == ktrace_zentries) {
entries = roundup_pow_of_two(nentries);
if (entries == ktrace_zentries) {
ktep = (ktrace_entry_t*)kmem_zone_zalloc(ktrace_ent_zone,
sleep);
} else {
ktep = (ktrace_entry_t*)kmem_zalloc((nentries * sizeof(*ktep)),
ktep = (ktrace_entry_t*)kmem_zalloc((entries * sizeof(*ktep)),
sleep | KM_LARGE);
}

Expand All @@ -91,7 +95,9 @@ ktrace_alloc(int nentries, unsigned int __nocast sleep)
}

ktp->kt_entries = ktep;
ktp->kt_nentries = nentries;
ktp->kt_nentries = entries;
ASSERT(is_power_of_2(entries));
ktp->kt_index_mask = entries - 1;
atomic_set(&ktp->kt_index, 0);
ktp->kt_rollover = 0;
return ktp;
Expand Down Expand Up @@ -160,7 +166,7 @@ ktrace_enter(
* Grab an entry by pushing the index up to the next one.
*/
index = atomic_add_return(1, &ktp->kt_index);
index = (index - 1) % ktp->kt_nentries;
index = (index - 1) & ktp->kt_index_mask;
if (!ktp->kt_rollover && index == ktp->kt_nentries - 1)
ktp->kt_rollover = 1;

Expand Down Expand Up @@ -197,7 +203,7 @@ ktrace_nentries(
if (ktp == NULL)
return 0;

index = atomic_read(&ktp->kt_index) % ktp->kt_nentries;
index = atomic_read(&ktp->kt_index) & ktp->kt_index_mask;
return (ktp->kt_rollover ? ktp->kt_nentries : index);
}

Expand All @@ -223,7 +229,7 @@ ktrace_first(ktrace_t *ktp, ktrace_snap_t *ktsp)
int nentries;

if (ktp->kt_rollover)
index = atomic_read(&ktp->kt_index) % ktp->kt_nentries;
index = atomic_read(&ktp->kt_index) & ktp->kt_index_mask;
else
index = 0;

Expand Down
1 change: 1 addition & 0 deletions trunk/fs/xfs/support/ktrace.h
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@ typedef struct ktrace_entry {
typedef struct ktrace {
int kt_nentries; /* number of entries in trace buf */
atomic_t kt_index; /* current index in entries */
unsigned int kt_index_mask;
int kt_rollover;
ktrace_entry_t *kt_entries; /* buffer of entries */
} ktrace_t;
Expand Down

0 comments on commit af17a19

Please sign in to comment.