mirror of
https://git.haproxy.org/git/haproxy.git/
synced 2025-08-07 07:37:02 +02:00
MINOR: thread: keep a bitmask of enabled groups in thread_set
We're only checking for 0, 1, or >1 groups enabled there, and we'll soon need to be more precise and know quickly which groups are non-empty. Let's just replace the count with a mask of enabled groups. This will allow to quickly spot the presence of any such group in a set.
This commit is contained in:
parent
3f210970bf
commit
97da942ba6
@ -40,7 +40,7 @@ struct thread_set {
|
|||||||
ulong abs[(MAX_THREADS + LONGBITS - 1) / LONGBITS];
|
ulong abs[(MAX_THREADS + LONGBITS - 1) / LONGBITS];
|
||||||
ulong rel[MAX_TGROUPS];
|
ulong rel[MAX_TGROUPS];
|
||||||
};
|
};
|
||||||
uint nbgrp; /* number of non-empty groups in this set, 0 for abs */
|
ulong grps; /* bit field of all non-empty groups, 0 for abs */
|
||||||
};
|
};
|
||||||
|
|
||||||
/* tasklet classes */
|
/* tasklet classes */
|
||||||
|
@ -77,7 +77,7 @@ static inline int thread_set_nth_group(const struct thread_set *ts, int n)
|
|||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
if (ts->nbgrp) {
|
if (ts->grps) {
|
||||||
for (i = 0; i < MAX_TGROUPS; i++)
|
for (i = 0; i < MAX_TGROUPS; i++)
|
||||||
if (ts->rel[i] && !n--)
|
if (ts->rel[i] && !n--)
|
||||||
return i + 1;
|
return i + 1;
|
||||||
@ -95,7 +95,7 @@ static inline ulong thread_set_nth_tmask(const struct thread_set *ts, int n)
|
|||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
if (ts->nbgrp) {
|
if (ts->grps) {
|
||||||
for (i = 0; i < MAX_TGROUPS; i++)
|
for (i = 0; i < MAX_TGROUPS; i++)
|
||||||
if (ts->rel[i] && !n--)
|
if (ts->rel[i] && !n--)
|
||||||
return ts->rel[i];
|
return ts->rel[i];
|
||||||
@ -111,7 +111,7 @@ static inline void thread_set_pin_grp1(struct thread_set *ts, ulong mask)
|
|||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
ts->nbgrp = 1;
|
ts->grps = 1;
|
||||||
ts->rel[0] = mask;
|
ts->rel[0] = mask;
|
||||||
for (i = 1; i < MAX_TGROUPS; i++)
|
for (i = 1; i < MAX_TGROUPS; i++)
|
||||||
ts->rel[i] = 0;
|
ts->rel[i] = 0;
|
||||||
|
@ -2998,18 +2998,16 @@ int check_config_validity()
|
|||||||
bit = (bind_conf->thread_set.rel[grp] & ~mask) & -(bind_conf->thread_set.rel[grp] & ~mask);
|
bit = (bind_conf->thread_set.rel[grp] & ~mask) & -(bind_conf->thread_set.rel[grp] & ~mask);
|
||||||
new_ts.rel[grp] |= bit;
|
new_ts.rel[grp] |= bit;
|
||||||
mask |= bit;
|
mask |= bit;
|
||||||
|
new_ts.grps |= 1UL << grp;
|
||||||
if (!atleast2(new_ts.rel[grp])) // first time we add a bit: new group
|
|
||||||
new_ts.nbgrp++;
|
|
||||||
|
|
||||||
done += shards;
|
done += shards;
|
||||||
};
|
};
|
||||||
|
|
||||||
BUG_ON(!new_ts.nbgrp); // no more bits left unassigned
|
BUG_ON(!new_ts.grps); // no more bits left unassigned
|
||||||
|
|
||||||
if (new_ts.nbgrp > 1) {
|
if (atleast2(new_ts.grps)) {
|
||||||
ha_alert("Proxy '%s': shard number %d spans %d groups in 'bind %s' at [%s:%d]\n",
|
ha_alert("Proxy '%s': shard number %d spans %d groups in 'bind %s' at [%s:%d]\n",
|
||||||
curproxy->id, shard, new_ts.nbgrp, bind_conf->arg, bind_conf->file, bind_conf->line);
|
curproxy->id, shard, my_popcountl(new_ts.grps), bind_conf->arg, bind_conf->file, bind_conf->line);
|
||||||
cfgerr++;
|
cfgerr++;
|
||||||
err_code |= ERR_FATAL | ERR_ALERT;
|
err_code |= ERR_FATAL | ERR_ALERT;
|
||||||
goto out;
|
goto out;
|
||||||
@ -4450,7 +4448,7 @@ int check_config_validity()
|
|||||||
free(err);
|
free(err);
|
||||||
cfgerr++;
|
cfgerr++;
|
||||||
}
|
}
|
||||||
else if (bind_conf->thread_set.nbgrp > 1) {
|
else if (atleast2(bind_conf->thread_set.grps)) {
|
||||||
ha_alert("Peers section '%s': 'thread' spans more than one group in 'bind %s' at [%s:%d].\n",
|
ha_alert("Peers section '%s': 'thread' spans more than one group in 'bind %s' at [%s:%d].\n",
|
||||||
curpeers->peers_fe->id, bind_conf->arg, bind_conf->file, bind_conf->line);
|
curpeers->peers_fe->id, bind_conf->arg, bind_conf->file, bind_conf->line);
|
||||||
cfgerr++;
|
cfgerr++;
|
||||||
|
15
src/thread.c
15
src/thread.c
@ -1240,7 +1240,7 @@ int thread_resolve_group_mask(struct thread_set *ts, int defgrp, char **err)
|
|||||||
ulong mask, imask;
|
ulong mask, imask;
|
||||||
uint g;
|
uint g;
|
||||||
|
|
||||||
if (!ts->nbgrp) {
|
if (!ts->grps) {
|
||||||
/* unspecified group, IDs are global */
|
/* unspecified group, IDs are global */
|
||||||
if (thread_set_is_empty(ts)) {
|
if (thread_set_is_empty(ts)) {
|
||||||
/* all threads of all groups, unless defgrp is set and
|
/* all threads of all groups, unless defgrp is set and
|
||||||
@ -1248,7 +1248,8 @@ int thread_resolve_group_mask(struct thread_set *ts, int defgrp, char **err)
|
|||||||
*/
|
*/
|
||||||
for (g = defgrp ? defgrp-1 : 0; g < (defgrp ? defgrp : global.nbtgroups); g++) {
|
for (g = defgrp ? defgrp-1 : 0; g < (defgrp ? defgrp : global.nbtgroups); g++) {
|
||||||
new_ts.rel[g] = ha_tgroup_info[g].threads_enabled;
|
new_ts.rel[g] = ha_tgroup_info[g].threads_enabled;
|
||||||
new_ts.nbgrp++;
|
if (new_ts.rel[g])
|
||||||
|
new_ts.grps |= 1UL << g;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
/* some absolute threads are set, we must remap them to
|
/* some absolute threads are set, we must remap them to
|
||||||
@ -1271,9 +1272,9 @@ int thread_resolve_group_mask(struct thread_set *ts, int defgrp, char **err)
|
|||||||
/* now the mask exactly matches the threads to be enabled
|
/* now the mask exactly matches the threads to be enabled
|
||||||
* in this group.
|
* in this group.
|
||||||
*/
|
*/
|
||||||
if (!new_ts.rel[g] && mask)
|
|
||||||
new_ts.nbgrp++;
|
|
||||||
new_ts.rel[g] |= mask;
|
new_ts.rel[g] |= mask;
|
||||||
|
if (new_ts.rel[g])
|
||||||
|
new_ts.grps |= 1UL << g;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
@ -1310,7 +1311,8 @@ int thread_resolve_group_mask(struct thread_set *ts, int defgrp, char **err)
|
|||||||
}
|
}
|
||||||
|
|
||||||
new_ts.rel[g] = imask & mask;
|
new_ts.rel[g] = imask & mask;
|
||||||
new_ts.nbgrp++;
|
if (new_ts.rel[g])
|
||||||
|
new_ts.grps |= 1UL << g;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1521,8 +1523,7 @@ int parse_thread_set(const char *arg, struct thread_set *ts, char **err)
|
|||||||
if (ts) {
|
if (ts) {
|
||||||
if (is_rel) {
|
if (is_rel) {
|
||||||
/* group-relative thread numbers */
|
/* group-relative thread numbers */
|
||||||
if (!ts->rel[tg - 1])
|
ts->grps |= 1UL << (tg - 1);
|
||||||
ts->nbgrp++;
|
|
||||||
|
|
||||||
if (max >= min) {
|
if (max >= min) {
|
||||||
for (v = min; v <= max; v++)
|
for (v = min; v <= max; v++)
|
||||||
|
Loading…
Reference in New Issue
Block a user