housekeeping
static DEVICE_ATTR_RO(housekeeping);
container_of(work, struct zd_mac, housekeeping.link_led_work.work);
queue_delayed_work(zd_workqueue, &mac->housekeeping.link_led_work,
INIT_DELAYED_WORK(&mac->housekeeping.link_led_work, link_led_handler);
queue_delayed_work(zd_workqueue, &mac->housekeeping.link_led_work,
cancel_delayed_work_sync(&mac->housekeeping.link_led_work);
struct housekeeping housekeeping;
if (housekeeping.flags & BIT(type))
READ_ONCE(housekeeping.flags) & BIT(type))
if (!housekeeping.flags)
if (housekeeping.flags & HK_FLAG_DOMAIN)
WRITE_ONCE(housekeeping.flags, housekeeping.flags | HK_FLAG_DOMAIN);
rcu_assign_pointer(housekeeping.cpumasks[HK_TYPE_DOMAIN], trial);
if (!housekeeping.flags)
if (housekeeping.flags & HK_FLAG_KERNEL_NOISE)
for_each_set_bit(type, &housekeeping.flags, HK_TYPE_MAX) {
omask = rcu_dereference(housekeeping.cpumasks[type]);
RCU_INIT_POINTER(housekeeping.cpumasks[type], nmask);
RCU_INIT_POINTER(housekeeping.cpumasks[type], mask);
if ((flags & HK_FLAG_KERNEL_NOISE) && !(housekeeping.flags & HK_FLAG_KERNEL_NOISE)) {
if (!housekeeping.flags) {
if (!housekeeping.flags) {
unsigned long iter_flags = flags & housekeeping.flags;
iter_flags = housekeeping.flags & (HK_FLAG_KERNEL_NOISE | HK_FLAG_DOMAIN);
iter_flags = flags & ~housekeeping.flags;
static struct housekeeping housekeeping;
if ((flags & HK_FLAG_KERNEL_NOISE) && !(housekeeping.flags & HK_FLAG_KERNEL_NOISE))
housekeeping.flags |= flags;
return !!(READ_ONCE(housekeeping.flags) & BIT(type));
return rcu_dereference_all_check(housekeeping.cpumasks[type],
if (READ_ONCE(housekeeping.flags) & BIT(type))
if (housekeeping.flags & BIT(type)) {