#include <linux/slab.h>
#include <linux/vmalloc.h>
-#include <linux/spinlock.h>
#include <asm/uaccess.h>
#include <asm/pgalloc.h>
#include <asm/pgtable.h>
+#include <asm/semaphore.h>
-rwlock_t imlist_lock = RW_LOCK_UNLOCKED;
+static DECLARE_MUTEX(imlist_sem);
struct vm_struct * imlist = NULL;
static int get_free_im_addr(unsigned long size, unsigned long *im_addr)
struct vm_struct *area;
unsigned long addr;
- write_lock(&imlist_lock);
+ down(&imlist_sem);
if (get_free_im_addr(size, &addr)) {
printk(KERN_ERR "%s() cannot obtain addr for size 0x%lx\n",
__FUNCTION__, size);
__FUNCTION__, addr, size);
}
next_im_done:
- write_unlock(&imlist_lock);
+ up(&imlist_sem);
return area;
}
{
struct vm_struct *area;
- write_lock(&imlist_lock);
+ down(&imlist_sem);
area = __im_get_area(v_addr, size, criteria);
- write_unlock(&imlist_lock);
+ up(&imlist_sem);
return area;
}
printk(KERN_ERR "Trying to %s bad address (%p)\n", __FUNCTION__, addr);
return ret_size;
}
- write_lock(&imlist_lock);
+ down(&imlist_sem);
for (p = &imlist ; (tmp = *p) ; p = &tmp->next) {
if (tmp->addr == addr) {
ret_size = tmp->size;
*p = tmp->next;
kfree(tmp);
- write_unlock(&imlist_lock);
+ up(&imlist_sem);
return ret_size;
}
}
- write_unlock(&imlist_lock);
+ up(&imlist_sem);
printk(KERN_ERR "Trying to %s nonexistent area (%p)\n", __FUNCTION__,
addr);
return ret_size;