[CRIU] Re: [PATCH] service-fd: Rework it to use in hight
performance code
Pavel Emelyanov
xemul at parallels.com
Fri Sep 7 08:38:21 EDT 2012
On 09/07/2012 02:06 PM, Cyrill Gorcunov wrote:
> We will need service fd testing in our file engine,
> thus we need to escape calling getrlimit which degradates
> performance.
>
> For this sake we simly cache rlim value we need and
> reuse it where needed.
>
> Note the is_service_fd currently takes @type of @fd,
> I'll need this feature for tty restore code.
>
> Signed-off-by: Cyrill Gorcunov <gorcunov at openvz.org>
> ---
> crtools.c | 3 +++
> include/crtools.h | 13 ++++++++++---
> include/util.h | 4 ++++
> util.c | 23 +++++++++++++++++++++--
> 4 files changed, 38 insertions(+), 5 deletions(-)
>
> diff --git a/crtools.c b/crtools.c
> index 901a6c7..1a5eb6d 100644
> --- a/crtools.c
> +++ b/crtools.c
> @@ -73,6 +73,9 @@ int main(int argc, char *argv[])
> opts.final_state = TASK_DEAD;
> INIT_LIST_HEAD(&opts.veth_pairs);
>
> + if (init_service_fd())
> + return -1;
> +
> while (1) {
> static struct option long_opts[] = {
> { "tree", required_argument, 0, 't' },
> diff --git a/include/crtools.h b/include/crtools.h
> index 8ad8ce8..efbe912 100644
> --- a/include/crtools.h
> +++ b/include/crtools.h
> @@ -99,14 +99,21 @@ struct cr_options {
> extern struct cr_options opts;
>
> enum {
> - LOG_FD_OFF = 1,
> + /*
> + * Never change it to any other
> + * value than zero, otherwise fix
> + * up code in service fd handling.
> + */
> + SERVICE_FD_OFF_MIN,
> +
> + LOG_FD_OFF,
> LOG_DIR_FD_OFF,
> IMG_FD_OFF,
> SELF_EXE_FD_OFF,
> PROC_FD_OFF,
> -};
>
> -int get_service_fd(int type);
> + SERVICE_FD_OFF_MAX
> +};
>
> /* file descriptors template */
> struct cr_fd_desc_tmpl {
> diff --git a/include/util.h b/include/util.h
> index 1daf451..d0a0bc8 100644
> --- a/include/util.h
> +++ b/include/util.h
> @@ -321,4 +321,8 @@ static inline int read_img_str(int fd, char **pstr, int size)
> extern void *shmalloc(size_t bytes);
> extern void shfree_last(void *ptr);
>
> +extern int init_service_fd(void);
> +extern int get_service_fd(int type);
> +extern int is_service_fd(int fd, int type);
> +
> #endif /* UTIL_H_ */
> diff --git a/util.c b/util.c
> index 1fad14c..ec56ff5 100644
> --- a/util.c
> +++ b/util.c
> @@ -224,7 +224,10 @@ int do_open_proc(pid_t pid, int flags, const char *fmt, ...)
> return openat(dirfd, path, flags);
> }
>
> -int get_service_fd(int type)
> +static int service_fd_rlim_cur;
> +static int service_fd_rlim_min;
> +
> +int init_service_fd(void)
> {
> struct rlimit rlimit;
>
> @@ -238,7 +241,23 @@ int get_service_fd(int type)
> return -1;
> }
>
> - return rlimit.rlim_cur - type;
> + service_fd_rlim_cur = (int)rlimit.rlim_cur;
> + service_fd_rlim_min = service_fd_rlim_cur - SERVICE_FD_OFF_MAX;
> +
> + return 0;
> +}
> +
> +int get_service_fd(int type)
> +{
> + return service_fd_rlim_cur - type;
> +}
> +
> +int is_service_fd(int fd, int type)
> +{
> + if (type > SERVICE_FD_OFF_MIN)
> + return fd == get_service_fd(type);
> +
> + return fd > service_fd_rlim_min;
int is_service_fd(int fd)
{
return fd > serice_fd_rlim_cur - SERVICE_FD_OFF_MAX;
}
> }
>
> int copy_file(int fd_in, int fd_out, size_t bytes)
More information about the CRIU
mailing list