.. SPDX-License-Identifier: GPL-2.0+ .. include:: ../disclaimer-zh_CN.rst :Original: Documentation/core-api/idr.rst :翻译: 周彬彬 Binbin Zhou <zhoubinbin@loongson.cn> :ć ˇčŻ‘: 司延腾 Yanteng Si <siyanteng@loongson.cn> ĺ´ćłć Wu Xiangcheng <bobwxc@email.cn> 时奎亮 Alex Shi <alexs@kernel.org> ====== IDĺ†é…Ť ====== :作者: Matthew Wilcox 概述 ==== č¦č§Łĺ†łçš„一个常č§é—®é˘ćŻĺ†é…Ťć ‡čŻ†ç¬¦ďĽIDs);ĺ®é€šĺ¸¸ćŻć ‡čŻ†äş‹ç‰©çš„ć•°ĺ—。比如包括文件描述 符ă€čż›ç¨‹IDă€ç˝‘络协议ä¸çš„ć•°ćŤ®ĺŚ…ć ‡čŻ†ç¬¦ă€SCSIć ‡č®°ĺ’Śč®ľĺ¤‡ĺ®žäľ‹çĽ–ĺŹ·ă€‚IDRĺ’ŚIDAä¸şčż™ä¸Şé—®é˘ ćŹäľ›äş†ä¸€ä¸Şĺç†çš„解决方ćˇďĽŚä»Ąéżĺ…ŤćŻŹä¸Şäşşé˝č‡Şĺ›ă€‚IDRćŹäľ›ĺ°†IDć ĺ°„ĺ°ćڇé’çš„č˝ĺŠ›ďĽŚč€ŚIDA ä»…ćŹäľ›IDĺ†é…ŤďĽŚĺ› ć¤ĺ†…ĺć•率更é«ă€‚ IDR接口已经被废ĺĽďĽŚčŻ·ä˝żç”¨ ``XArray`` 。 IDR的用法 ========= 首ĺ…ĺťĺ§‹ĺŚ–ä¸€ä¸ŞIDR,对于静ć€ĺ†é…Ťçš„IDR使用DEFINE_IDR(),ć–者对于动ć€ĺ†é…Ťçš„IDR使用 idr_init()。 您可以č°ç”¨idr_alloc()来ĺ†é…Ťä¸€ä¸ŞćśŞä˝żç”¨çš„ID。通过č°ç”¨idr_find()查询与该ID相关的指é’, 并通过č°ç”¨idr_remove()释放该ID。 如果需č¦ć›´ć”ąä¸Žä¸€ä¸ŞID相关č”的指é’,可以č°ç”¨idr_replace()ă€‚čż™ć ·ĺšçš„一个常č§ĺŽźĺ› ćŻé€š 过将 ``NULL`` 指é’äĽ é€’ç»™ĺ†é…Ťĺ‡˝ć•°ćťĄäżťç•™ID;用保留的IDĺťĺ§‹ĺŚ–ĺŻąč±ˇďĽŚćś€ĺŽĺ°†ĺťĺ§‹ĺŚ–çš„ĺŻą 象插入IDR。 一些用ć·éś€č¦ĺ†é…Ťĺ¤§äşŽ ``INT_MAX`` çš„ID。ĺ°ç›®ĺ‰Ťä¸şć˘ďĽŚć‰€ćś‰čż™äş›ç”¨ć·é˝ć»ˇč¶ł ``UINT_MAX`` çš„é™ĺ¶ďĽŚä»–们使用idr_alloc_u32()。如果您需č¦č¶…出u32çš„ID,ć‘们将与您ĺ作以满足您的 需求。 如果需č¦ćŚ‰éˇşĺşŹĺ†é…ŤID,可以使用idr_alloc_cyclic()。处ç†čľĺ¤§ć•°é‡Źçš„ID时,IDRçš„ć•率会 降低,所以使用这个函数会有一点代价。 č¦ĺŻąIDR使用的所有指é’进行操作,您可以使用基于回č°çš„idr_for_each()ć–čżä»Łĺ™¨ć ·ĺĽŹçš„ idr_for_each_entry()。您可č˝éś€č¦ä˝żç”¨idr_for_each_entry_continue()来继ç»čżä»Łă€‚如果 čżä»Łĺ™¨ä¸Ťç¬¦ĺ您的需求,您也可以使用idr_get_next()。 当使用完IDRĺŽďĽŚć‚¨ĺŹŻä»Ąč°ç”¨idr_destroy()来释放IDRĺŤ ç”¨çš„ĺ†…ĺ。这并不会释放IDR指ĺ‘çš„ 对象;如果您ćłčż™ć ·ĺšďĽŚčŻ·ä˝żç”¨ĺ…¶ä¸ä¸€ä¸Şčżä»Łĺ™¨ćťĄć‰§čˇŚć¤ć“Ťä˝śă€‚ 您可以使用idr_is_empty()来查看当前ćŻĺ¦ĺ†é…Ťäş†ä»»ä˝•ID。 如果在从IDRĺ†é…Ťä¸€ä¸Şć–°ID时需č¦ĺ¸¦é”,您可č˝éś€č¦äĽ 递一组é™ĺ¶ć€§çš„GFPć ‡ĺż—ďĽŚä˝†čż™ĺŹŻč˝ĺŻĽ 致IDRć— ćł•ĺ†é…Ťĺ†…ĺ。为了解决该问é˘ďĽŚć‚¨ĺŹŻä»Ąĺś¨čŽ·ĺŹ–é”之前č°ç”¨idr_preload(),然ĺŽĺś¨ĺ† é…Ťäą‹ĺŽč°ç”¨idr_preload_end()。 IDRĺŚćĄçš„相关内容请č§include/linux/idr.h文件ä¸çš„“DOC: idr sync”。 IDA的用法 ========= IDA的用法的相关内容请č§lib/idr.c文件ä¸çš„“DOC: IDA description”。 函数和数据结构 ============== 该APIĺś¨ä»Ąä¸‹ĺ†…ć ¸ä»Łç ä¸: include/linux/idr.h lib/idr.c