Skip to content

Commit 2c83c0e

Browse files
authored
Merge pull request #1151 from giuseppe/read-proc-file-using-page
minor cleanups to read_file
2 parents e94022c + 4748543 commit 2c83c0e

File tree

2 files changed

+47
-17
lines changed

2 files changed

+47
-17
lines changed

src/libcrun/utils.c

Lines changed: 40 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -707,6 +707,19 @@ check_running_in_user_namespace (libcrun_error_t *err)
707707
return ret;
708708
}
709709

710+
static size_t
711+
get_page_size ()
712+
{
713+
static atomic_long cached_pagesize = 0;
714+
atomic_long pagesize = cached_pagesize;
715+
if (pagesize == 0)
716+
{
717+
pagesize = (long) sysconf (_SC_PAGESIZE);
718+
cached_pagesize = pagesize;
719+
}
720+
return (size_t) pagesize;
721+
}
722+
710723
static int selinux_enabled = -1;
711724
static int apparmor_enabled = -1;
712725

@@ -725,7 +738,7 @@ libcrun_initialize_selinux (libcrun_error_t *err)
725738
if (UNLIKELY (fd < 0))
726739
return crun_make_error (err, errno, "open /proc/mounts");
727740

728-
ret = read_all_fd (fd, "/proc/mounts", &out, &len, err);
741+
ret = read_all_fd_with_size_hint (fd, "/proc/mounts", &out, &len, get_page_size (), err);
729742
if (UNLIKELY (ret < 0))
730743
return ret;
731744

@@ -866,21 +879,26 @@ set_apparmor_profile (const char *profile, bool now, libcrun_error_t *err)
866879
}
867880

868881
int
869-
read_all_fd (int fd, const char *description, char **out, size_t *len, libcrun_error_t *err)
882+
read_all_fd_with_size_hint (int fd, const char *description, char **out, size_t *len, size_t size_hint, libcrun_error_t *err)
870883
{
871-
int ret;
884+
cleanup_free char *buf = NULL;
872885
size_t nread, allocated;
886+
size_t pagesize = 0;
873887
off_t size = 0;
874-
cleanup_free char *buf = NULL;
888+
int ret;
875889

876-
ret = get_file_size (fd, &size);
877-
if (UNLIKELY (ret < 0))
878-
return crun_make_error (err, errno, "error stat'ing file `%s`", description);
890+
if (size_hint)
891+
allocated = size_hint;
892+
else
893+
{
894+
ret = get_file_size (fd, &size);
895+
if (UNLIKELY (ret < 0))
896+
return crun_make_error (err, errno, "error stat'ing file `%s`", description);
897+
898+
allocated = size == 0 ? 1023 : size;
899+
}
879900

880901
/* NUL terminate the buffer. */
881-
allocated = size + 1;
882-
if (size == 0)
883-
allocated = 1023;
884902
buf = xmalloc (allocated + 1);
885903
nread = 0;
886904
while ((size && nread < (size_t) size) || size == 0)
@@ -896,7 +914,14 @@ read_all_fd (int fd, const char *description, char **out, size_t *len, libcrun_e
896914

897915
if (nread == allocated)
898916
{
899-
allocated += 4096;
917+
if (size)
918+
break;
919+
920+
if (pagesize == 0)
921+
pagesize = get_page_size ();
922+
923+
allocated += pagesize;
924+
900925
buf = xrealloc (buf, allocated + 1);
901926
}
902927
}
@@ -1160,15 +1185,14 @@ copy_from_fd_to_fd (int src, int dst, int consume, libcrun_error_t *err)
11601185
{
11611186
int ret;
11621187
ssize_t nread;
1188+
size_t pagesize = get_page_size ();
11631189
do
11641190
{
11651191
cleanup_free char *buffer = NULL;
11661192
ssize_t remaining;
11671193

1168-
#define BUFFER_SIZE 4096
1169-
11701194
#ifdef HAVE_COPY_FILE_RANGE
1171-
nread = copy_file_range (src, NULL, dst, NULL, BUFFER_SIZE, 0);
1195+
nread = copy_file_range (src, NULL, dst, NULL, pagesize, 0);
11721196
if (nread < 0 && (errno == EINVAL || errno == EXDEV))
11731197
goto fallback;
11741198
if (consume && nread < 0 && errno == EAGAIN)
@@ -1182,8 +1206,8 @@ copy_from_fd_to_fd (int src, int dst, int consume, libcrun_error_t *err)
11821206
fallback:
11831207
#endif
11841208

1185-
buffer = xmalloc (BUFFER_SIZE);
1186-
nread = TEMP_FAILURE_RETRY (read (src, buffer, BUFFER_SIZE));
1209+
buffer = xmalloc (pagesize);
1210+
nread = TEMP_FAILURE_RETRY (read (src, buffer, pagesize));
11871211
if (consume && nread < 0 && errno == EAGAIN)
11881212
return 0;
11891213
if (nread < 0 && errno == EIO)

src/libcrun/utils.h

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -295,7 +295,13 @@ int add_selinux_mount_label (char **ret, const char *data, const char *label, co
295295

296296
int set_apparmor_profile (const char *profile, bool now, libcrun_error_t *err);
297297

298-
int read_all_fd (int fd, const char *description, char **out, size_t *len, libcrun_error_t *err);
298+
int read_all_fd_with_size_hint (int fd, const char *description, char **out, size_t *len, size_t hint, libcrun_error_t *err);
299+
300+
static inline int
301+
read_all_fd (int fd, const char *description, char **out, size_t *len, libcrun_error_t *err)
302+
{
303+
return read_all_fd_with_size_hint (fd, description, out, len, 0, err);
304+
}
299305

300306
int read_all_file (const char *path, char **out, size_t *len, libcrun_error_t *err);
301307

0 commit comments

Comments
 (0)