mirror of
https://gitlab.freedesktop.org/NetworkManager/NetworkManager.git
synced 2026-04-17 20:50:40 +02:00
platform: fix handling of fq_codel's memory limit default value
The memory-limit is an unsigned integer. It is ugly (if not wrong) to compare unsigned
values with "-1". When comparing with the default value we must also use an u32 type.
Instead add a define NM_PLATFORM_FQ_CODEL_MEMORY_LIMIT_UNSET.
Note that like iproute2 we treat NM_PLATFORM_FQ_CODEL_MEMORY_LIMIT_UNSET
to indicate to not set TCA_FQ_CODEL_MEMORY_LIMIT in RTM_NEWQDISC. This
special value is entirely internal to NetworkManager (or iproute2) and
kernel will then choose a default memory limit (of 32MB). So setting
NM_PLATFORM_FQ_CODEL_MEMORY_LIMIT_UNSET means to leave it to kernel to
choose a value (which then chooses 32MB).
See kernel's net/sched/sch_fq_codel.c:
static int fq_codel_init(struct Qdisc *sch, struct nlattr *opt,
struct netlink_ext_ack *extack)
{
...
q->memory_limit = 32 << 20; /* 32 MBytes */
static int fq_codel_change(struct Qdisc *sch, struct nlattr *opt,
struct netlink_ext_ack *extack)
...
if (tb[TCA_FQ_CODEL_MEMORY_LIMIT])
q->memory_limit = min(1U << 31, nla_get_u32(tb[TCA_FQ_CODEL_MEMORY_LIMIT]));
Note that not having zero as default value is problematic. In fields like
"NMPlatformIP4Route.table_coerced" and "NMPlatformRoutingRule.suppress_prefixlen_inverse"
we avoid this problem by storing a coerced value in the structure so that zero is still
the default. We don't do that here for memory-limit, so the caller must always explicitly
set the value.
This commit is contained in:
parent
b658e3da08
commit
46a904389b
5 changed files with 19 additions and 4 deletions
|
|
@ -2333,7 +2333,12 @@ static const NMVariantAttributeSpec *const tc_qdisc_fq_codel_spec[] = {
|
|||
NM_VARIANT_ATTRIBUTE_SPEC_DEFINE ("interval", G_VARIANT_TYPE_UINT32, ),
|
||||
NM_VARIANT_ATTRIBUTE_SPEC_DEFINE ("quantum", G_VARIANT_TYPE_UINT32, ),
|
||||
NM_VARIANT_ATTRIBUTE_SPEC_DEFINE ("ce_threshold", G_VARIANT_TYPE_UINT32, ),
|
||||
|
||||
/* kernel clamps the value at 2^31. Possibly such values should be rejected from configuration
|
||||
* as they cannot be configured. Leaving the attribute unspecified causes kernel to choose
|
||||
* a default (currently 32MB). */
|
||||
NM_VARIANT_ATTRIBUTE_SPEC_DEFINE ("memory", G_VARIANT_TYPE_UINT32, ),
|
||||
|
||||
NM_VARIANT_ATTRIBUTE_SPEC_DEFINE ("ecn", G_VARIANT_TYPE_BOOLEAN, .no_value = TRUE, ),
|
||||
NULL,
|
||||
};
|
||||
|
|
|
|||
|
|
@ -6543,7 +6543,7 @@ tc_commit (NMDevice *self)
|
|||
GET_ATTR("interval", qdisc->fq_codel.interval, UINT32, uint32, 0);
|
||||
GET_ATTR("quantum", qdisc->fq_codel.quantum, UINT32, uint32, 0);
|
||||
GET_ATTR("ce_threshold", qdisc->fq_codel.ce_threshold, UINT32, uint32, -1);
|
||||
GET_ATTR("memory", qdisc->fq_codel.memory, UINT32, uint32, -1);
|
||||
GET_ATTR("memory", qdisc->fq_codel.memory, UINT32, uint32, NM_PLATFORM_FQ_CODEL_MEMORY_LIMIT_UNSET);
|
||||
GET_ATTR("ecn", qdisc->fq_codel.ecn, BOOLEAN, boolean, FALSE);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -3515,6 +3515,9 @@ _new_from_nl_qdisc (struct nlmsghdr *nlh, gboolean id_only)
|
|||
obj->qdisc.parent = tcm->tcm_parent;
|
||||
obj->qdisc.info = tcm->tcm_info;
|
||||
|
||||
if (nm_streq0 (obj->qdisc.kind, "fq_codel"))
|
||||
obj->qdisc.fq_codel.memory = NM_PLATFORM_FQ_CODEL_MEMORY_LIMIT_UNSET;
|
||||
|
||||
if (tb[TCA_OPTIONS]) {
|
||||
struct nlattr *options_attr;
|
||||
int remaining;
|
||||
|
|
@ -4241,7 +4244,7 @@ _nl_msg_new_qdisc (int nlmsg_type,
|
|||
NLA_PUT_U32 (msg, TCA_FQ_CODEL_QUANTUM, qdisc->fq_codel.quantum);
|
||||
if (qdisc->fq_codel.ce_threshold != -1)
|
||||
NLA_PUT_U32 (msg, TCA_FQ_CODEL_CE_THRESHOLD, qdisc->fq_codel.ce_threshold);
|
||||
if (qdisc->fq_codel.memory != -1)
|
||||
if (qdisc->fq_codel.memory != NM_PLATFORM_FQ_CODEL_MEMORY_LIMIT_UNSET)
|
||||
NLA_PUT_U32 (msg, TCA_FQ_CODEL_MEMORY_LIMIT, qdisc->fq_codel.memory);
|
||||
if (qdisc->fq_codel.ecn)
|
||||
NLA_PUT_U32 (msg, TCA_FQ_CODEL_ECN, qdisc->fq_codel.ecn);
|
||||
|
|
|
|||
|
|
@ -6455,7 +6455,7 @@ nm_platform_qdisc_to_string (const NMPlatformQdisc *qdisc, char *buf, gsize len)
|
|||
nm_utils_strbuf_append (&buf, &len, " quantum %u", qdisc->fq_codel.quantum);
|
||||
if (qdisc->fq_codel.ce_threshold != -1)
|
||||
nm_utils_strbuf_append (&buf, &len, " ce_threshold %u", qdisc->fq_codel.ce_threshold);
|
||||
if (qdisc->fq_codel.memory != -1)
|
||||
if (qdisc->fq_codel.memory != NM_PLATFORM_FQ_CODEL_MEMORY_LIMIT_UNSET)
|
||||
nm_utils_strbuf_append (&buf, &len, " memory %u", qdisc->fq_codel.memory);
|
||||
if (qdisc->fq_codel.ecn)
|
||||
nm_utils_strbuf_append (&buf, &len, " ecn");
|
||||
|
|
|
|||
|
|
@ -596,6 +596,8 @@ typedef struct {
|
|||
bool uid_range_has:1; /* has(FRA_UID_RANGE) */
|
||||
} NMPlatformRoutingRule;
|
||||
|
||||
#define NM_PLATFORM_FQ_CODEL_MEMORY_LIMIT_UNSET (~((guint32) 0))
|
||||
|
||||
typedef struct {
|
||||
guint32 limit;
|
||||
guint32 flows;
|
||||
|
|
@ -603,7 +605,12 @@ typedef struct {
|
|||
guint32 interval;
|
||||
guint32 quantum;
|
||||
guint32 ce_threshold;
|
||||
guint32 memory;
|
||||
guint32 memory; /* TCA_FQ_CODEL_MEMORY_LIMIT: note that only values <= 2^31 are accepted by kernel
|
||||
* and kernel defaults to 32MB.
|
||||
* Note that we use the special value NM_PLATFORM_FQ_CODEL_MEMORY_LIMIT_UNSET
|
||||
* to indicate that no explicit limit is set (when we send a RTM_NEWQDISC request).
|
||||
* This will cause kernel to choose the default (32MB).
|
||||
* Beware: zero is not the default you must always explicitly set this value. */
|
||||
bool ecn:1;
|
||||
} NMPlatformQdiscFqCodel;
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue