atomic_set(&dev->first_bootup, true);
时间: 2023-05-20 22:06:52 浏览: 58
)这是一个 Linux 内核中的原子操作函数,用于设置一个整数变量的值。它的函数原型为:
void atomic_set(atomic_t *v, int i);
其中,v 是一个 atomic_t 类型的指针,i 是要设置的整数值。这个函数会以原子方式设置变量的值,保证在多线程环境下不会出现竞争条件。
相关问题
static u64 extend_obj_stats(struct zram *zram, u16 gid, int type) { if (!CHECK(zram->zgrp, "zram extend is not enable!\n")) return 0; if (!CHECK_BOUND(gid, 0, zram->zgrp->nr_grp - 1)) return 0; if (type == CACHE_SIZE) return atomic64_read(&zram->zgrp->stats[gid].zram_size); else if (type == CACHE_PAGE) return atomic_read(&zram->zgrp->stats[gid].zram_pages); else if (type == CACHE_FAULT) return atomic64_read(&zram->zgrp->stats[gid].zram_fault); #ifdef CONFIG_ZRAM_EXTEND_WRITEBACK else if (type == SWAP_SIZE) return atomic64_read(&zram->zgrp->stats[gid].wb_size); else if (type == SWAP_PAGE) return atomic_read(&zram->zgrp->stats[gid].wb_pages); else if (type == READ_SIZE) return atomic64_read(&zram->zgrp->stats[gid].read_size); else if (type == WRITE_SIZE) return atomic64_read(&zram->zgrp->stats[gid].write_size); else if (type == SWAP_FAULT) return atomic64_read(&zram->zgrp->stats[gid].wb_fault); BUG(); #endif return 0; } 这个函数做一下流程优化
可以做如下的流程优化:
```c
static u64 extend_obj_stats(struct zram *zram, u16 gid, int type) {
if (!CHECK(zram->zgrp, "zram extend is not enable!\n"))
return 0;
if (!CHECK_BOUND(gid, 0, zram->zgrp->nr_grp - 1))
return 0;
switch (type) {
case CACHE_SIZE:
return atomic64_read(&zram->zgrp->stats[gid].zram_size);
case CACHE_PAGE:
return atomic_read(&zram->zgrp->stats[gid].zram_pages);
case CACHE_FAULT:
return atomic64_read(&zram->zgrp->stats[gid].zram_fault);
#ifdef CONFIG_ZRAM_EXTEND_WRITEBACK
case SWAP_SIZE:
return atomic64_read(&zram->zgrp->stats[gid].wb_size);
case SWAP_PAGE:
return atomic_read(&zram->zgrp->stats[gid].wb_pages);
case READ_SIZE:
return atomic64_read(&zram->zgrp->stats[gid].read_size);
case WRITE_SIZE:
return atomic64_read(&zram->zgrp->stats[gid].write_size);
case SWAP_FAULT:
return atomic64_read(&zram->zgrp->stats[gid].wb_fault);
#endif
default:
break;
}
BUG();
return 0;
}
```
这里使用 `switch-case` 替换了原来的 `if-else` 结构,使代码更加简洁易读。同时,由于 `BUG()` 表示代码中存在错误,因此可以将其放在 `default` 分支中,避免出现无法预料的错误。
atomic_notifier_call_chain和psy_changed(&pd->psy_nb, PSY_EVENT_PROP_CHANGED, pd->usb_psy);已经定义好,怎么在其他驱动文件调用psy_changed
如果你已经在一个驱动文件中定义了 `atomic_notifier_call_chain` 和 `psy_changed` 函数,并且想要在其他驱动文件中调用 `psy_changed` 函数,可以按照以下步骤进行操作:
1. 在需要调用 `psy_changed` 函数的驱动文件中,包含定义了 `psy_changed` 函数的头文件。
```c
#include "path/to/psy_changed.h"
```
2. 在需要调用 `psy_changed` 函数的地方,调用函数并传递需要的参数。
```c
struct power_supply *psy = ...; // 设置需要传递的参数
psy_changed(&pd->psy_nb, PSY_EVENT_PROP_CHANGED, psy);
```
这样,在其他驱动文件中就可以调用 `psy_changed` 函数了。需要注意的是,如果 `psy_changed` 函数中依赖于其他函数或全局变量,也需要在当前驱动文件中包含相应的头文件或定义相应的变量。
另外,`atomic_notifier_call_chain` 函数是一个通用的函数,可以在任何驱动文件中使用,用于回调注册的通知链。如果你需要在其他驱动文件中回调通知链,可以使用类似以下的代码:
```c
struct notifier_block *nb = ...; // 设置需要回调的通知链
atomic_notifier_call_chain(¬ification_chain, event, data);
```
其中 `notification_chain` 是一个 `notifier_block` 类型的链表,存储了多个需要回调的通知链。`event` 和 `data` 分别是通知链回调函数的参数。