/* XXX these should be in a common header somwhere, but aren't */
extern int chrtoblk_set(int, int);
-extern vm_offset_t kmem_mb_alloc(vm_map_t, int, int);
+extern vm_offset_t kmem_mb_alloc(vm_map_t, int, int, kern_return_t *);
/* XXX most of these just exist to export; there's no good header for them*/
void pcb_synch(void);
int dmmin, dmmax, dmtext;
vm_offset_t
-kmem_mb_alloc(vm_map_t mbmap, int size, int physContig)
+kmem_mb_alloc(vm_map_t mbmap, int size, int physContig, kern_return_t *err)
{
vm_offset_t addr = 0;
kern_return_t kr = KERN_SUCCESS;
if (!physContig)
- kr = kernel_memory_allocate(mbmap, &addr, size, 0, KMA_NOPAGEWAIT | KMA_KOBJECT | KMA_LOMEM, VM_KERN_MEMORY_MBUF);
+ kr = kernel_memory_allocate(mbmap, &addr, size, 0, KMA_KOBJECT | KMA_LOMEM, VM_KERN_MEMORY_MBUF);
else
- kr = kmem_alloc_contig(mbmap, &addr, size, PAGE_MASK, 0xfffff, 0, KMA_NOPAGEWAIT | KMA_KOBJECT | KMA_LOMEM, VM_KERN_MEMORY_MBUF);
+ kr = kmem_alloc_contig(mbmap, &addr, size, PAGE_MASK, 0xfffff, 0, KMA_KOBJECT | KMA_LOMEM, VM_KERN_MEMORY_MBUF);
if (kr != KERN_SUCCESS)
addr = 0;
+ if (err)
+ *err = kr;
return addr;
}
int
bdevsw_add(int index, struct bdevsw * bsw)
{
+ lck_mtx_lock_spin(&devsw_lock_list_mtx);
index = bdevsw_isfree(index);
if (index < 0) {
- return (-1);
+ index = -1;
+ } else {
+ bdevsw[index] = *bsw;
}
- bdevsw[index] = *bsw;
+ lck_mtx_unlock(&devsw_lock_list_mtx);
return (index);
}
/*
return (-1);
devsw = &bdevsw[index];
+ lck_mtx_lock_spin(&devsw_lock_list_mtx);
if ((memcmp((char *)devsw, (char *)bsw, sizeof(struct bdevsw)) != 0)) {
- return (-1);
+ index = -1;
+ } else {
+ bdevsw[index] = nobdev;
}
- bdevsw[index] = nobdev;
+ lck_mtx_unlock(&devsw_lock_list_mtx);
return (index);
}
int
cdevsw_add(int index, struct cdevsw * csw)
{
+ lck_mtx_lock_spin(&devsw_lock_list_mtx);
index = cdevsw_isfree(index);
if (index < 0) {
- return (-1);
+ index = -1;
+ } else {
+ cdevsw[index] = *csw;
}
- cdevsw[index] = *csw;
+ lck_mtx_unlock(&devsw_lock_list_mtx);
return (index);
}
/*
return (-1);
devsw = &cdevsw[index];
+ lck_mtx_lock_spin(&devsw_lock_list_mtx);
if ((memcmp((char *)devsw, (char *)csw, sizeof(struct cdevsw)) != 0)) {
- return (-1);
+ index = -1;
+ } else {
+ cdevsw[index] = nocdev;
+ cdevsw_flags[index] = 0;
}
- cdevsw[index] = nocdev;
- cdevsw_flags[index] = 0;
+ lck_mtx_unlock(&devsw_lock_list_mtx);
return (index);
}
}
int
-cdevsw_setkqueueok(int index, struct cdevsw * csw, int use_offset)
+cdevsw_setkqueueok(int maj, struct cdevsw * csw, int extra_flags)
{
struct cdevsw * devsw;
uint64_t flags = CDEVSW_SELECT_KQUEUE;
- if (index < 0 || index >= nchrdev)
- return (-1);
+ if (maj < 0 || maj >= nchrdev) {
+ return -1;
+ }
- devsw = &cdevsw[index];
+ devsw = &cdevsw[maj];
if ((memcmp((char *)devsw, (char *)csw, sizeof(struct cdevsw)) != 0)) {
- return (-1);
+ return -1;
}
- if (use_offset) {
- flags |= CDEVSW_USE_OFFSET;
- }
+ flags |= extra_flags;
- cdevsw_flags[index] = flags;
+ cdevsw_flags[maj] = flags;
return 0;
}