shared: add nm_utils_getpagesize() and use it in netlink code
Since we already cached the result of getpagesize() in a static variable (at two places), move the code to nm-shared-utils, so it is reusable. Also, use sysconf() instead of getpagesize(), like suggested by `man getpagesize`.
This commit is contained in:
@@ -2285,3 +2285,35 @@ nm_utils_invoke_on_idle (NMUtilsInvokeOnIdleCallback callback,
|
|||||||
data->cancelled_id = 0;
|
data->cancelled_id = 0;
|
||||||
data->idle_id = g_idle_add (_nm_utils_invoke_on_idle_cb_idle, data);
|
data->idle_id = g_idle_add (_nm_utils_invoke_on_idle_cb_idle, data);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*****************************************************************************/
|
||||||
|
|
||||||
|
int
|
||||||
|
nm_utils_getpagesize (void)
|
||||||
|
{
|
||||||
|
static volatile int val = 0;
|
||||||
|
long l;
|
||||||
|
int v;
|
||||||
|
|
||||||
|
v = g_atomic_int_get (&val);
|
||||||
|
|
||||||
|
if (G_UNLIKELY (v == 0)) {
|
||||||
|
l = sysconf (_SC_PAGESIZE);
|
||||||
|
|
||||||
|
g_return_val_if_fail (l > 0 && l < G_MAXINT, 4*1024);
|
||||||
|
|
||||||
|
v = (int) l;
|
||||||
|
if (!g_atomic_int_compare_and_exchange (&val, 0, v)) {
|
||||||
|
v = g_atomic_int_get (&val);
|
||||||
|
g_return_val_if_fail (v > 0, 4*1024);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
nm_assert (v > 0);
|
||||||
|
#if NM_MORE_ASSERTS > 5
|
||||||
|
nm_assert (v == getpagesize ());
|
||||||
|
nm_assert (v == sysconf (_SC_PAGESIZE));
|
||||||
|
#endif
|
||||||
|
|
||||||
|
return v;
|
||||||
|
}
|
||||||
|
@@ -1086,4 +1086,8 @@ nm_strv_ptrarray_take_gstring (GPtrArray *cmd,
|
|||||||
FALSE));
|
FALSE));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*****************************************************************************/
|
||||||
|
|
||||||
|
int nm_utils_getpagesize (void);
|
||||||
|
|
||||||
#endif /* __NM_SHARED_UTILS_H__ */
|
#endif /* __NM_SHARED_UTILS_H__ */
|
||||||
|
@@ -255,20 +255,6 @@ nla_reserve (struct nl_msg *msg, int attrtype, int attrlen)
|
|||||||
|
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
|
|
||||||
static int
|
|
||||||
get_default_page_size (void)
|
|
||||||
{
|
|
||||||
static int val = 0;
|
|
||||||
int v;
|
|
||||||
|
|
||||||
if (G_UNLIKELY (val == 0)) {
|
|
||||||
v = getpagesize ();
|
|
||||||
g_assert (v > 0);
|
|
||||||
val = v;
|
|
||||||
}
|
|
||||||
return val;
|
|
||||||
}
|
|
||||||
|
|
||||||
struct nl_msg *
|
struct nl_msg *
|
||||||
nlmsg_alloc_size (size_t len)
|
nlmsg_alloc_size (size_t len)
|
||||||
{
|
{
|
||||||
@@ -298,7 +284,7 @@ nlmsg_alloc_size (size_t len)
|
|||||||
struct nl_msg *
|
struct nl_msg *
|
||||||
nlmsg_alloc (void)
|
nlmsg_alloc (void)
|
||||||
{
|
{
|
||||||
return nlmsg_alloc_size (get_default_page_size ());
|
return nlmsg_alloc_size (nm_utils_getpagesize ());
|
||||||
}
|
}
|
||||||
|
|
||||||
struct nl_msg *
|
struct nl_msg *
|
||||||
@@ -1334,7 +1320,6 @@ nl_recv (struct nl_sock *sk, struct sockaddr_nl *nla,
|
|||||||
{
|
{
|
||||||
ssize_t n;
|
ssize_t n;
|
||||||
int flags = 0;
|
int flags = 0;
|
||||||
static int page_size = 0;
|
|
||||||
struct iovec iov;
|
struct iovec iov;
|
||||||
struct msghdr msg = {
|
struct msghdr msg = {
|
||||||
.msg_name = (void *) nla,
|
.msg_name = (void *) nla,
|
||||||
@@ -1354,10 +1339,8 @@ nl_recv (struct nl_sock *sk, struct sockaddr_nl *nla,
|
|||||||
&& sk->s_bufsize == 0))
|
&& sk->s_bufsize == 0))
|
||||||
flags |= MSG_PEEK | MSG_TRUNC;
|
flags |= MSG_PEEK | MSG_TRUNC;
|
||||||
|
|
||||||
if (page_size == 0)
|
iov.iov_len = sk->s_bufsize
|
||||||
page_size = getpagesize () * 4;
|
?: (((size_t) nm_utils_getpagesize ()) * 4u);
|
||||||
|
|
||||||
iov.iov_len = sk->s_bufsize ?: page_size;
|
|
||||||
iov.iov_base = g_malloc (iov.iov_len);
|
iov.iov_base = g_malloc (iov.iov_len);
|
||||||
|
|
||||||
if ( creds
|
if ( creds
|
||||||
|
Reference in New Issue
Block a user