Commit 60c78668 authored by Leon Romanovsky's avatar Leon Romanovsky Committed by Doug Ledford
Browse files

RDMA/restrack: Rewrite PID namespace check to be reliable



task_active_pid_ns() is wrong API to check PID namespace because it
posses some restrictions and return PID namespace where the process
was allocated. It created mismatches with current namespace, which
can be different.

Rewrite whole rdma_is_visible_in_pid_ns() logic to provide reliable
results without any relation to allocated PID namespace.

Fixes: 8be565e6 ("RDMA/nldev: Factor out the PID namespace check")
Fixes: 6a6c306a ("RDMA/restrack: Make is_visible_in_pid_ns() as an API")
Reviewed-by: default avatarMark Zhang <markz@mellanox.com>
Signed-off-by: default avatarLeon Romanovsky <leonro@mellanox.com>
Link: https://lore.kernel.org/r/20190815083834.9245-4-leon@kernel.org


Signed-off-by: default avatarDoug Ledford <dledford@redhat.com>
parent c8b32408
Loading
Loading
Loading
Loading
+1 −2
Original line number Diff line number Diff line
@@ -382,8 +382,7 @@ static int fill_res_info(struct sk_buff *msg, struct ib_device *device)
	for (i = 0; i < RDMA_RESTRACK_MAX; i++) {
		if (!names[i])
			continue;
		curr = rdma_restrack_count(device, i,
					   task_active_pid_ns(current));
		curr = rdma_restrack_count(device, i);
		ret = fill_res_info_entry(msg, names[i], curr);
		if (ret)
			goto err;
+7 −8
Original line number Diff line number Diff line
@@ -107,10 +107,8 @@ void rdma_restrack_clean(struct ib_device *dev)
 * rdma_restrack_count() - the current usage of specific object
 * @dev:  IB device
 * @type: actual type of object to operate
 * @ns:   PID namespace
 */
int rdma_restrack_count(struct ib_device *dev, enum rdma_restrack_type type,
			struct pid_namespace *ns)
int rdma_restrack_count(struct ib_device *dev, enum rdma_restrack_type type)
{
	struct rdma_restrack_root *rt = &dev->res[type];
	struct rdma_restrack_entry *e;
@@ -119,9 +117,8 @@ int rdma_restrack_count(struct ib_device *dev, enum rdma_restrack_type type,

	xa_lock(&rt->xa);
	xas_for_each(&xas, e, U32_MAX) {
		if (ns == &init_pid_ns ||
		    (!rdma_is_kernel_res(e) &&
		     ns == task_active_pid_ns(e->task)))
		if (!rdma_is_visible_in_pid_ns(e))
			continue;
		cnt++;
	}
	xa_unlock(&rt->xa);
@@ -360,5 +357,7 @@ bool rdma_is_visible_in_pid_ns(struct rdma_restrack_entry *res)
	 */
	if (rdma_is_kernel_res(res))
		return task_active_pid_ns(current) == &init_pid_ns;
	return task_active_pid_ns(current) == task_active_pid_ns(res->task);

	/* PID 0 means that resource is not found in current namespace */
	return task_pid_vnr(res->task);
}
+1 −2
Original line number Diff line number Diff line
@@ -105,8 +105,7 @@ struct rdma_restrack_entry {
};

int rdma_restrack_count(struct ib_device *dev,
			enum rdma_restrack_type type,
			struct pid_namespace *ns);
			enum rdma_restrack_type type);

void rdma_restrack_kadd(struct rdma_restrack_entry *res);
void rdma_restrack_uadd(struct rdma_restrack_entry *res);