Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 138917
b: refs/heads/master
c: 3b1e79e
h: refs/heads/master
i:
  138915: 5edc68e
v: v3
  • Loading branch information
Joerg Roedel committed Mar 5, 2009
1 parent 138e0ba commit b40af4b
Show file tree
Hide file tree
Showing 2 changed files with 58 additions and 1 deletion.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 30dfa90cc8c4c9621d8d5aa9499f3a5df3376307
refs/heads/master: 3b1e79ed734f58ac41ca0a287ff03ca355f120ad
57 changes: 57 additions & 0 deletions trunk/lib/dma-debug.c
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,16 @@ struct hash_bucket {

/* Hash list to save the allocated dma addresses */
static struct hash_bucket dma_entry_hash[HASH_SIZE];
/* List of pre-allocated dma_debug_entry's */
static LIST_HEAD(free_entries);
/* Lock for the list above */
static DEFINE_SPINLOCK(free_entries_lock);

/* Global disable flag - will be set in case of an error */
static bool global_disable __read_mostly;

static u32 num_free_entries;
static u32 min_free_entries;

/*
* Hash related functions
Expand Down Expand Up @@ -141,3 +151,50 @@ static void add_dma_entry(struct dma_debug_entry *entry)
put_hash_bucket(bucket, &flags);
}

/* struct dma_entry allocator
*
* The next two functions implement the allocator for
* struct dma_debug_entries.
*/
static struct dma_debug_entry *dma_entry_alloc(void)
{
struct dma_debug_entry *entry = NULL;
unsigned long flags;

spin_lock_irqsave(&free_entries_lock, flags);

if (list_empty(&free_entries)) {
printk(KERN_ERR "DMA-API: debugging out of memory "
"- disabling\n");
global_disable = true;
goto out;
}

entry = list_entry(free_entries.next, struct dma_debug_entry, list);
list_del(&entry->list);
memset(entry, 0, sizeof(*entry));

num_free_entries -= 1;
if (num_free_entries < min_free_entries)
min_free_entries = num_free_entries;

out:
spin_unlock_irqrestore(&free_entries_lock, flags);

return entry;
}

static void dma_entry_free(struct dma_debug_entry *entry)
{
unsigned long flags;

/*
* add to beginning of the list - this way the entries are
* more likely cache hot when they are reallocated.
*/
spin_lock_irqsave(&free_entries_lock, flags);
list_add(&entry->list, &free_entries);
num_free_entries += 1;
spin_unlock_irqrestore(&free_entries_lock, flags);
}

0 comments on commit b40af4b

Please sign in to comment.