Re: [PATCH 4.19 03/89] cgroup, netclassid: periodically release file_lock on classid updating

From: Konstantin Khlebnikov
Date: Wed Mar 18 2020 - 06:02:05 EST


On 18/03/2020 12.02, Pavel Machek wrote:
Hi!

From: Dmitry Yakunin <zeil@xxxxxxxxxxxxxx>

[ Upstream commit 018d26fcd12a75fb9b5fe233762aa3f2f0854b88 ]
...
Now update is non atomic and socket may be skipped using calls:

dup2(oldfd, newfd);
close(oldfd);

But this case is not typical. Moreover before this patch skip is possible
too by hiding socket fd in unix socket buffer.

Dunno. This makes interface even more interesting.

This is part of brilliant cgroup-v1 design. =)
Cgroup-v2 doesn't recolor sockets when task is moved.


+
static int update_classid_sock(const void *v, struct file *file, unsigned n)
{
int err;
+ struct update_classid_context *ctx = (void *)v;
struct socket *sock = sock_from_file(file, &err);

...
+ if (--ctx->batch == 0) {
+ ctx->batch = UPDATE_CLASSID_BATCH;
+ return n + 1;
+ }
return 0;
}

We take "const void *" and then write to it. That's asking for
trouble... right? Should the const annotation be removed, at least for
sake of humans trying to understand the code?

Indeed, there is no much sense in opaque const void *.
This is how iterate_fd() is declared.


Best regards,
Pavel