Skip to content

Commit 5245150

Browse files
kmaincentkuba-moo
authored andcommitted
Revert "ethtool: Fix mod state of verbose no_mask bitset"
This reverts commit 108a36d. It was reported that this fix breaks the possibility to remove existing WoL flags. For example: ~$ ethtool lan2 ... Supports Wake-on: pg Wake-on: d ... ~$ ethtool -s lan2 wol gp ~$ ethtool lan2 ... Wake-on: pg ... ~$ ethtool -s lan2 wol d ~$ ethtool lan2 ... Wake-on: pg ... This worked correctly before this commit because we were always updating a zero bitmap (since commit 6699170 ("ethtool: fix application of verbose no_mask bitset"), that is) so that the rest was left zero naturally. But now the 1->0 change (old_val is true, bit not present in netlink nest) no longer works. Reported-by: Oleksij Rempel <o.rempel@pengutronix.de> Reported-by: Michal Kubecek <mkubecek@suse.cz> Closes: https://lore.kernel.org/netdev/20231019095140.l6fffnszraeb6iiw@lion.mk-sys.cz/ Cc: stable@vger.kernel.org Fixes: 108a36d ("ethtool: Fix mod state of verbose no_mask bitset") Signed-off-by: Kory Maincent <kory.maincent@bootlin.com> Reviewed-by: Michal Kubecek <mkubecek@suse.cz> Link: https://lore.kernel.org/r/20231019-feature_ptp_bitset_fix-v1-1-70f3c429a221@bootlin.com Signed-off-by: Jakub Kicinski <kuba@kernel.org>
1 parent 1c1f14f commit 5245150

File tree

1 file changed

+6
-26
lines changed

1 file changed

+6
-26
lines changed

net/ethtool/bitset.c

Lines changed: 6 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -431,10 +431,8 @@ ethnl_update_bitset32_verbose(u32 *bitmap, unsigned int nbits,
431431
ethnl_string_array_t names,
432432
struct netlink_ext_ack *extack, bool *mod)
433433
{
434-
u32 *orig_bitmap, *saved_bitmap = NULL;
435434
struct nlattr *bit_attr;
436435
bool no_mask;
437-
bool dummy;
438436
int rem;
439437
int ret;
440438

@@ -450,22 +448,8 @@ ethnl_update_bitset32_verbose(u32 *bitmap, unsigned int nbits,
450448
}
451449

452450
no_mask = tb[ETHTOOL_A_BITSET_NOMASK];
453-
if (no_mask) {
454-
unsigned int nwords = DIV_ROUND_UP(nbits, 32);
455-
unsigned int nbytes = nwords * sizeof(u32);
456-
457-
/* The bitmap size is only the size of the map part without
458-
* its mask part.
459-
*/
460-
saved_bitmap = kcalloc(nwords, sizeof(u32), GFP_KERNEL);
461-
if (!saved_bitmap)
462-
return -ENOMEM;
463-
memcpy(saved_bitmap, bitmap, nbytes);
464-
ethnl_bitmap32_clear(bitmap, 0, nbits, &dummy);
465-
orig_bitmap = saved_bitmap;
466-
} else {
467-
orig_bitmap = bitmap;
468-
}
451+
if (no_mask)
452+
ethnl_bitmap32_clear(bitmap, 0, nbits, mod);
469453

470454
nla_for_each_nested(bit_attr, tb[ETHTOOL_A_BITSET_BITS], rem) {
471455
bool old_val, new_val;
@@ -474,14 +458,13 @@ ethnl_update_bitset32_verbose(u32 *bitmap, unsigned int nbits,
474458
if (nla_type(bit_attr) != ETHTOOL_A_BITSET_BITS_BIT) {
475459
NL_SET_ERR_MSG_ATTR(extack, bit_attr,
476460
"only ETHTOOL_A_BITSET_BITS_BIT allowed in ETHTOOL_A_BITSET_BITS");
477-
ret = -EINVAL;
478-
goto out;
461+
return -EINVAL;
479462
}
480463
ret = ethnl_parse_bit(&idx, &new_val, nbits, bit_attr, no_mask,
481464
names, extack);
482465
if (ret < 0)
483-
goto out;
484-
old_val = orig_bitmap[idx / 32] & ((u32)1 << (idx % 32));
466+
return ret;
467+
old_val = bitmap[idx / 32] & ((u32)1 << (idx % 32));
485468
if (new_val != old_val) {
486469
if (new_val)
487470
bitmap[idx / 32] |= ((u32)1 << (idx % 32));
@@ -491,10 +474,7 @@ ethnl_update_bitset32_verbose(u32 *bitmap, unsigned int nbits,
491474
}
492475
}
493476

494-
ret = 0;
495-
out:
496-
kfree(saved_bitmap);
497-
return ret;
477+
return 0;
498478
}
499479

500480
static int ethnl_compact_sanity_checks(unsigned int nbits,

0 commit comments

Comments
 (0)