Documentation/translations/zh_CN/core-api/errseq.rst

Source file repositories/reference/linux-study-clean/Documentation/translations/zh_CN/core-api/errseq.rst

File Facts

System
Linux kernel
Corpus path
Documentation/translations/zh_CN/core-api/errseq.rst
Extension
.rst
Size
6270 bytes
Lines
146
Domain
Support Tooling And Documentation
Bucket
Documentation
Inferred role
Support Tooling And Documentation: documentation
Status
atlas-only

Why This File Exists

Repository support layer: documentation, build tooling, samples, user-space helper tools, generated initramfs support, licenses, and validation utilities.

Dependency Surface

Detected Declarations

Annotated Snippet

struct worker_drone {
                errseq_t        wd_err; /* 用来记录错误 */
        };

每天, ``worker_drone`` 都是以一张白纸开始的::

        struct worker_drone wd;

        wd.wd_err = (errseq_t)0;

主管们进来后对当天的工作进行初步了解。他们并不关心在他们观察开始之前发生的任何事
情::

        struct supervisor {
                errseq_t        s_wd_err; /* wd_err的私有“游标” */
                spinlock_t      s_wd_err_lock; /* 保护s_wd_err */
        }

        struct supervisor       su;

        su.s_wd_err = errseq_sample(&wd.wd_err);
        spin_lock_init(&su.s_wd_err_lock);

现在他们开始给他布置任务。每隔几分钟,他们就要求他完成迄今为止交给他的所有工作。
然后问他是否有犯任何错误::

        spin_lock(&su.su_wd_err_lock);
        err = errseq_check_and_advance(&wd.wd_err, &su.s_wd_err);
        spin_unlock(&su.su_wd_err_lock);

到目前为止,它只是不断返回0。

现在,这家公司的老板非常吝啬,给了他不合格的设备来完成他的工作。偶尔设备会出现故
障,导致他犯错。他重重地叹了一口气,并把它记录下来::

        errseq_set(&wd.wd_err, -EIO);

...然后继续工作。主管们最终会再次检查,他们在下次检查时都会发现这个错误。后续的调
用将返回0,直到记录下另一个错误,此时将向每个调用报告一次。

请注意,主管们无法知道他们犯了多少错误,只能知道自上次检查以来是否犯了一个错误,
以及记录的最新值。

偶尔,大老板会来抽查,要求员工为他做一次性的工作。他并不像主管们那样全职观察员工,
但他确实需要知道在他的工作处理过程中是否发生了错误。

他只需对员工当前的errseq_t进行采样,然后用它来判断后来是否发生了错误::

        errseq_t since = errseq_sample(&wd.wd_err);
        /* 提交一些工作,等待完成 */
        err = errseq_check(&wd.wd_err, since);

由于他只是要在那个点之后丢弃 ``since`` ,所以他不需要在这里推进它。同时他也不需要
任何锁,因为它不能被其他人使用。

序列化更新errseq_t游标
======================

请注意,errseq_t API在check_and_advance_operation期间不保护errseq_t游标。只有典型
的错误代码是被原子化处理的。在多任务同时使用同一个errseq_t游标的情况下,对该游标
的更新进行序列化是很重要的。

如果不这样做,那么游标就有可能向后移动。在这种情况下,同一个错误可能被报告多次。

因此,通常先执行errseq_check检查是否有任何变化,然后在获取锁后才执行
errseq_check_and_advance。例如::

        if (errseq_check(&wd.wd_err, READ_ONCE(su.s_wd_err)) {
                /* su.s_wd_err被s_wd_err_lock保护 */
                spin_lock(&su.s_wd_err_lock);

Annotation

Implementation Notes