Re: [PATCH 3/8] pid.c: Add IDR implementation for alloc_pid and free_pid

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 




On Fri, 14 Jul 2017, Gargi Sharma wrote:

> In pid_alloc function, idr_preload function is used along with
> idr_alloc_cyclic.
> idr_alloc_cyclic is used instead of idr_alloc because we might want to
> reuse the unassigned integers. The rest of the code is same as the previous
> alloc_pid, which puts the pid allocated onto the task list. After the flag
> out_free, ids are removed from the idr entry using idr_remove function.
> Inside free_pid() deleting from rcu hash list is same as before.
> The only change is instead of removing entry from pidmap, allocated
> number is now deleted from the idr entry.
>
> Signed-off-by: Gargi Sharma <gs051095@xxxxxxxxx>
> ---
>  kernel/pid.c | 26 +++++++++++++++++++++-----
>  1 file changed, 21 insertions(+), 5 deletions(-)
>
> diff --git a/kernel/pid.c b/kernel/pid.c
> index fd1cde1..5060266 100644
> --- a/kernel/pid.c
> +++ b/kernel/pid.c
> @@ -287,8 +287,14 @@ void free_pid(struct pid *pid)
>  	}
>  	spin_unlock_irqrestore(&pidmap_lock, flags);
>
> -	for (i = 0; i <= pid->level; i++)
> -		free_pidmap(pid->numbers + i);
> +	for (i = 0; i <= pid->level; i++) {
> +		struct upid *upid = pid->numbers + i;
> +		struct pid_namespace *ns = upid->ns;
> +
> +		mutex_lock(&ns->idr_mutex_lock);
> +		idr_remove(ns->idr, upid->nr);
> +		mutex_unlock(&ns->idr_mutex_lock);
> +	}
>
>  	call_rcu(&pid->rcu, delayed_put_pid);
>  }
> @@ -309,7 +315,15 @@ struct pid *alloc_pid(struct pid_namespace *ns)
>  	tmp = ns;
>  	pid->level = ns->level;
>  	for (i = ns->level; i >= 0; i--) {
> -		nr = alloc_pidmap(tmp);
> +		idr_preload(GFP_KERNEL);
> +
> +		mutex_lock(&ns->idr_mutex_lock);
> +		nr = idr_alloc_cyclic(tmp->idr, ns, RESERVED_PIDS,
> +				      pid_max, GFP_KERNEL);
> +
> +		mutex_unlock(&ns->idr_mutex_lock);
> +		idr_preload_end();
> +
>  		if (nr < 0) {
>  			retval = nr;
>  			goto out_free;
> @@ -350,8 +364,10 @@ struct pid *alloc_pid(struct pid_namespace *ns)
>  	put_pid_ns(ns);
>
>  out_free:
> -	while (++i <= ns->level)
> -		free_pidmap(pid->numbers + i);
> +	while (++i <= ns->level) {
> +		idr_remove(ns->idr, (pid->numbers + i)->nr);
> +		mutex_unlock(&ns->idr_mutex_lock);

It doesn't look right to call mutex_unlock multiple times in a lopo on the
same value.

julia

> +	}
>
>  	kmem_cache_free(ns->pid_cachep, pid);
>  	return ERR_PTR(retval);
> --
> 2.7.4
>
>
--
To unsubscribe from this list: send the line "unsubscribe linux-usb" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html



[Index of Archives]     [Linux Media]     [Linux Input]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]     [Old Linux USB Devel Archive]

  Powered by Linux