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