>-----Original Message----- >From: David Ahern <dsah...@gmail.com> >Sent: Wednesday, January 27, 2021 6:33 >To: Ido Schimmel <ido...@idosch.org>; netdev@vger.kernel.org >Cc: da...@davemloft.net; k...@kernel.org; Amit Cohen <amco...@nvidia.com>; >Roopa Prabhu <ro...@nvidia.com>; Donald >Sharp <sha...@nvidia.com>; Benjamin Poirier <bpoir...@nvidia.com>; mlxsw ><ml...@nvidia.com>; Ido Schimmel ><ido...@nvidia.com> >Subject: Re: [PATCH net-next 01/10] netdevsim: fib: Convert the current >occupancy to an atomic variable > >On 1/26/21 6:23 AM, Ido Schimmel wrote: >> @@ -889,22 +882,29 @@ static void nsim_nexthop_destroy(struct >> nsim_nexthop *nexthop) static int nsim_nexthop_account(struct nsim_fib_data >> *data, u64 occ, >> bool add, struct netlink_ext_ack *extack) { >> - int err = 0; >> + int i, err = 0; >> >> if (add) { >> - if (data->nexthops.num + occ <= data->nexthops.max) { >> - data->nexthops.num += occ; >> - } else { >> - err = -ENOSPC; >> - NL_SET_ERR_MSG_MOD(extack, "Exceeded number of >> supported nexthops"); >> - } >> + for (i = 0; i < occ; i++) >> + if (!atomic64_add_unless(&data->nexthops.num, 1, >> + data->nexthops.max)) { > >seems like this can be > if (!atomic64_add_unless(&data->nexthops.num, occ, > data->nexthops.max)) {
atomic64_add_unless(x, y, z) adds y to x if x was not already z. Which means that when for example num=2, occ=2, max=3: atomic64_add_unless(&data->nexthops.num, occ, data->nexthops.max) won't fail when it should. This situation is realistic and actually with atomic64_add_unless() selftests/drivers/net/netdevsim/nexthop.sh fails. > >and then the err_num_decrease is not needed > >> + err = -ENOSPC; >> + NL_SET_ERR_MSG_MOD(extack, "Exceeded number of >> supported nexthops"); >> + goto err_num_decrease; >> + } >> } else { >> - if (WARN_ON(occ > data->nexthops.num)) >> + if (WARN_ON(occ > atomic64_read(&data->nexthops.num))) >> return -EINVAL; >> - data->nexthops.num -= occ; >> + atomic64_sub(occ, &data->nexthops.num); >> } >> >> return err; >> + >> +err_num_decrease: >> + for (i--; i >= 0; i--) >> + atomic64_dec(&data->nexthops.num); > >and if this path is really needed, why not atomic64_sub here? > >> + return err; >> + >> } >> >> static int nsim_nexthop_add(struct nsim_fib_data *data, >>