1
0
Fork 0

devpts: Convert to new IDA API

ida_alloc_max() matches what this driver wants to do.  Also removes a
call to ida_pre_get().  We no longer need the protection of the mutex,
so convert pty_count to an atomic_t and remove the mutex entirely.

Signed-off-by: Matthew Wilcox <willy@infradead.org>
hifive-unleashed-5.1
Matthew Wilcox 2018-06-11 15:17:58 -04:00
parent 169b480e4c
commit 0f0a0e54a2
1 changed files with 12 additions and 33 deletions

View File

@ -46,7 +46,7 @@ static int pty_limit = NR_UNIX98_PTY_DEFAULT;
static int pty_reserve = NR_UNIX98_PTY_RESERVE; static int pty_reserve = NR_UNIX98_PTY_RESERVE;
static int pty_limit_min; static int pty_limit_min;
static int pty_limit_max = INT_MAX; static int pty_limit_max = INT_MAX;
static int pty_count; static atomic_t pty_count = ATOMIC_INIT(0);
static struct ctl_table pty_table[] = { static struct ctl_table pty_table[] = {
{ {
@ -93,8 +93,6 @@ static struct ctl_table pty_root_table[] = {
{} {}
}; };
static DEFINE_MUTEX(allocated_ptys_lock);
struct pts_mount_opts { struct pts_mount_opts {
int setuid; int setuid;
int setgid; int setgid;
@ -533,44 +531,25 @@ static struct file_system_type devpts_fs_type = {
int devpts_new_index(struct pts_fs_info *fsi) int devpts_new_index(struct pts_fs_info *fsi)
{ {
int index; int index = -ENOSPC;
int ida_ret;
retry: if (atomic_inc_return(&pty_count) >= (pty_limit -
if (!ida_pre_get(&fsi->allocated_ptys, GFP_KERNEL)) (fsi->mount_opts.reserve ? 0 : pty_reserve)))
return -ENOMEM; goto out;
mutex_lock(&allocated_ptys_lock); index = ida_alloc_max(&fsi->allocated_ptys, fsi->mount_opts.max - 1,
if (pty_count >= (pty_limit - GFP_KERNEL);
(fsi->mount_opts.reserve ? 0 : pty_reserve))) {
mutex_unlock(&allocated_ptys_lock);
return -ENOSPC;
}
ida_ret = ida_get_new(&fsi->allocated_ptys, &index); out:
if (ida_ret < 0) { if (index < 0)
mutex_unlock(&allocated_ptys_lock); atomic_dec(&pty_count);
if (ida_ret == -EAGAIN)
goto retry;
return -EIO;
}
if (index >= fsi->mount_opts.max) {
ida_remove(&fsi->allocated_ptys, index);
mutex_unlock(&allocated_ptys_lock);
return -ENOSPC;
}
pty_count++;
mutex_unlock(&allocated_ptys_lock);
return index; return index;
} }
void devpts_kill_index(struct pts_fs_info *fsi, int idx) void devpts_kill_index(struct pts_fs_info *fsi, int idx)
{ {
mutex_lock(&allocated_ptys_lock); ida_free(&fsi->allocated_ptys, idx);
ida_remove(&fsi->allocated_ptys, idx); atomic_dec(&pty_count);
pty_count--;
mutex_unlock(&allocated_ptys_lock);
} }
/** /**