sphinx.addnodesdocument)}( rawsourcechildren]( translations LanguagesNode)}(hhh](h pending_xref)}(hhh]docutils.nodesTextChinese (Simplified)}parenthsba attributes}(ids]classes]names]dupnames]backrefs] refdomainstdreftypedoc reftarget0/translations/zh_CN/dev-tools/kunit/api/resourcemodnameN classnameN refexplicitutagnamehhh ubh)}(hhh]hChinese (Traditional)}hh2sbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget0/translations/zh_TW/dev-tools/kunit/api/resourcemodnameN classnameN refexplicituh1hhh ubh)}(hhh]hItalian}hhFsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget0/translations/it_IT/dev-tools/kunit/api/resourcemodnameN classnameN refexplicituh1hhh ubh)}(hhh]hJapanese}hhZsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget0/translations/ja_JP/dev-tools/kunit/api/resourcemodnameN classnameN refexplicituh1hhh ubh)}(hhh]hKorean}hhnsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget0/translations/ko_KR/dev-tools/kunit/api/resourcemodnameN classnameN refexplicituh1hhh ubh)}(hhh]hPortuguese (Brazilian)}hhsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget0/translations/pt_BR/dev-tools/kunit/api/resourcemodnameN classnameN refexplicituh1hhh ubh)}(hhh]hSpanish}hhsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget0/translations/sp_SP/dev-tools/kunit/api/resourcemodnameN classnameN refexplicituh1hhh ubeh}(h]h ]h"]h$]h&]current_languageEnglishuh1h hh _documenthsourceNlineNubhcomment)}(h SPDX-License-Identifier: GPL-2.0h]h SPDX-License-Identifier: GPL-2.0}hhsbah}(h]h ]h"]h$]h&] xml:spacepreserveuh1hhhhhhJ/var/lib/git/docbuild/linux/Documentation/dev-tools/kunit/api/resource.rsthKubhsection)}(hhh](htitle)}(h Resource APIh]h Resource API}(hhhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhhhhhKubh paragraph)}(h+This file documents the KUnit resource API.h]h+This file documents the KUnit resource API.}(hhhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhhhhubh)}(hMost users won't need to use this API directly, power users can use it to store state on a per-test basis, register custom cleanup actions, and more.h]hMost users won’t need to use this API directly, power users can use it to store state on a per-test basis, register custom cleanup actions, and more.}(hhhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK hhhhubhindex)}(hhh]h}(h]h ]h"]h$]h&]entries](singlekunit_resource (C struct)c.kunit_resourcehNtauh1hhhhhhNhNubhdesc)}(hhh](hdesc_signature)}(hkunit_resourceh]hdesc_signature_line)}(hstruct kunit_resourceh](hdesc_sig_keyword)}(hstructh]hstruct}(hjhhhNhNubah}(h]h ]kah"]h$]h&]uh1jhjhhhe/var/lib/git/docbuild/linux/Documentation/dev-tools/kunit/api/resource:12: ./include/kunit/resource.hhKubhdesc_sig_space)}(h h]h }(hj1hhhNhNubah}(h]h ]wah"]h$]h&]uh1j/hjhhhj.hKubh desc_name)}(hkunit_resourceh]h desc_sig_name)}(hjh]hkunit_resource}(hjHhhhNhNubah}(h]h ]nah"]h$]h&]uh1jFhjBubah}(h]h ](sig-namedescnameeh"]h$]h&]hhuh1j@hjhhhj.hKubeh}(h]h ]h"]h$]h&]hhƌ add_permalinkuh1jsphinx_line_type declaratorhjhhhj.hKubah}(h]j ah ](sig sig-objecteh"]h$]h&] is_multiline _toc_parts) _toc_namehuh1jhj.hKhjhhubh desc_content)}(hhh]h)}(h$represents a *test managed resource*h](h represents a }(hjwhhhNhNubhemphasis)}(h*test managed resource*h]htest managed resource}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjwubeh}(h]h ]h"]h$]h&]uh1hhe/var/lib/git/docbuild/linux/Documentation/dev-tools/kunit/api/resource:12: ./include/kunit/resource.hhKhjthhubah}(h]h ]h"]h$]h&]uh1jrhjhhhj.hKubeh}(h]h ](cstructeh"]h$]h&]domainjobjtypejdesctypejnoindex noindexentrynocontentsentryuh1j hhhhhNhNubh container)}(hX**Definition**:: struct kunit_resource { void *data; const char *name; kunit_resource_free_t free; }; **Members** ``data`` for the user to store arbitrary data. ``name`` optional name ``free`` a user supplied function to free the resource.h](h)}(h**Definition**::h](hstrong)}(h**Definition**h]h Definition}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh:}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhe/var/lib/git/docbuild/linux/Documentation/dev-tools/kunit/api/resource:12: ./include/kunit/resource.hhKhjubh literal_block)}(h`struct kunit_resource { void *data; const char *name; kunit_resource_free_t free; };h]h`struct kunit_resource { void *data; const char *name; kunit_resource_free_t free; };}hjsbah}(h]h ]h"]h$]h&]hhuh1jhe/var/lib/git/docbuild/linux/Documentation/dev-tools/kunit/api/resource:12: ./include/kunit/resource.hhKhjubh)}(h **Members**h]j)}(hjh]hMembers}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhe/var/lib/git/docbuild/linux/Documentation/dev-tools/kunit/api/resource:12: ./include/kunit/resource.hhK%hjubhdefinition_list)}(hhh](hdefinition_list_item)}(h/``data`` for the user to store arbitrary data. h](hterm)}(h``data``h]hliteral)}(hjh]hdata}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1j hjubah}(h]h ]h"]h$]h&]uh1jhe/var/lib/git/docbuild/linux/Documentation/dev-tools/kunit/api/resource:12: ./include/kunit/resource.hhKhjubh definition)}(hhh]h)}(h%for the user to store arbitrary data.h]h%for the user to store arbitrary data.}(hj$hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhKhj!ubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhKhjubj)}(h``name`` optional name h](j)}(h``name``h]j )}(hjDh]hname}(hjFhhhNhNubah}(h]h ]h"]h$]h&]uh1j hjBubah}(h]h ]h"]h$]h&]uh1jhe/var/lib/git/docbuild/linux/Documentation/dev-tools/kunit/api/resource:12: ./include/kunit/resource.hhKhj>ubj )}(hhh]h)}(h optional nameh]h optional name}(hj]hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjYhKhjZubah}(h]h ]h"]h$]h&]uh1jhj>ubeh}(h]h ]h"]h$]h&]uh1jhjYhKhjubj)}(h7``free`` a user supplied function to free the resource.h](j)}(h``free``h]j )}(hj}h]hfree}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j hj{ubah}(h]h ]h"]h$]h&]uh1jhe/var/lib/git/docbuild/linux/Documentation/dev-tools/kunit/api/resource:12: ./include/kunit/resource.hhKhjwubj )}(hhh]h)}(h.a user supplied function to free the resource.h]h.a user supplied function to free the resource.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhe/var/lib/git/docbuild/linux/Documentation/dev-tools/kunit/api/resource:12: ./include/kunit/resource.hhKhjubah}(h]h ]h"]h$]h&]uh1jhjwubeh}(h]h ]h"]h$]h&]uh1jhjhKhjubeh}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhhhhhNhNubh)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhe/var/lib/git/docbuild/linux/Documentation/dev-tools/kunit/api/resource:12: ./include/kunit/resource.hhK hhhhubh)}(hXRRepresents a *test managed resource*, a resource which will automatically be cleaned up at the end of a test case. This cleanup is performed by the 'free' function. The struct kunit_resource itself is freed automatically with kfree() if it was allocated by KUnit (e.g., by kunit_alloc_resource()), but must be freed by the user otherwise.h](h Represents a }(hjhhhNhNubj)}(h*test managed resource*h]htest managed resource}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubhX2, a resource which will automatically be cleaned up at the end of a test case. This cleanup is performed by the ‘free’ function. The struct kunit_resource itself is freed automatically with kfree() if it was allocated by KUnit (e.g., by kunit_alloc_resource()), but must be freed by the user otherwise.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhe/var/lib/git/docbuild/linux/Documentation/dev-tools/kunit/api/resource:12: ./include/kunit/resource.hhKhhhhubh)}(hXYResources are reference counted so if a resource is retrieved via kunit_alloc_and_get_resource() or kunit_find_resource(), we need to call kunit_put_resource() to reduce the resource reference count when finished with it. Note that kunit_alloc_resource() does not require a kunit_resource_put() because it does not retrieve the resource itself.h]hXYResources are reference counted so if a resource is retrieved via kunit_alloc_and_get_resource() or kunit_find_resource(), we need to call kunit_put_resource() to reduce the resource reference count when finished with it. Note that kunit_alloc_resource() does not require a kunit_resource_put() because it does not retrieve the resource itself.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhe/var/lib/git/docbuild/linux/Documentation/dev-tools/kunit/api/resource:12: ./include/kunit/resource.hhK#hhhhubh)}(h **Example**h]j)}(hjh]hExample}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhe/var/lib/git/docbuild/linux/Documentation/dev-tools/kunit/api/resource:12: ./include/kunit/resource.hhK)hhhhubj)}(hXstruct kunit_kmalloc_params { size_t size; gfp_t gfp; }; static int kunit_kmalloc_init(struct kunit_resource *res, void *context) { struct kunit_kmalloc_params *params = context; res->data = kmalloc(params->size, params->gfp); if (!res->data) return -ENOMEM; return 0; } static void kunit_kmalloc_free(struct kunit_resource *res) { kfree(res->data); } void *kunit_kmalloc(struct kunit *test, size_t size, gfp_t gfp) { struct kunit_kmalloc_params params; params.size = size; params.gfp = gfp; return kunit_alloc_resource(test, kunit_kmalloc_init, kunit_kmalloc_free, gfp, ¶ms); }h]hXstruct kunit_kmalloc_params { size_t size; gfp_t gfp; }; static int kunit_kmalloc_init(struct kunit_resource *res, void *context) { struct kunit_kmalloc_params *params = context; res->data = kmalloc(params->size, params->gfp); if (!res->data) return -ENOMEM; return 0; } static void kunit_kmalloc_free(struct kunit_resource *res) { kfree(res->data); } void *kunit_kmalloc(struct kunit *test, size_t size, gfp_t gfp) { struct kunit_kmalloc_params params; params.size = size; params.gfp = gfp; return kunit_alloc_resource(test, kunit_kmalloc_init, kunit_kmalloc_free, gfp, ¶ms); }}hjsbah}(h]h ]h"]h$]h&]hhƌforcelanguagejhighlight_args}uh1jhe/var/lib/git/docbuild/linux/Documentation/dev-tools/kunit/api/resource:12: ./include/kunit/resource.hhK*hhhhubh)}(hResources can also be named, with lookup/removal done on a name basis also. kunit_add_named_resource(), kunit_find_named_resource() and kunit_destroy_named_resource(). Resource names must be unique within the test instance.h]hResources can also be named, with lookup/removal done on a name basis also. kunit_add_named_resource(), kunit_find_named_resource() and kunit_destroy_named_resource(). Resource names must be unique within the test instance.}(hj1hhhNhNubah}(h]h ]h"]h$]h&]uh1hhe/var/lib/git/docbuild/linux/Documentation/dev-tools/kunit/api/resource:12: ./include/kunit/resource.hhKLhhhhubh)}(hhh]h}(h]h ]h"]h$]h&]entries](jkunit_get_resource (C function)c.kunit_get_resourcehNtauh1hhhhhhNhNubj )}(hhh](j)}(h4void kunit_get_resource (struct kunit_resource *res)h]j)}(h3void kunit_get_resource(struct kunit_resource *res)h](hdesc_sig_keyword_type)}(hvoidh]hvoid}(hj[hhhNhNubah}(h]h ]ktah"]h$]h&]uh1jYhjUhhhe/var/lib/git/docbuild/linux/Documentation/dev-tools/kunit/api/resource:12: ./include/kunit/resource.hhK_ubj0)}(h h]h }(hjkhhhNhNubah}(h]h ]j<ah"]h$]h&]uh1j/hjUhhhjjhK_ubjA)}(hkunit_get_resourceh]jG)}(hkunit_get_resourceh]hkunit_get_resource}(hj}hhhNhNubah}(h]h ]jRah"]h$]h&]uh1jFhjyubah}(h]h ](jYjZeh"]h$]h&]hhuh1j@hjUhhhjjhK_ubhdesc_parameterlist)}(h(struct kunit_resource *res)h]hdesc_parameter)}(hstruct kunit_resource *resh](j)}(hj!h]hstruct}(hjhhhNhNubah}(h]h ]j*ah"]h$]h&]uh1jhjubj0)}(h h]h }(hjhhhNhNubah}(h]h ]j<ah"]h$]h&]uh1j/hjubh)}(hhh]jG)}(hkunit_resourceh]hkunit_resource}(hjhhhNhNubah}(h]h ]jRah"]h$]h&]uh1jFhjubah}(h]h ]h"]h$]h&] refdomainjreftype identifier reftargetjmodnameN classnameN c:parent_keysphinx.domains.c LookupKey)}data]j ASTIdentifier)}jjsbc.kunit_get_resourceasbuh1hhjubj0)}(h h]h }(hjhhhNhNubah}(h]h ]j<ah"]h$]h&]uh1j/hjubhdesc_sig_punctuation)}(h*h]h*}(hjhhhNhNubah}(h]h ]pah"]h$]h&]uh1jhjubjG)}(hresh]hres}(hjhhhNhNubah}(h]h ]jRah"]h$]h&]uh1jFhjubeh}(h]h ]h"]h$]h&]noemphhhuh1jhjubah}(h]h ]h"]h$]h&]hhuh1jhjUhhhjjhK_ubeh}(h]h ]h"]h$]h&]hhjduh1jjejfhjQhhhjjhK_ubah}(h]jLah ](jjjkeh"]h$]h&]jojp)jqhuh1jhjjhK_hjNhhubjs)}(hhh]h)}(hHold resource for use. Should not need to be used by most users as we automatically get resources retrieved by kunit_find_resource*().h]hHold resource for use. Should not need to be used by most users as we automatically get resources retrieved by kunit_find_resource*().}(hj,hhhNhNubah}(h]h ]h"]h$]h&]uh1hhe/var/lib/git/docbuild/linux/Documentation/dev-tools/kunit/api/resource:12: ./include/kunit/resource.hhK_hj)hhubah}(h]h ]h"]h$]h&]uh1jrhjNhhhjjhK_ubeh}(h]h ](jfunctioneh"]h$]h&]jjjjDjjDjjjuh1j hhhhhNhNubj)}(h9**Parameters** ``struct kunit_resource *res`` resourceh](h)}(h**Parameters**h]j)}(hjNh]h Parameters}(hjPhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjLubah}(h]h ]h"]h$]h&]uh1hhe/var/lib/git/docbuild/linux/Documentation/dev-tools/kunit/api/resource:12: ./include/kunit/resource.hhKchjHubj)}(hhh]j)}(h'``struct kunit_resource *res`` resourceh](j)}(h``struct kunit_resource *res``h]j )}(hjmh]hstruct kunit_resource *res}(hjohhhNhNubah}(h]h ]h"]h$]h&]uh1j hjkubah}(h]h ]h"]h$]h&]uh1jhe/var/lib/git/docbuild/linux/Documentation/dev-tools/kunit/api/resource:12: ./include/kunit/resource.hhKehjgubj )}(hhh]h)}(hresourceh]hresource}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhe/var/lib/git/docbuild/linux/Documentation/dev-tools/kunit/api/resource:12: ./include/kunit/resource.hhKbhjubah}(h]h ]h"]h$]h&]uh1jhjgubeh}(h]h ]h"]h$]h&]uh1jhjhKehjdubah}(h]h ]h"]h$]h&]uh1jhjHubeh}(h]h ] kernelindentah"]h$]h&]uh1jhhhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](jkunit_put_resource (C function)c.kunit_put_resourcehNtauh1hhhhhhNhNubj )}(hhh](j)}(h4void kunit_put_resource (struct kunit_resource *res)h]j)}(h3void kunit_put_resource(struct kunit_resource *res)h](jZ)}(hvoidh]hvoid}(hjhhhNhNubah}(h]h ]jfah"]h$]h&]uh1jYhjhhhe/var/lib/git/docbuild/linux/Documentation/dev-tools/kunit/api/resource:12: ./include/kunit/resource.hhK}ubj0)}(h h]h }(hjhhhNhNubah}(h]h ]j<ah"]h$]h&]uh1j/hjhhhjhK}ubjA)}(hkunit_put_resourceh]jG)}(hkunit_put_resourceh]hkunit_put_resource}(hjhhhNhNubah}(h]h ]jRah"]h$]h&]uh1jFhjubah}(h]h ](jYjZeh"]h$]h&]hhuh1j@hjhhhjhK}ubj)}(h(struct kunit_resource *res)h]j)}(hstruct kunit_resource *resh](j)}(hj!h]hstruct}(hjhhhNhNubah}(h]h ]j*ah"]h$]h&]uh1jhjubj0)}(h h]h }(hjhhhNhNubah}(h]h ]j<ah"]h$]h&]uh1j/hjubh)}(hhh]jG)}(hkunit_resourceh]hkunit_resource}(hj"hhhNhNubah}(h]h ]jRah"]h$]h&]uh1jFhjubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetj$modnameN classnameNjj)}j]j)}jjsbc.kunit_put_resourceasbuh1hhjubj0)}(h h]h }(hjBhhhNhNubah}(h]h ]j<ah"]h$]h&]uh1j/hjubj)}(hjh]h*}(hjPhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubjG)}(hresh]hres}(hj]hhhNhNubah}(h]h ]jRah"]h$]h&]uh1jFhjubeh}(h]h ]h"]h$]h&]noemphhhuh1jhjubah}(h]h ]h"]h$]h&]hhuh1jhjhhhjhK}ubeh}(h]h ]h"]h$]h&]hhjduh1jjejfhjhhhjhK}ubah}(h]jah ](jjjkeh"]h$]h&]jojp)jqhuh1jhjhK}hjhhubjs)}(hhh]h)}(hXuWhen caller is done with retrieved resource, kunit_put_resource() should be called to drop reference count. The resource list maintains a reference count on resources, so if no users are utilizing a resource and it is removed from the resource list, it will be freed via the associated free function (if any). Only needs to be used if we alloc_and_get() or find() resource.h]hXuWhen caller is done with retrieved resource, kunit_put_resource() should be called to drop reference count. The resource list maintains a reference count on resources, so if no users are utilizing a resource and it is removed from the resource list, it will be freed via the associated free function (if any). Only needs to be used if we alloc_and_get() or find() resource.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhe/var/lib/git/docbuild/linux/Documentation/dev-tools/kunit/api/resource:12: ./include/kunit/resource.hhK}hjhhubah}(h]h ]h"]h$]h&]uh1jrhjhhhjhK}ubeh}(h]h ](jfunctioneh"]h$]h&]jjjjjjjjjuh1j hhhhhNhNubj)}(h9**Parameters** ``struct kunit_resource *res`` resourceh](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhe/var/lib/git/docbuild/linux/Documentation/dev-tools/kunit/api/resource:12: ./include/kunit/resource.hhKhjubj)}(hhh]j)}(h'``struct kunit_resource *res`` resourceh](j)}(h``struct kunit_resource *res``h]j )}(hjh]hstruct kunit_resource *res}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j hjubah}(h]h ]h"]h$]h&]uh1jhe/var/lib/git/docbuild/linux/Documentation/dev-tools/kunit/api/resource:12: ./include/kunit/resource.hhKhjubj )}(hhh]h)}(hresourceh]hresource}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhe/var/lib/git/docbuild/linux/Documentation/dev-tools/kunit/api/resource:12: ./include/kunit/resource.hhKhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhKhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhhhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j!__kunit_add_resource (C function)c.__kunit_add_resourcehNtauh1hhhhhhNhNubj )}(hhh](j)}(hint __kunit_add_resource (struct kunit *test, kunit_resource_init_t init, kunit_resource_free_t free, struct kunit_resource *res, void *data)h]j)}(hint __kunit_add_resource(struct kunit *test, kunit_resource_init_t init, kunit_resource_free_t free, struct kunit_resource *res, void *data)h](jZ)}(hinth]hint}(hj"hhhNhNubah}(h]h ]jfah"]h$]h&]uh1jYhjhhhe/var/lib/git/docbuild/linux/Documentation/dev-tools/kunit/api/resource:12: ./include/kunit/resource.hhKubj0)}(h h]h }(hj1hhhNhNubah}(h]h ]j<ah"]h$]h&]uh1j/hjhhhj0hKubjA)}(h__kunit_add_resourceh]jG)}(h__kunit_add_resourceh]h__kunit_add_resource}(hjChhhNhNubah}(h]h ]jRah"]h$]h&]uh1jFhj?ubah}(h]h ](jYjZeh"]h$]h&]hhuh1j@hjhhhj0hKubj)}(ht(struct kunit *test, kunit_resource_init_t init, kunit_resource_free_t free, struct kunit_resource *res, void *data)h](j)}(hstruct kunit *testh](j)}(hj!h]hstruct}(hj_hhhNhNubah}(h]h ]j*ah"]h$]h&]uh1jhj[ubj0)}(h h]h }(hjlhhhNhNubah}(h]h ]j<ah"]h$]h&]uh1j/hj[ubh)}(hhh]jG)}(hkunith]hkunit}(hj}hhhNhNubah}(h]h ]jRah"]h$]h&]uh1jFhjzubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjmodnameN classnameNjj)}j]j)}jjEsbc.__kunit_add_resourceasbuh1hhj[ubj0)}(h h]h }(hjhhhNhNubah}(h]h ]j<ah"]h$]h&]uh1j/hj[ubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj[ubjG)}(htesth]htest}(hjhhhNhNubah}(h]h ]jRah"]h$]h&]uh1jFhj[ubeh}(h]h ]h"]h$]h&]noemphhhuh1jhjWubj)}(hkunit_resource_init_t inith](h)}(hhh]jG)}(hkunit_resource_init_th]hkunit_resource_init_t}(hjhhhNhNubah}(h]h ]jRah"]h$]h&]uh1jFhjubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjmodnameN classnameNjj)}j]jc.__kunit_add_resourceasbuh1hhjubj0)}(h h]h }(hjhhhNhNubah}(h]h ]j<ah"]h$]h&]uh1j/hjubjG)}(hinith]hinit}(hjhhhNhNubah}(h]h ]jRah"]h$]h&]uh1jFhjubeh}(h]h ]h"]h$]h&]noemphhhuh1jhjWubj)}(hkunit_resource_free_t freeh](h)}(hhh]jG)}(hkunit_resource_free_th]hkunit_resource_free_t}(hjhhhNhNubah}(h]h ]jRah"]h$]h&]uh1jFhjubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjmodnameN classnameNjj)}j]jc.__kunit_add_resourceasbuh1hhjubj0)}(h h]h }(hj:hhhNhNubah}(h]h ]j<ah"]h$]h&]uh1j/hjubjG)}(hfreeh]hfree}(hjHhhhNhNubah}(h]h ]jRah"]h$]h&]uh1jFhjubeh}(h]h ]h"]h$]h&]noemphhhuh1jhjWubj)}(hstruct kunit_resource *resh](j)}(hj!h]hstruct}(hjahhhNhNubah}(h]h ]j*ah"]h$]h&]uh1jhj]ubj0)}(h h]h }(hjnhhhNhNubah}(h]h ]j<ah"]h$]h&]uh1j/hj]ubh)}(hhh]jG)}(hkunit_resourceh]hkunit_resource}(hjhhhNhNubah}(h]h ]jRah"]h$]h&]uh1jFhj|ubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjmodnameN classnameNjj)}j]jc.__kunit_add_resourceasbuh1hhj]ubj0)}(h h]h }(hjhhhNhNubah}(h]h ]j<ah"]h$]h&]uh1j/hj]ubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj]ubjG)}(hresh]hres}(hjhhhNhNubah}(h]h ]jRah"]h$]h&]uh1jFhj]ubeh}(h]h ]h"]h$]h&]noemphhhuh1jhjWubj)}(h void *datah](jZ)}(hvoidh]hvoid}(hjhhhNhNubah}(h]h ]jfah"]h$]h&]uh1jYhjubj0)}(h h]h }(hjhhhNhNubah}(h]h ]j<ah"]h$]h&]uh1j/hjubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubjG)}(hdatah]hdata}(hjhhhNhNubah}(h]h ]jRah"]h$]h&]uh1jFhjubeh}(h]h ]h"]h$]h&]noemphhhuh1jhjWubeh}(h]h ]h"]h$]h&]hhuh1jhjhhhj0hKubeh}(h]h ]h"]h$]h&]hhjduh1jjejfhjhhhj0hKubah}(h]jah ](jjjkeh"]h$]h&]jojp)jqhuh1jhj0hKhjhhubjs)}(hhh]h)}(h"Internal helper to add a resource.h]h"Internal helper to add a resource.}(hj$hhhNhNubah}(h]h ]h"]h$]h&]uh1hhe/var/lib/git/docbuild/linux/Documentation/dev-tools/kunit/api/resource:12: ./include/kunit/resource.hhKhj!hhubah}(h]h ]h"]h$]h&]uh1jrhjhhhj0hKubeh}(h]h ](jfunctioneh"]h$]h&]jjjj<jj<jjjuh1j hhhhhNhNubj)}(hXG**Parameters** ``struct kunit *test`` The test context object. ``kunit_resource_init_t init`` a user-supplied function to initialize the result (if needed). If none is supplied, the resource data value is simply set to **data**. If an init function is supplied, **data** is passed to it instead. ``kunit_resource_free_t free`` a user-supplied function to free the resource (if needed). ``struct kunit_resource *res`` The resource. ``void *data`` value to pass to init function or set in resource data field. **Description** res->should_kfree is not initialised.h](h)}(h**Parameters**h]j)}(hjFh]h Parameters}(hjHhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjDubah}(h]h ]h"]h$]h&]uh1hhe/var/lib/git/docbuild/linux/Documentation/dev-tools/kunit/api/resource:12: ./include/kunit/resource.hhKhj@ubj)}(hhh](j)}(h0``struct kunit *test`` The test context object. h](j)}(h``struct kunit *test``h]j )}(hjeh]hstruct kunit *test}(hjghhhNhNubah}(h]h ]h"]h$]h&]uh1j hjcubah}(h]h ]h"]h$]h&]uh1jhe/var/lib/git/docbuild/linux/Documentation/dev-tools/kunit/api/resource:12: ./include/kunit/resource.hhKhj_ubj )}(hhh]h)}(hThe test context object.h]hThe test context object.}(hj~hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjzhKhj{ubah}(h]h ]h"]h$]h&]uh1jhj_ubeh}(h]h ]h"]h$]h&]uh1jhjzhKhj\ubj)}(h``kunit_resource_init_t init`` a user-supplied function to initialize the result (if needed). If none is supplied, the resource data value is simply set to **data**. If an init function is supplied, **data** is passed to it instead. h](j)}(h``kunit_resource_init_t init``h]j )}(hjh]hkunit_resource_init_t init}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j hjubah}(h]h ]h"]h$]h&]uh1jhe/var/lib/git/docbuild/linux/Documentation/dev-tools/kunit/api/resource:12: ./include/kunit/resource.hhKhjubj )}(hhh]h)}(ha user-supplied function to initialize the result (if needed). If none is supplied, the resource data value is simply set to **data**. If an init function is supplied, **data** is passed to it instead.h](h~a user-supplied function to initialize the result (if needed). If none is supplied, the resource data value is simply set to }(hjhhhNhNubj)}(h**data**h]hdata}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh#. If an init function is supplied, }(hjhhhNhNubj)}(h**data**h]hdata}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh is passed to it instead.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhe/var/lib/git/docbuild/linux/Documentation/dev-tools/kunit/api/resource:12: ./include/kunit/resource.hhKhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhKhj\ubj)}(hZ``kunit_resource_free_t free`` a user-supplied function to free the resource (if needed). h](j)}(h``kunit_resource_free_t free``h]j )}(hjh]hkunit_resource_free_t free}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j hjubah}(h]h ]h"]h$]h&]uh1jhe/var/lib/git/docbuild/linux/Documentation/dev-tools/kunit/api/resource:12: ./include/kunit/resource.hhKhjubj )}(hhh]h)}(h:a user-supplied function to free the resource (if needed).h]h:a user-supplied function to free the resource (if needed).}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj hKhj ubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhj hKhj\ubj)}(h-``struct kunit_resource *res`` The resource. h](j)}(h``struct kunit_resource *res``h]j )}(hj5 h]hstruct kunit_resource *res}(hj7 hhhNhNubah}(h]h ]h"]h$]h&]uh1j hj3 ubah}(h]h ]h"]h$]h&]uh1jhe/var/lib/git/docbuild/linux/Documentation/dev-tools/kunit/api/resource:12: ./include/kunit/resource.hhKhj/ ubj )}(hhh]h)}(h The resource.h]h The resource.}(hjN hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjJ hKhjK ubah}(h]h ]h"]h$]h&]uh1jhj/ ubeh}(h]h ]h"]h$]h&]uh1jhjJ hKhj\ubj)}(hM``void *data`` value to pass to init function or set in resource data field. h](j)}(h``void *data``h]j )}(hjn h]h void *data}(hjp hhhNhNubah}(h]h ]h"]h$]h&]uh1j hjl ubah}(h]h ]h"]h$]h&]uh1jhe/var/lib/git/docbuild/linux/Documentation/dev-tools/kunit/api/resource:12: ./include/kunit/resource.hhKhjh ubj )}(hhh]h)}(h=value to pass to init function or set in resource data field.h]h=value to pass to init function or set in resource data field.}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj hKhj ubah}(h]h ]h"]h$]h&]uh1jhjh ubeh}(h]h ]h"]h$]h&]uh1jhj hKhj\ubeh}(h]h ]h"]h$]h&]uh1jhj@ubh)}(h**Description**h]j)}(hj h]h Description}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1hhe/var/lib/git/docbuild/linux/Documentation/dev-tools/kunit/api/resource:12: ./include/kunit/resource.hhKhj@ubh)}(h%res->should_kfree is not initialised.h]h%res->should_kfree is not initialised.}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhe/var/lib/git/docbuild/linux/Documentation/dev-tools/kunit/api/resource:12: ./include/kunit/resource.hhKhj@ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhhhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](jkunit_add_resource (C function)c.kunit_add_resourcehNtauh1hhhhhhNhNubj )}(hhh](j)}(hint kunit_add_resource (struct kunit *test, kunit_resource_init_t init, kunit_resource_free_t free, struct kunit_resource *res, void *data)h]j)}(hint kunit_add_resource(struct kunit *test, kunit_resource_init_t init, kunit_resource_free_t free, struct kunit_resource *res, void *data)h](jZ)}(hinth]hint}(hj hhhNhNubah}(h]h ]jfah"]h$]h&]uh1jYhj hhhe/var/lib/git/docbuild/linux/Documentation/dev-tools/kunit/api/resource:12: ./include/kunit/resource.hhKubj0)}(h h]h }(hj hhhNhNubah}(h]h ]j<ah"]h$]h&]uh1j/hj hhhj hKubjA)}(hkunit_add_resourceh]jG)}(hkunit_add_resourceh]hkunit_add_resource}(hj hhhNhNubah}(h]h ]jRah"]h$]h&]uh1jFhj ubah}(h]h ](jYjZeh"]h$]h&]hhuh1j@hj hhhj hKubj)}(ht(struct kunit *test, kunit_resource_init_t init, kunit_resource_free_t free, struct kunit_resource *res, void *data)h](j)}(hstruct kunit *testh](j)}(hj!h]hstruct}(hj+ hhhNhNubah}(h]h ]j*ah"]h$]h&]uh1jhj' ubj0)}(h h]h }(hj8 hhhNhNubah}(h]h ]j<ah"]h$]h&]uh1j/hj' ubh)}(hhh]jG)}(hkunith]hkunit}(hjI hhhNhNubah}(h]h ]jRah"]h$]h&]uh1jFhjF ubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjK modnameN classnameNjj)}j]j)}jj sbc.kunit_add_resourceasbuh1hhj' ubj0)}(h h]h }(hji hhhNhNubah}(h]h ]j<ah"]h$]h&]uh1j/hj' ubj)}(hjh]h*}(hjw hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj' ubjG)}(htesth]htest}(hj hhhNhNubah}(h]h ]jRah"]h$]h&]uh1jFhj' ubeh}(h]h ]h"]h$]h&]noemphhhuh1jhj# ubj)}(hkunit_resource_init_t inith](h)}(hhh]jG)}(hkunit_resource_init_th]hkunit_resource_init_t}(hj hhhNhNubah}(h]h ]jRah"]h$]h&]uh1jFhj ubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetj modnameN classnameNjj)}j]je c.kunit_add_resourceasbuh1hhj ubj0)}(h h]h }(hj hhhNhNubah}(h]h ]j<ah"]h$]h&]uh1j/hj ubjG)}(hinith]hinit}(hj hhhNhNubah}(h]h ]jRah"]h$]h&]uh1jFhj ubeh}(h]h ]h"]h$]h&]noemphhhuh1jhj# ubj)}(hkunit_resource_free_t freeh](h)}(hhh]jG)}(hkunit_resource_free_th]hkunit_resource_free_t}(hj hhhNhNubah}(h]h ]jRah"]h$]h&]uh1jFhj ubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetj modnameN classnameNjj)}j]je c.kunit_add_resourceasbuh1hhj ubj0)}(h h]h }(hj hhhNhNubah}(h]h ]j<ah"]h$]h&]uh1j/hj ubjG)}(hfreeh]hfree}(hj hhhNhNubah}(h]h ]jRah"]h$]h&]uh1jFhj ubeh}(h]h ]h"]h$]h&]noemphhhuh1jhj# ubj)}(hstruct kunit_resource *resh](j)}(hj!h]hstruct}(hj- hhhNhNubah}(h]h ]j*ah"]h$]h&]uh1jhj) ubj0)}(h h]h }(hj: hhhNhNubah}(h]h ]j<ah"]h$]h&]uh1j/hj) ubh)}(hhh]jG)}(hkunit_resourceh]hkunit_resource}(hjK hhhNhNubah}(h]h ]jRah"]h$]h&]uh1jFhjH ubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjM modnameN classnameNjj)}j]je c.kunit_add_resourceasbuh1hhj) ubj0)}(h h]h }(hji hhhNhNubah}(h]h ]j<ah"]h$]h&]uh1j/hj) ubj)}(hjh]h*}(hjw hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj) ubjG)}(hresh]hres}(hj hhhNhNubah}(h]h ]jRah"]h$]h&]uh1jFhj) ubeh}(h]h ]h"]h$]h&]noemphhhuh1jhj# ubj)}(h void *datah](jZ)}(hvoidh]hvoid}(hj hhhNhNubah}(h]h ]jfah"]h$]h&]uh1jYhj ubj0)}(h h]h }(hj hhhNhNubah}(h]h ]j<ah"]h$]h&]uh1j/hj ubj)}(hjh]h*}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubjG)}(hdatah]hdata}(hj hhhNhNubah}(h]h ]jRah"]h$]h&]uh1jFhj ubeh}(h]h ]h"]h$]h&]noemphhhuh1jhj# ubeh}(h]h ]h"]h$]h&]hhuh1jhj hhhj hKubeh}(h]h ]h"]h$]h&]hhjduh1jjejfhj hhhj hKubah}(h]j ah ](jjjkeh"]h$]h&]jojp)jqhuh1jhj hKhj hhubjs)}(hhh]h)}(hAdd a *test managed resource*.h](hAdd a }(hj hhhNhNubj)}(h*test managed resource*h]htest managed resource}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubh.}(hj hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhe/var/lib/git/docbuild/linux/Documentation/dev-tools/kunit/api/resource:12: ./include/kunit/resource.hhKhj hhubah}(h]h ]h"]h$]h&]uh1jrhj hhhj hKubeh}(h]h ](jfunctioneh"]h$]h&]jjjj jj jjjuh1j hhhhhNhNubj)}(hX**Parameters** ``struct kunit *test`` The test context object. ``kunit_resource_init_t init`` a user-supplied function to initialize the result (if needed). If none is supplied, the resource data value is simply set to **data**. If an init function is supplied, **data** is passed to it instead. ``kunit_resource_free_t free`` a user-supplied function to free the resource (if needed). ``struct kunit_resource *res`` The resource. ``void *data`` value to pass to init function or set in resource data field.h](h)}(h**Parameters**h]j)}(hj$ h]h Parameters}(hj& hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj" ubah}(h]h ]h"]h$]h&]uh1hhe/var/lib/git/docbuild/linux/Documentation/dev-tools/kunit/api/resource:12: ./include/kunit/resource.hhKhj ubj)}(hhh](j)}(h0``struct kunit *test`` The test context object. h](j)}(h``struct kunit *test``h]j )}(hjC h]hstruct kunit *test}(hjE hhhNhNubah}(h]h ]h"]h$]h&]uh1j hjA ubah}(h]h ]h"]h$]h&]uh1jhe/var/lib/git/docbuild/linux/Documentation/dev-tools/kunit/api/resource:12: ./include/kunit/resource.hhKhj= ubj )}(hhh]h)}(hThe test context object.h]hThe test context object.}(hj\ hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjX hKhjY ubah}(h]h ]h"]h$]h&]uh1jhj= ubeh}(h]h ]h"]h$]h&]uh1jhjX hKhj: ubj)}(h``kunit_resource_init_t init`` a user-supplied function to initialize the result (if needed). If none is supplied, the resource data value is simply set to **data**. If an init function is supplied, **data** is passed to it instead. h](j)}(h``kunit_resource_init_t init``h]j )}(hj| h]hkunit_resource_init_t init}(hj~ hhhNhNubah}(h]h ]h"]h$]h&]uh1j hjz ubah}(h]h ]h"]h$]h&]uh1jhe/var/lib/git/docbuild/linux/Documentation/dev-tools/kunit/api/resource:12: ./include/kunit/resource.hhKhjv ubj )}(hhh]h)}(ha user-supplied function to initialize the result (if needed). If none is supplied, the resource data value is simply set to **data**. If an init function is supplied, **data** is passed to it instead.h](h~a user-supplied function to initialize the result (if needed). If none is supplied, the resource data value is simply set to }(hj hhhNhNubj)}(h**data**h]hdata}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubh#. If an init function is supplied, }(hj hhhNhNubj)}(h**data**h]hdata}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubh is passed to it instead.}(hj hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhe/var/lib/git/docbuild/linux/Documentation/dev-tools/kunit/api/resource:12: ./include/kunit/resource.hhKhj ubah}(h]h ]h"]h$]h&]uh1jhjv ubeh}(h]h ]h"]h$]h&]uh1jhj hKhj: ubj)}(hZ``kunit_resource_free_t free`` a user-supplied function to free the resource (if needed). h](j)}(h``kunit_resource_free_t free``h]j )}(hj h]hkunit_resource_free_t free}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1j hj ubah}(h]h ]h"]h$]h&]uh1jhe/var/lib/git/docbuild/linux/Documentation/dev-tools/kunit/api/resource:12: ./include/kunit/resource.hhKhj ubj )}(hhh]h)}(h:a user-supplied function to free the resource (if needed).h]h:a user-supplied function to free the resource (if needed).}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj hKhj ubah}(h]h ]h"]h$]h&]uh1jhj ubeh}(h]h ]h"]h$]h&]uh1jhj hKhj: ubj)}(h-``struct kunit_resource *res`` The resource. h](j)}(h``struct kunit_resource *res``h]j )}(hj h]hstruct kunit_resource *res}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1j hj ubah}(h]h ]h"]h$]h&]uh1jhe/var/lib/git/docbuild/linux/Documentation/dev-tools/kunit/api/resource:12: ./include/kunit/resource.hhKhj ubj )}(hhh]h)}(h The resource.h]h The resource.}(hj, hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj( hKhj) ubah}(h]h ]h"]h$]h&]uh1jhj ubeh}(h]h ]h"]h$]h&]uh1jhj( hKhj: ubj)}(hL``void *data`` value to pass to init function or set in resource data field.h](j)}(h``void *data``h]j )}(hjL h]h void *data}(hjN hhhNhNubah}(h]h ]h"]h$]h&]uh1j hjJ ubah}(h]h ]h"]h$]h&]uh1jhe/var/lib/git/docbuild/linux/Documentation/dev-tools/kunit/api/resource:12: ./include/kunit/resource.hhKhjF ubj )}(hhh]h)}(h=value to pass to init function or set in resource data field.h]h=value to pass to init function or set in resource data field.}(hje hhhNhNubah}(h]h ]h"]h$]h&]uh1hhe/var/lib/git/docbuild/linux/Documentation/dev-tools/kunit/api/resource:12: ./include/kunit/resource.hhKhjb ubah}(h]h ]h"]h$]h&]uh1jhjF ubeh}(h]h ]h"]h$]h&]uh1jhja hKhj: ubeh}(h]h ]h"]h$]h&]uh1jhj ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhhhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j%kunit_add_named_resource (C function)c.kunit_add_named_resourcehNtauh1hhhhhhNhNubj )}(hhh](j)}(hint kunit_add_named_resource (struct kunit *test, kunit_resource_init_t init, kunit_resource_free_t free, struct kunit_resource *res, const char *name, void *data)h]j)}(hint kunit_add_named_resource(struct kunit *test, kunit_resource_init_t init, kunit_resource_free_t free, struct kunit_resource *res, const char *name, void *data)h](jZ)}(hinth]hint}(hj hhhNhNubah}(h]h ]jfah"]h$]h&]uh1jYhj hhhe/var/lib/git/docbuild/linux/Documentation/dev-tools/kunit/api/resource:12: ./include/kunit/resource.hhKubj0)}(h h]h }(hj hhhNhNubah}(h]h ]j<ah"]h$]h&]uh1j/hj hhhj hKubjA)}(hkunit_add_named_resourceh]jG)}(hkunit_add_named_resourceh]hkunit_add_named_resource}(hj hhhNhNubah}(h]h ]jRah"]h$]h&]uh1jFhj ubah}(h]h ](jYjZeh"]h$]h&]hhuh1j@hj hhhj hKubj)}(h(struct kunit *test, kunit_resource_init_t init, kunit_resource_free_t free, struct kunit_resource *res, const char *name, void *data)h](j)}(hstruct kunit *testh](j)}(hj!h]hstruct}(hj hhhNhNubah}(h]h ]j*ah"]h$]h&]uh1jhj ubj0)}(h h]h }(hj hhhNhNubah}(h]h ]j<ah"]h$]h&]uh1j/hj ubh)}(hhh]jG)}(hkunith]hkunit}(hjhhhNhNubah}(h]h ]jRah"]h$]h&]uh1jFhj ubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjmodnameN classnameNjj)}j]j)}jj sbc.kunit_add_named_resourceasbuh1hhj ubj0)}(h h]h }(hj!hhhNhNubah}(h]h ]j<ah"]h$]h&]uh1j/hj ubj)}(hjh]h*}(hj/hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubjG)}(htesth]htest}(hj<hhhNhNubah}(h]h ]jRah"]h$]h&]uh1jFhj ubeh}(h]h ]h"]h$]h&]noemphhhuh1jhj ubj)}(hkunit_resource_init_t inith](h)}(hhh]jG)}(hkunit_resource_init_th]hkunit_resource_init_t}(hjXhhhNhNubah}(h]h ]jRah"]h$]h&]uh1jFhjUubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjZmodnameN classnameNjj)}j]jc.kunit_add_named_resourceasbuh1hhjQubj0)}(h h]h }(hjvhhhNhNubah}(h]h ]j<ah"]h$]h&]uh1j/hjQubjG)}(hinith]hinit}(hjhhhNhNubah}(h]h ]jRah"]h$]h&]uh1jFhjQubeh}(h]h ]h"]h$]h&]noemphhhuh1jhj ubj)}(hkunit_resource_free_t freeh](h)}(hhh]jG)}(hkunit_resource_free_th]hkunit_resource_free_t}(hjhhhNhNubah}(h]h ]jRah"]h$]h&]uh1jFhjubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjmodnameN classnameNjj)}j]jc.kunit_add_named_resourceasbuh1hhjubj0)}(h h]h }(hjhhhNhNubah}(h]h ]j<ah"]h$]h&]uh1j/hjubjG)}(hfreeh]hfree}(hjhhhNhNubah}(h]h ]jRah"]h$]h&]uh1jFhjubeh}(h]h ]h"]h$]h&]noemphhhuh1jhj ubj)}(hstruct kunit_resource *resh](j)}(hj!h]hstruct}(hjhhhNhNubah}(h]h ]j*ah"]h$]h&]uh1jhjubj0)}(h h]h }(hjhhhNhNubah}(h]h ]j<ah"]h$]h&]uh1j/hjubh)}(hhh]jG)}(hkunit_resourceh]hkunit_resource}(hjhhhNhNubah}(h]h ]jRah"]h$]h&]uh1jFhjubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjmodnameN classnameNjj)}j]jc.kunit_add_named_resourceasbuh1hhjubj0)}(h h]h }(hj!hhhNhNubah}(h]h ]j<ah"]h$]h&]uh1j/hjubj)}(hjh]h*}(hj/hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubjG)}(hresh]hres}(hj<hhhNhNubah}(h]h ]jRah"]h$]h&]uh1jFhjubeh}(h]h ]h"]h$]h&]noemphhhuh1jhj ubj)}(hconst char *nameh](j)}(hconsth]hconst}(hjUhhhNhNubah}(h]h ]j*ah"]h$]h&]uh1jhjQubj0)}(h h]h }(hjchhhNhNubah}(h]h ]j<ah"]h$]h&]uh1j/hjQubjZ)}(hcharh]hchar}(hjqhhhNhNubah}(h]h ]jfah"]h$]h&]uh1jYhjQubj0)}(h h]h }(hjhhhNhNubah}(h]h ]j<ah"]h$]h&]uh1j/hjQubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjQubjG)}(hnameh]hname}(hjhhhNhNubah}(h]h ]jRah"]h$]h&]uh1jFhjQubeh}(h]h ]h"]h$]h&]noemphhhuh1jhj ubj)}(h void *datah](jZ)}(hvoidh]hvoid}(hjhhhNhNubah}(h]h ]jfah"]h$]h&]uh1jYhjubj0)}(h h]h }(hjhhhNhNubah}(h]h ]j<ah"]h$]h&]uh1j/hjubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubjG)}(hdatah]hdata}(hjhhhNhNubah}(h]h ]jRah"]h$]h&]uh1jFhjubeh}(h]h ]h"]h$]h&]noemphhhuh1jhj ubeh}(h]h ]h"]h$]h&]hhuh1jhj hhhj hKubeh}(h]h ]h"]h$]h&]hhjduh1jjejfhj hhhj hKubah}(h]j ah ](jjjkeh"]h$]h&]jojp)jqhuh1jhj hKhj hhubjs)}(hhh]h)}(h$Add a named *test managed resource*.h](h Add a named }(hjhhhNhNubj)}(h*test managed resource*h]htest managed resource}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhe/var/lib/git/docbuild/linux/Documentation/dev-tools/kunit/api/resource:12: ./include/kunit/resource.hhKhjhhubah}(h]h ]h"]h$]h&]uh1jrhj hhhj hKubeh}(h]h ](jfunctioneh"]h$]h&]jjjj0jj0jjjuh1j hhhhhNhNubj)}(hX**Parameters** ``struct kunit *test`` The test context object. ``kunit_resource_init_t init`` a user-supplied function to initialize the resource data, if needed. ``kunit_resource_free_t free`` a user-supplied function to free the resource data, if needed. ``struct kunit_resource *res`` The resource. ``const char *name`` name to be set for resource. ``void *data`` value to pass to init function or set in resource data field.h](h)}(h**Parameters**h]j)}(hj:h]h Parameters}(hj<hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj8ubah}(h]h ]h"]h$]h&]uh1hhe/var/lib/git/docbuild/linux/Documentation/dev-tools/kunit/api/resource:12: ./include/kunit/resource.hhKhj4ubj)}(hhh](j)}(h0``struct kunit *test`` The test context object. h](j)}(h``struct kunit *test``h]j )}(hjYh]hstruct kunit *test}(hj[hhhNhNubah}(h]h ]h"]h$]h&]uh1j hjWubah}(h]h ]h"]h$]h&]uh1jhe/var/lib/git/docbuild/linux/Documentation/dev-tools/kunit/api/resource:12: ./include/kunit/resource.hhKhjSubj )}(hhh]h)}(hThe test context object.h]hThe test context object.}(hjrhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjnhKhjoubah}(h]h ]h"]h$]h&]uh1jhjSubeh}(h]h ]h"]h$]h&]uh1jhjnhKhjPubj)}(hd``kunit_resource_init_t init`` a user-supplied function to initialize the resource data, if needed. h](j)}(h``kunit_resource_init_t init``h]j )}(hjh]hkunit_resource_init_t init}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j hjubah}(h]h ]h"]h$]h&]uh1jhe/var/lib/git/docbuild/linux/Documentation/dev-tools/kunit/api/resource:12: ./include/kunit/resource.hhKhjubj )}(hhh]h)}(hDa user-supplied function to initialize the resource data, if needed.h]hDa user-supplied function to initialize the resource data, if needed.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhKhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhKhjPubj)}(h^``kunit_resource_free_t free`` a user-supplied function to free the resource data, if needed. h](j)}(h``kunit_resource_free_t free``h]j )}(hjh]hkunit_resource_free_t free}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j hjubah}(h]h ]h"]h$]h&]uh1jhe/var/lib/git/docbuild/linux/Documentation/dev-tools/kunit/api/resource:12: ./include/kunit/resource.hhKhjubj )}(hhh]h)}(h>a user-supplied function to free the resource data, if needed.h]h>a user-supplied function to free the resource data, if needed.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhKhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhKhjPubj)}(h-``struct kunit_resource *res`` The resource. h](j)}(h``struct kunit_resource *res``h]j )}(hjh]hstruct kunit_resource *res}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j hjubah}(h]h ]h"]h$]h&]uh1jhe/var/lib/git/docbuild/linux/Documentation/dev-tools/kunit/api/resource:12: ./include/kunit/resource.hhKhjubj )}(hhh]h)}(h The resource.h]h The resource.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhKhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhKhjPubj)}(h2``const char *name`` name to be set for resource. h](j)}(h``const char *name``h]j )}(hj=h]hconst char *name}(hj?hhhNhNubah}(h]h ]h"]h$]h&]uh1j hj;ubah}(h]h ]h"]h$]h&]uh1jhe/var/lib/git/docbuild/linux/Documentation/dev-tools/kunit/api/resource:12: ./include/kunit/resource.hhKhj7ubj )}(hhh]h)}(hname to be set for resource.h]hname to be set for resource.}(hjVhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjRhKhjSubah}(h]h ]h"]h$]h&]uh1jhj7ubeh}(h]h ]h"]h$]h&]uh1jhjRhKhjPubj)}(hL``void *data`` value to pass to init function or set in resource data field.h](j)}(h``void *data``h]j )}(hjvh]h void *data}(hjxhhhNhNubah}(h]h ]h"]h$]h&]uh1j hjtubah}(h]h ]h"]h$]h&]uh1jhe/var/lib/git/docbuild/linux/Documentation/dev-tools/kunit/api/resource:12: ./include/kunit/resource.hhKhjpubj )}(hhh]h)}(h=value to pass to init function or set in resource data field.h]h=value to pass to init function or set in resource data field.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhe/var/lib/git/docbuild/linux/Documentation/dev-tools/kunit/api/resource:12: ./include/kunit/resource.hhKhjubah}(h]h ]h"]h$]h&]uh1jhjpubeh}(h]h ]h"]h$]h&]uh1jhjhKhjPubeh}(h]h ]h"]h$]h&]uh1jhj4ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhhhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j)kunit_alloc_and_get_resource (C function)c.kunit_alloc_and_get_resourcehNtauh1hhhhhhNhNubj )}(hhh](j)}(hstruct kunit_resource * kunit_alloc_and_get_resource (struct kunit *test, kunit_resource_init_t init, kunit_resource_free_t free, gfp_t internal_gfp, void *context)h]j)}(hstruct kunit_resource *kunit_alloc_and_get_resource(struct kunit *test, kunit_resource_init_t init, kunit_resource_free_t free, gfp_t internal_gfp, void *context)h](j)}(hj!h]hstruct}(hjhhhNhNubah}(h]h ]j*ah"]h$]h&]uh1jhjhhhe/var/lib/git/docbuild/linux/Documentation/dev-tools/kunit/api/resource:12: ./include/kunit/resource.hhKubj0)}(h h]h }(hjhhhNhNubah}(h]h ]j<ah"]h$]h&]uh1j/hjhhhjhKubh)}(hhh]jG)}(hkunit_resourceh]hkunit_resource}(hjhhhNhNubah}(h]h ]jRah"]h$]h&]uh1jFhjubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjmodnameN classnameNjj)}j]j)}jkunit_alloc_and_get_resourcesbc.kunit_alloc_and_get_resourceasbuh1hhjhhhjhKubj0)}(h h]h }(hjhhhNhNubah}(h]h ]j<ah"]h$]h&]uh1j/hjhhhjhKubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhjhKubjA)}(hkunit_alloc_and_get_resourceh]jG)}(hj h]hkunit_alloc_and_get_resource}(hj/hhhNhNubah}(h]h ]jRah"]h$]h&]uh1jFhj+ubah}(h]h ](jYjZeh"]h$]h&]hhuh1j@hjhhhjhKubj)}(ho(struct kunit *test, kunit_resource_init_t init, kunit_resource_free_t free, gfp_t internal_gfp, void *context)h](j)}(hstruct kunit *testh](j)}(hj!h]hstruct}(hjJhhhNhNubah}(h]h ]j*ah"]h$]h&]uh1jhjFubj0)}(h h]h }(hjWhhhNhNubah}(h]h ]j<ah"]h$]h&]uh1j/hjFubh)}(hhh]jG)}(hkunith]hkunit}(hjhhhhNhNubah}(h]h ]jRah"]h$]h&]uh1jFhjeubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjjmodnameN classnameNjj)}j]j c.kunit_alloc_and_get_resourceasbuh1hhjFubj0)}(h h]h }(hjhhhNhNubah}(h]h ]j<ah"]h$]h&]uh1j/hjFubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjFubjG)}(htesth]htest}(hjhhhNhNubah}(h]h ]jRah"]h$]h&]uh1jFhjFubeh}(h]h ]h"]h$]h&]noemphhhuh1jhjBubj)}(hkunit_resource_init_t inith](h)}(hhh]jG)}(hkunit_resource_init_th]hkunit_resource_init_t}(hjhhhNhNubah}(h]h ]jRah"]h$]h&]uh1jFhjubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjmodnameN classnameNjj)}j]j c.kunit_alloc_and_get_resourceasbuh1hhjubj0)}(h h]h }(hjhhhNhNubah}(h]h ]j<ah"]h$]h&]uh1j/hjubjG)}(hinith]hinit}(hjhhhNhNubah}(h]h ]jRah"]h$]h&]uh1jFhjubeh}(h]h ]h"]h$]h&]noemphhhuh1jhjBubj)}(hkunit_resource_free_t freeh](h)}(hhh]jG)}(hkunit_resource_free_th]hkunit_resource_free_t}(hjhhhNhNubah}(h]h ]jRah"]h$]h&]uh1jFhjubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjmodnameN classnameNjj)}j]j c.kunit_alloc_and_get_resourceasbuh1hhjubj0)}(h h]h }(hj#hhhNhNubah}(h]h ]j<ah"]h$]h&]uh1j/hjubjG)}(hfreeh]hfree}(hj1hhhNhNubah}(h]h ]jRah"]h$]h&]uh1jFhjubeh}(h]h ]h"]h$]h&]noemphhhuh1jhjBubj)}(hgfp_t internal_gfph](h)}(hhh]jG)}(hgfp_th]hgfp_t}(hjMhhhNhNubah}(h]h ]jRah"]h$]h&]uh1jFhjJubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjOmodnameN classnameNjj)}j]j c.kunit_alloc_and_get_resourceasbuh1hhjFubj0)}(h h]h }(hjkhhhNhNubah}(h]h ]j<ah"]h$]h&]uh1j/hjFubjG)}(h internal_gfph]h internal_gfp}(hjyhhhNhNubah}(h]h ]jRah"]h$]h&]uh1jFhjFubeh}(h]h ]h"]h$]h&]noemphhhuh1jhjBubj)}(h void *contexth](jZ)}(hvoidh]hvoid}(hjhhhNhNubah}(h]h ]jfah"]h$]h&]uh1jYhjubj0)}(h h]h }(hjhhhNhNubah}(h]h ]j<ah"]h$]h&]uh1j/hjubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubjG)}(hcontexth]hcontext}(hjhhhNhNubah}(h]h ]jRah"]h$]h&]uh1jFhjubeh}(h]h ]h"]h$]h&]noemphhhuh1jhjBubeh}(h]h ]h"]h$]h&]hhuh1jhjhhhjhKubeh}(h]h ]h"]h$]h&]hhjduh1jjejfhjhhhjhKubah}(h]jah ](jjjkeh"]h$]h&]jojp)jqhuh1jhjhKhjhhubjs)}(hhh]h)}(h0Allocates and returns a *test managed resource*.h](hAllocates and returns a }(hjhhhNhNubj)}(h*test managed resource*h]htest managed resource}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhe/var/lib/git/docbuild/linux/Documentation/dev-tools/kunit/api/resource:12: ./include/kunit/resource.hhKhjhhubah}(h]h ]h"]h$]h&]uh1jrhjhhhjhKubeh}(h]h ](jfunctioneh"]h$]h&]jjjjjjjjjuh1j hhhhhNhNubj)}(hX**Parameters** ``struct kunit *test`` The test context object. ``kunit_resource_init_t init`` a user supplied function to initialize the resource. ``kunit_resource_free_t free`` a user supplied function to free the resource (if needed). ``gfp_t internal_gfp`` gfp to use for internal allocations, if unsure, use GFP_KERNEL ``void *context`` for the user to pass in arbitrary data to the init function. **Description** Allocates a *test managed resource*, a resource which will automatically be cleaned up at the end of a test case. See :c:type:`struct kunit_resource ` for an example. This is effectively identical to kunit_alloc_resource, but returns the struct kunit_resource pointer, not just the 'data' pointer. It therefore also increments the resource's refcount, so kunit_put_resource() should be called when you've finished with it. **Note** KUnit needs to allocate memory for a kunit_resource object. You must specify an **internal_gfp** that is compatible with the use context of your resource.h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhe/var/lib/git/docbuild/linux/Documentation/dev-tools/kunit/api/resource:12: ./include/kunit/resource.hhKhjubj)}(hhh](j)}(h0``struct kunit *test`` The test context object. h](j)}(h``struct kunit *test``h]j )}(hj8h]hstruct kunit *test}(hj:hhhNhNubah}(h]h ]h"]h$]h&]uh1j hj6ubah}(h]h ]h"]h$]h&]uh1jhe/var/lib/git/docbuild/linux/Documentation/dev-tools/kunit/api/resource:12: ./include/kunit/resource.hhKhj2ubj )}(hhh]h)}(hThe test context object.h]hThe test context object.}(hjQhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjMhKhjNubah}(h]h ]h"]h$]h&]uh1jhj2ubeh}(h]h ]h"]h$]h&]uh1jhjMhKhj/ubj)}(hT``kunit_resource_init_t init`` a user supplied function to initialize the resource. h](j)}(h``kunit_resource_init_t init``h]j )}(hjqh]hkunit_resource_init_t init}(hjshhhNhNubah}(h]h ]h"]h$]h&]uh1j hjoubah}(h]h ]h"]h$]h&]uh1jhe/var/lib/git/docbuild/linux/Documentation/dev-tools/kunit/api/resource:12: ./include/kunit/resource.hhKhjkubj )}(hhh]h)}(h4a user supplied function to initialize the resource.h]h4a user supplied function to initialize the resource.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhKhjubah}(h]h ]h"]h$]h&]uh1jhjkubeh}(h]h ]h"]h$]h&]uh1jhjhKhj/ubj)}(hZ``kunit_resource_free_t free`` a user supplied function to free the resource (if needed). h](j)}(h``kunit_resource_free_t free``h]j )}(hjh]hkunit_resource_free_t free}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j hjubah}(h]h ]h"]h$]h&]uh1jhe/var/lib/git/docbuild/linux/Documentation/dev-tools/kunit/api/resource:12: ./include/kunit/resource.hhKhjubj )}(hhh]h)}(h:a user supplied function to free the resource (if needed).h]h:a user supplied function to free the resource (if needed).}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhKhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjh=Khj/ubj)}(hV``gfp_t internal_gfp`` gfp to use for internal allocations, if unsure, use GFP_KERNEL h](j)}(h``gfp_t internal_gfp``h]j )}(hjh]hgfp_t internal_gfp}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j hjubah}(h]h ]h"]h$]h&]uh1jhe/var/lib/git/docbuild/linux/Documentation/dev-tools/kunit/api/resource:12: ./include/kunit/resource.hhKhjubj )}(hhh]h)}(h>gfp to use for internal allocations, if unsure, use GFP_KERNELh]h>gfp to use for internal allocations, if unsure, use GFP_KERNEL}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhKhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhKhj/ubj)}(hO``void *context`` for the user to pass in arbitrary data to the init function. h](j)}(h``void *context``h]j )}(hjh]h void *context}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j hjubah}(h]h ]h"]h$]h&]uh1jhe/var/lib/git/docbuild/linux/Documentation/dev-tools/kunit/api/resource:12: ./include/kunit/resource.hhKhjubj )}(hhh]h)}(h` for an example.h](h Allocates a }(hjmhhhNhNubj)}(h*test managed resource*h]htest managed resource}(hjuhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjmubhS, a resource which will automatically be cleaned up at the end of a test case. See }(hjmhhhNhNubh)}(h0:c:type:`struct kunit_resource `h]j )}(hjh]hstruct kunit_resource}(hjhhhNhNubah}(h]h ](xrefjc-typeeh"]h$]h&]uh1j hjubah}(h]h ]h"]h$]h&]refdocdev-tools/kunit/api/resource refdomainjreftypetype refexplicitrefwarnjj)}j]sb reftargetkunit_resourceuh1hhe/var/lib/git/docbuild/linux/Documentation/dev-tools/kunit/api/resource:12: ./include/kunit/resource.hhKhjmubh for an example.}(hjmhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhjhKhjubh)}(hThis is effectively identical to kunit_alloc_resource, but returns the struct kunit_resource pointer, not just the 'data' pointer. It therefore also increments the resource's refcount, so kunit_put_resource() should be called when you've finished with it.h]hXThis is effectively identical to kunit_alloc_resource, but returns the struct kunit_resource pointer, not just the ‘data’ pointer. It therefore also increments the resource’s refcount, so kunit_put_resource() should be called when you’ve finished with it.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhe/var/lib/git/docbuild/linux/Documentation/dev-tools/kunit/api/resource:12: ./include/kunit/resource.hhKhjubh)}(h**Note**h]j)}(hjh]hNote}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhe/var/lib/git/docbuild/linux/Documentation/dev-tools/kunit/api/resource:12: ./include/kunit/resource.hhKhjubh)}(hKUnit needs to allocate memory for a kunit_resource object. You must specify an **internal_gfp** that is compatible with the use context of your resource.h](hPKUnit needs to allocate memory for a kunit_resource object. You must specify an }(hjhhhNhNubj)}(h**internal_gfp**h]h internal_gfp}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh: that is compatible with the use context of your resource.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhe/var/lib/git/docbuild/linux/Documentation/dev-tools/kunit/api/resource:12: ./include/kunit/resource.hhKhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhhhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j!kunit_alloc_resource (C function)c.kunit_alloc_resourcehNtauh1hhhhhhNhNubj )}(hhh](j)}(hvoid * kunit_alloc_resource (struct kunit *test, kunit_resource_init_t init, kunit_resource_free_t free, gfp_t internal_gfp, void *context)h]j)}(hvoid *kunit_alloc_resource(struct kunit *test, kunit_resource_init_t init, kunit_resource_free_t free, gfp_t internal_gfp, void *context)h](jZ)}(hvoidh]hvoid}(hjhhhNhNubah}(h]h ]jfah"]h$]h&]uh1jYhjhhhe/var/lib/git/docbuild/linux/Documentation/dev-tools/kunit/api/resource:12: ./include/kunit/resource.hhM ubj0)}(h h]h }(hj.hhhNhNubah}(h]h ]j<ah"]h$]h&]uh1j/hjhhhj-hM ubj)}(hjh]h*}(hj<hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhj-hM ubjA)}(hkunit_alloc_resourceh]jG)}(hkunit_alloc_resourceh]hkunit_alloc_resource}(hjMhhhNhNubah}(h]h ]jRah"]h$]h&]uh1jFhjIubah}(h]h ](jYjZeh"]h$]h&]hhuh1j@hjhhhj-hM ubj)}(ho(struct kunit *test, kunit_resource_init_t init, kunit_resource_free_t free, gfp_t internal_gfp, void *context)h](j)}(hstruct kunit *testh](j)}(hj!h]hstruct}(hjihhhNhNubah}(h]h ]j*ah"]h$]h&]uh1jhjeubj0)}(h h]h }(hjvhhhNhNubah}(h]h ]j<ah"]h$]h&]uh1j/hjeubh)}(hhh]jG)}(hkunith]hkunit}(hjhhhNhNubah}(h]h ]jRah"]h$]h&]uh1jFhjubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjmodnameN classnameNjj)}j]j)}jjOsbc.kunit_alloc_resourceasbuh1hhjeubj0)}(h h]h }(hjhhhNhNubah}(h]h ]j<ah"]h$]h&]uh1j/hjeubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjeubjG)}(htesth]htest}(hjhhhNhNubah}(h]h ]jRah"]h$]h&]uh1jFhjeubeh}(h]h ]h"]h$]h&]noemphhhuh1jhjaubj)}(hkunit_resource_init_t inith](h)}(hhh]jG)}(hkunit_resource_init_th]hkunit_resource_init_t}(hjhhhNhNubah}(h]h ]jRah"]h$]h&]uh1jFhjubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjmodnameN classnameNjj)}j]jc.kunit_alloc_resourceasbuh1hhjubj0)}(h h]h }(hjhhhNhNubah}(h]h ]j<ah"]h$]h&]uh1j/hjubjG)}(hinith]hinit}(hj hhhNhNubah}(h]h ]jRah"]h$]h&]uh1jFhjubeh}(h]h ]h"]h$]h&]noemphhhuh1jhjaubj)}(hkunit_resource_free_t freeh](h)}(hhh]jG)}(hkunit_resource_free_th]hkunit_resource_free_t}(hj&hhhNhNubah}(h]h ]jRah"]h$]h&]uh1jFhj#ubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetj(modnameN classnameNjj)}j]jc.kunit_alloc_resourceasbuh1hhjubj0)}(h h]h }(hjDhhhNhNubah}(h]h ]j<ah"]h$]h&]uh1j/hjubjG)}(hfreeh]hfree}(hjRhhhNhNubah}(h]h ]jRah"]h$]h&]uh1jFhjubeh}(h]h ]h"]h$]h&]noemphhhuh1jhjaubj)}(hgfp_t internal_gfph](h)}(hhh]jG)}(hgfp_th]hgfp_t}(hjnhhhNhNubah}(h]h ]jRah"]h$]h&]uh1jFhjkubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjpmodnameN classnameNjj)}j]jc.kunit_alloc_resourceasbuh1hhjgubj0)}(h h]h }(hjhhhNhNubah}(h]h ]j<ah"]h$]h&]uh1j/hjgubjG)}(h internal_gfph]h internal_gfp}(hjhhhNhNubah}(h]h ]jRah"]h$]h&]uh1jFhjgubeh}(h]h ]h"]h$]h&]noemphhhuh1jhjaubj)}(h void *contexth](jZ)}(hvoidh]hvoid}(hjhhhNhNubah}(h]h ]jfah"]h$]h&]uh1jYhjubj0)}(h h]h }(hjhhhNhNubah}(h]h ]j<ah"]h$]h&]uh1j/hjubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubjG)}(hcontexth]hcontext}(hjhhhNhNubah}(h]h ]jRah"]h$]h&]uh1jFhjubeh}(h]h ]h"]h$]h&]noemphhhuh1jhjaubeh}(h]h ]h"]h$]h&]hhuh1jhjhhhj-hM ubeh}(h]h ]h"]h$]h&]hhjduh1jjejfhjhhhj-hM ubah}(h]jah ](jjjkeh"]h$]h&]jojp)jqhuh1jhj-hM hjhhubjs)}(hhh]h)}(h$Allocates a *test managed resource*.h](h Allocates a }(hjhhhNhNubj)}(h*test managed resource*h]htest managed resource}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhe/var/lib/git/docbuild/linux/Documentation/dev-tools/kunit/api/resource:12: ./include/kunit/resource.hhM hjhhubah}(h]h ]h"]h$]h&]uh1jrhjhhhj-hM ubeh}(h]h ](jfunctioneh"]h$]h&]jjjj0jj0jjjuh1j hhhhhNhNubj)}(hX**Parameters** ``struct kunit *test`` The test context object. ``kunit_resource_init_t init`` a user supplied function to initialize the resource. ``kunit_resource_free_t free`` a user supplied function to free the resource (if needed). ``gfp_t internal_gfp`` gfp to use for internal allocations, if unsure, use GFP_KERNEL ``void *context`` for the user to pass in arbitrary data to the init function. **Description** Allocates a *test managed resource*, a resource which will automatically be cleaned up at the end of a test case. See :c:type:`struct kunit_resource ` for an example. **Note** KUnit needs to allocate memory for a kunit_resource object. You must specify an **internal_gfp** that is compatible with the use context of your resource.h](h)}(h**Parameters**h]j)}(hj:h]h Parameters}(hj<hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj8ubah}(h]h ]h"]h$]h&]uh1hhe/var/lib/git/docbuild/linux/Documentation/dev-tools/kunit/api/resource:12: ./include/kunit/resource.hhM hj4ubj)}(hhh](j)}(h0``struct kunit *test`` The test context object. h](j)}(h``struct kunit *test``h]j )}(hjYh]hstruct kunit *test}(hj[hhhNhNubah}(h]h ]h"]h$]h&]uh1j hjWubah}(h]h ]h"]h$]h&]uh1jhe/var/lib/git/docbuild/linux/Documentation/dev-tools/kunit/api/resource:12: ./include/kunit/resource.hhM hjSubj )}(hhh]h)}(hThe test context object.h]hThe test context object.}(hjrhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjnhM hjoubah}(h]h ]h"]h$]h&]uh1jhjSubeh}(h]h ]h"]h$]h&]uh1jhjnhM hjPubj)}(hT``kunit_resource_init_t init`` a user supplied function to initialize the resource. h](j)}(h``kunit_resource_init_t init``h]j )}(hjh]hkunit_resource_init_t init}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j hjubah}(h]h ]h"]h$]h&]uh1jhe/var/lib/git/docbuild/linux/Documentation/dev-tools/kunit/api/resource:12: ./include/kunit/resource.hhM hjubj )}(hhh]h)}(h4a user supplied function to initialize the resource.h]h4a user supplied function to initialize the resource.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhM hjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhM hjPubj)}(hZ``kunit_resource_free_t free`` a user supplied function to free the resource (if needed). h](j)}(h``kunit_resource_free_t free``h]j )}(hjh]hkunit_resource_free_t free}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j hjubah}(h]h ]h"]h$]h&]uh1jhe/var/lib/git/docbuild/linux/Documentation/dev-tools/kunit/api/resource:12: ./include/kunit/resource.hhM hjubj )}(hhh]h)}(h:a user supplied function to free the resource (if needed).h]h:a user supplied function to free the resource (if needed).}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhM hjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhM hjPubj)}(hV``gfp_t internal_gfp`` gfp to use for internal allocations, if unsure, use GFP_KERNEL h](j)}(h``gfp_t internal_gfp``h]j )}(hjh]hgfp_t internal_gfp}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j hjubah}(h]h ]h"]h$]h&]uh1jhe/var/lib/git/docbuild/linux/Documentation/dev-tools/kunit/api/resource:12: ./include/kunit/resource.hhM hjubj )}(hhh]h)}(h>gfp to use for internal allocations, if unsure, use GFP_KERNELh]h>gfp to use for internal allocations, if unsure, use GFP_KERNEL}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhM hjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhM hjPubj)}(hO``void *context`` for the user to pass in arbitrary data to the init function. h](j)}(h``void *context``h]j )}(hj=h]h void *context}(hj?hhhNhNubah}(h]h ]h"]h$]h&]uh1j hj;ubah}(h]h ]h"]h$]h&]uh1jhe/var/lib/git/docbuild/linux/Documentation/dev-tools/kunit/api/resource:12: ./include/kunit/resource.hhMhj7ubj )}(hhh]h)}(h` for an example.h](h Allocates a }(hjhhhNhNubj)}(h*test managed resource*h]htest managed resource}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubhS, a resource which will automatically be cleaned up at the end of a test case. See }(hjhhhNhNubh)}(h0:c:type:`struct kunit_resource `h]j )}(hjh]hstruct kunit_resource}(hjhhhNhNubah}(h]h ](jjc-typeeh"]h$]h&]uh1j hjubah}(h]h ]h"]h$]h&]refdocj refdomainjreftypetype refexplicitrefwarnjjjkunit_resourceuh1hhe/var/lib/git/docbuild/linux/Documentation/dev-tools/kunit/api/resource:12: ./include/kunit/resource.hhMhjubh for an example.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhjhMhj4ubh)}(h**Note**h]j)}(hjh]hNote}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhe/var/lib/git/docbuild/linux/Documentation/dev-tools/kunit/api/resource:12: ./include/kunit/resource.hhMhj4ubh)}(hKUnit needs to allocate memory for a kunit_resource object. You must specify an **internal_gfp** that is compatible with the use context of your resource.h](hPKUnit needs to allocate memory for a kunit_resource object. You must specify an }(hjhhhNhNubj)}(h**internal_gfp**h]h internal_gfp}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh: that is compatible with the use context of your resource.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhe/var/lib/git/docbuild/linux/Documentation/dev-tools/kunit/api/resource:12: ./include/kunit/resource.hhMhj4ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhhhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j&kunit_resource_name_match (C function)c.kunit_resource_name_matchhNtauh1hhhhhhNhNubj )}(hhh](j)}(habool kunit_resource_name_match (struct kunit *test, struct kunit_resource *res, void *match_name)h]j)}(h`bool kunit_resource_name_match(struct kunit *test, struct kunit_resource *res, void *match_name)h](jZ)}(hboolh]hbool}(hj+hhhNhNubah}(h]h ]jfah"]h$]h&]uh1jYhj'hhhe/var/lib/git/docbuild/linux/Documentation/dev-tools/kunit/api/resource:12: ./include/kunit/resource.hhM0ubj0)}(h h]h }(hj:hhhNhNubah}(h]h ]j<ah"]h$]h&]uh1j/hj'hhhj9hM0ubjA)}(hkunit_resource_name_matchh]jG)}(hkunit_resource_name_matchh]hkunit_resource_name_match}(hjLhhhNhNubah}(h]h ]jRah"]h$]h&]uh1jFhjHubah}(h]h ](jYjZeh"]h$]h&]hhuh1j@hj'hhhj9hM0ubj)}(hB(struct kunit *test, struct kunit_resource *res, void *match_name)h](j)}(hstruct kunit *testh](j)}(hj!h]hstruct}(hjhhhhNhNubah}(h]h ]j*ah"]h$]h&]uh1jhjdubj0)}(h h]h }(hjuhhhNhNubah}(h]h ]j<ah"]h$]h&]uh1j/hjdubh)}(hhh]jG)}(hkunith]hkunit}(hjhhhNhNubah}(h]h ]jRah"]h$]h&]uh1jFhjubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjmodnameN classnameNjj)}j]j)}jjNsbc.kunit_resource_name_matchasbuh1hhjdubj0)}(h h]h }(hjhhhNhNubah}(h]h ]j<ah"]h$]h&]uh1j/hjdubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjdubjG)}(htesth]htest}(hjhhhNhNubah}(h]h ]jRah"]h$]h&]uh1jFhjdubeh}(h]h ]h"]h$]h&]noemphhhuh1jhj`ubj)}(hstruct kunit_resource *resh](j)}(hj!h]hstruct}(hjhhhNhNubah}(h]h ]j*ah"]h$]h&]uh1jhjubj0)}(h h]h }(hjhhhNhNubah}(h]h ]j<ah"]h$]h&]uh1j/hjubh)}(hhh]jG)}(hkunit_resourceh]hkunit_resource}(hjhhhNhNubah}(h]h ]jRah"]h$]h&]uh1jFhjubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjmodnameN classnameNjj)}j]jc.kunit_resource_name_matchasbuh1hhjubj0)}(h h]h }(hjhhhNhNubah}(h]h ]j<ah"]h$]h&]uh1j/hjubj)}(hjh]h*}(hj$hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubjG)}(hresh]hres}(hj1hhhNhNubah}(h]h ]jRah"]h$]h&]uh1jFhjubeh}(h]h ]h"]h$]h&]noemphhhuh1jhj`ubj)}(hvoid *match_nameh](jZ)}(hvoidh]hvoid}(hjJhhhNhNubah}(h]h ]jfah"]h$]h&]uh1jYhjFubj0)}(h h]h }(hjXhhhNhNubah}(h]h ]j<ah"]h$]h&]uh1j/hjFubj)}(hjh]h*}(hjfhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjFubjG)}(h match_nameh]h match_name}(hjshhhNhNubah}(h]h ]jRah"]h$]h&]uh1jFhjFubeh}(h]h ]h"]h$]h&]noemphhhuh1jhj`ubeh}(h]h ]h"]h$]h&]hhuh1jhj'hhhj9hM0ubeh}(h]h ]h"]h$]h&]hhjduh1jjejfhj#hhhj9hM0ubah}(h]jah ](jjjkeh"]h$]h&]jojp)jqhuh1jhj9hM0hj hhubjs)}(hhh]h)}(h$Match a resource with the same name.h]h$Match a resource with the same name.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhe/var/lib/git/docbuild/linux/Documentation/dev-tools/kunit/api/resource:12: ./include/kunit/resource.hhM0hjhhubah}(h]h ]h"]h$]h&]uh1jrhj hhhj9hM0ubeh}(h]h ](jfunctioneh"]h$]h&]jjjjjjjjjuh1j hhhhhNhNubj)}(h**Parameters** ``struct kunit *test`` Test case to which the resource belongs. ``struct kunit_resource *res`` The resource. ``void *match_name`` The name to match against.h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhe/var/lib/git/docbuild/linux/Documentation/dev-tools/kunit/api/resource:12: ./include/kunit/resource.hhM4hjubj)}(hhh](j)}(h@``struct kunit *test`` Test case to which the resource belongs. h](j)}(h``struct kunit *test``h]j )}(hjh]hstruct kunit *test}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j hjubah}(h]h ]h"]h$]h&]uh1jhe/var/lib/git/docbuild/linux/Documentation/dev-tools/kunit/api/resource:12: ./include/kunit/resource.hhM1hjubj )}(hhh]h)}(h(Test case to which the resource belongs.h]h(Test case to which the resource belongs.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhM1hjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhM1hjubj)}(h-``struct kunit_resource *res`` The resource. h](j)}(h``struct kunit_resource *res``h]j )}(hjh]hstruct kunit_resource *res}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j hjubah}(h]h ]h"]h$]h&]uh1jhe/var/lib/git/docbuild/linux/Documentation/dev-tools/kunit/api/resource:12: ./include/kunit/resource.hhM2hjubj )}(hhh]h)}(h The resource.h]h The resource.}(hj0hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj,hM2hj-ubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhj,hM2hjubj)}(h/``void *match_name`` The name to match against.h](j)}(h``void *match_name``h]j )}(hjPh]hvoid *match_name}(hjRhhhNhNubah}(h]h ]h"]h$]h&]uh1j hjNubah}(h]h ]h"]h$]h&]uh1jhe/var/lib/git/docbuild/linux/Documentation/dev-tools/kunit/api/resource:12: ./include/kunit/resource.hhM4hjJubj )}(hhh]h)}(hThe name to match against.h]hThe name to match against.}(hjihhhNhNubah}(h]h ]h"]h$]h&]uh1hhe/var/lib/git/docbuild/linux/Documentation/dev-tools/kunit/api/resource:12: ./include/kunit/resource.hhM3hjfubah}(h]h ]h"]h$]h&]uh1jhjJubeh}(h]h ]h"]h$]h&]uh1jhjehM4hjubeh}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhhhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j kunit_find_resource (C function)c.kunit_find_resourcehNtauh1hhhhhhNhNubj )}(hhh](j)}(hpstruct kunit_resource * kunit_find_resource (struct kunit *test, kunit_resource_match_t match, void *match_data)h]j)}(hnstruct kunit_resource *kunit_find_resource(struct kunit *test, kunit_resource_match_t match, void *match_data)h](j)}(hj!h]hstruct}(hjhhhNhNubah}(h]h ]j*ah"]h$]h&]uh1jhjhhhe/var/lib/git/docbuild/linux/Documentation/dev-tools/kunit/api/resource:12: ./include/kunit/resource.hhM=ubj0)}(h h]h }(hjhhhNhNubah}(h]h ]j<ah"]h$]h&]uh1j/hjhhhjhM=ubh)}(hhh]jG)}(hkunit_resourceh]hkunit_resource}(hjhhhNhNubah}(h]h ]jRah"]h$]h&]uh1jFhjubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjmodnameN classnameNjj)}j]j)}jkunit_find_resourcesbc.kunit_find_resourceasbuh1hhjhhhjhM=ubj0)}(h h]h }(hjhhhNhNubah}(h]h ]j<ah"]h$]h&]uh1j/hjhhhjhM=ubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhjhM=ubjA)}(hkunit_find_resourceh]jG)}(hjh]hkunit_find_resource}(hj hhhNhNubah}(h]h ]jRah"]h$]h&]uh1jFhjubah}(h]h ](jYjZeh"]h$]h&]hhuh1j@hjhhhjhM=ubj)}(hD(struct kunit *test, kunit_resource_match_t match, void *match_data)h](j)}(hstruct kunit *testh](j)}(hj!h]hstruct}(hj$hhhNhNubah}(h]h ]j*ah"]h$]h&]uh1jhj ubj0)}(h h]h }(hj1hhhNhNubah}(h]h ]j<ah"]h$]h&]uh1j/hj ubh)}(hhh]jG)}(hkunith]hkunit}(hjBhhhNhNubah}(h]h ]jRah"]h$]h&]uh1jFhj?ubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjDmodnameN classnameNjj)}j]jc.kunit_find_resourceasbuh1hhj ubj0)}(h h]h }(hj`hhhNhNubah}(h]h ]j<ah"]h$]h&]uh1j/hj ubj)}(hjh]h*}(hjnhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubjG)}(htesth]htest}(hj{hhhNhNubah}(h]h ]jRah"]h$]h&]uh1jFhj ubeh}(h]h ]h"]h$]h&]noemphhhuh1jhjubj)}(hkunit_resource_match_t matchh](h)}(hhh]jG)}(hkunit_resource_match_th]hkunit_resource_match_t}(hjhhhNhNubah}(h]h ]jRah"]h$]h&]uh1jFhjubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjmodnameN classnameNjj)}j]jc.kunit_find_resourceasbuh1hhjubj0)}(h h]h }(hjhhhNhNubah}(h]h ]j<ah"]h$]h&]uh1j/hjubjG)}(hmatchh]hmatch}(hjhhhNhNubah}(h]h ]jRah"]h$]h&]uh1jFhjubeh}(h]h ]h"]h$]h&]noemphhhuh1jhjubj)}(hvoid *match_datah](jZ)}(hvoidh]hvoid}(hjhhhNhNubah}(h]h ]jfah"]h$]h&]uh1jYhjubj0)}(h h]h }(hjhhhNhNubah}(h]h ]j<ah"]h$]h&]uh1j/hjubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubjG)}(h match_datah]h match_data}(hjhhhNhNubah}(h]h ]jRah"]h$]h&]uh1jFhjubeh}(h]h ]h"]h$]h&]noemphhhuh1jhjubeh}(h]h ]h"]h$]h&]hhuh1jhjhhhjhM=ubeh}(h]h ]h"]h$]h&]hhjduh1jjejfhjhhhjhM=ubah}(h]jah ](jjjkeh"]h$]h&]jojp)jqhuh1jhjhM=hjhhubjs)}(hhh]h)}(h*Find a resource using match function/data.h]h*Find a resource using match function/data.}(hj/hhhNhNubah}(h]h ]h"]h$]h&]uh1hhe/var/lib/git/docbuild/linux/Documentation/dev-tools/kunit/api/resource:12: ./include/kunit/resource.hhM=hj,hhubah}(h]h ]h"]h$]h&]uh1jrhjhhhjhM=ubeh}(h]h ](jfunctioneh"]h$]h&]jjjjGjjGjjjuh1j hhhhhNhNubj)}(h**Parameters** ``struct kunit *test`` Test case to which the resource belongs. ``kunit_resource_match_t match`` match function to be applied to resources/match data. ``void *match_data`` data to be used in matching.h](h)}(h**Parameters**h]j)}(hjQh]h Parameters}(hjShhhNhNubah}(h]h ]h"]h$]h&]uh1jhjOubah}(h]h ]h"]h$]h&]uh1hhe/var/lib/git/docbuild/linux/Documentation/dev-tools/kunit/api/resource:12: ./include/kunit/resource.hhMAhjKubj)}(hhh](j)}(h@``struct kunit *test`` Test case to which the resource belongs. h](j)}(h``struct kunit *test``h]j )}(hjph]hstruct kunit *test}(hjrhhhNhNubah}(h]h ]h"]h$]h&]uh1j hjnubah}(h]h ]h"]h$]h&]uh1jhe/var/lib/git/docbuild/linux/Documentation/dev-tools/kunit/api/resource:12: ./include/kunit/resource.hhM>hjjubj )}(hhh]h)}(h(Test case to which the resource belongs.h]h(Test case to which the resource belongs.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhM>hjubah}(h]h ]h"]h$]h&]uh1jhjjubeh}(h]h ]h"]h$]h&]uh1jhjhM>hjgubj)}(hW``kunit_resource_match_t match`` match function to be applied to resources/match data. h](j)}(h ``kunit_resource_match_t match``h]j )}(hjh]hkunit_resource_match_t match}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j hjubah}(h]h ]h"]h$]h&]uh1jhe/var/lib/git/docbuild/linux/Documentation/dev-tools/kunit/api/resource:12: ./include/kunit/resource.hhM?hjubj )}(hhh]h)}(h5match function to be applied to resources/match data.h]h5match function to be applied to resources/match data.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhM?hjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhM?hjgubj)}(h1``void *match_data`` data to be used in matching.h](j)}(h``void *match_data``h]j )}(hjh]hvoid *match_data}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j hjubah}(h]h ]h"]h$]h&]uh1jhe/var/lib/git/docbuild/linux/Documentation/dev-tools/kunit/api/resource:12: ./include/kunit/resource.hhMAhjubj )}(hhh]h)}(hdata to be used in matching.h]hdata to be used in matching.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhe/var/lib/git/docbuild/linux/Documentation/dev-tools/kunit/api/resource:12: ./include/kunit/resource.hhM@hjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhMAhjgubeh}(h]h ]h"]h$]h&]uh1jhjKubeh}(h]h ] kernelindentah"]h$]h&]uh1jhhhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j&kunit_find_named_resource (C function)c.kunit_find_named_resourcehNtauh1hhhhhhNhNubj )}(hhh](j)}(hXstruct kunit_resource * kunit_find_named_resource (struct kunit *test, const char *name)h]j)}(hVstruct kunit_resource *kunit_find_named_resource(struct kunit *test, const char *name)h](j)}(hj!h]hstruct}(hj<hhhNhNubah}(h]h ]j*ah"]h$]h&]uh1jhj8hhhe/var/lib/git/docbuild/linux/Documentation/dev-tools/kunit/api/resource:12: ./include/kunit/resource.hhMZubj0)}(h h]h }(hjJhhhNhNubah}(h]h ]j<ah"]h$]h&]uh1j/hj8hhhjIhMZubh)}(hhh]jG)}(hkunit_resourceh]hkunit_resource}(hj[hhhNhNubah}(h]h ]jRah"]h$]h&]uh1jFhjXubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetj]modnameN classnameNjj)}j]j)}jkunit_find_named_resourcesbc.kunit_find_named_resourceasbuh1hhj8hhhjIhMZubj0)}(h h]h }(hj|hhhNhNubah}(h]h ]j<ah"]h$]h&]uh1j/hj8hhhjIhMZubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj8hhhjIhMZubjA)}(hkunit_find_named_resourceh]jG)}(hjyh]hkunit_find_named_resource}(hjhhhNhNubah}(h]h ]jRah"]h$]h&]uh1jFhjubah}(h]h ](jYjZeh"]h$]h&]hhuh1j@hj8hhhjIhMZubj)}(h&(struct kunit *test, const char *name)h](j)}(hstruct kunit *testh](j)}(hj!h]hstruct}(hjhhhNhNubah}(h]h ]j*ah"]h$]h&]uh1jhjubj0)}(h h]h }(hjhhhNhNubah}(h]h ]j<ah"]h$]h&]uh1j/hjubh)}(hhh]jG)}(hkunith]hkunit}(hjhhhNhNubah}(h]h ]jRah"]h$]h&]uh1jFhjubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjmodnameN classnameNjj)}j]jwc.kunit_find_named_resourceasbuh1hhjubj0)}(h h]h }(hjhhhNhNubah}(h]h ]j<ah"]h$]h&]uh1j/hjubj)}(hjh]h*}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubjG)}(htesth]htest}(hj hhhNhNubah}(h]h ]jRah"]h$]h&]uh1jFhjubeh}(h]h ]h"]h$]h&]noemphhhuh1jhjubj)}(hconst char *nameh](j)}(hjWh]hconst}(hj& hhhNhNubah}(h]h ]j*ah"]h$]h&]uh1jhj" ubj0)}(h h]h }(hj3 hhhNhNubah}(h]h ]j<ah"]h$]h&]uh1j/hj" ubjZ)}(hcharh]hchar}(hjA hhhNhNubah}(h]h ]jfah"]h$]h&]uh1jYhj" ubj0)}(h h]h }(hjO hhhNhNubah}(h]h ]j<ah"]h$]h&]uh1j/hj" ubj)}(hjh]h*}(hj] hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj" ubjG)}(hnameh]hname}(hjj hhhNhNubah}(h]h ]jRah"]h$]h&]uh1jFhj" ubeh}(h]h ]h"]h$]h&]noemphhhuh1jhjubeh}(h]h ]h"]h$]h&]hhuh1jhj8hhhjIhMZubeh}(h]h ]h"]h$]h&]hhjduh1jjejfhj4hhhjIhMZubah}(h]j/ah ](jjjkeh"]h$]h&]jojp)jqhuh1jhjIhMZhj1hhubjs)}(hhh]h)}(h!Find a resource using match name.h]h!Find a resource using match name.}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhe/var/lib/git/docbuild/linux/Documentation/dev-tools/kunit/api/resource:12: ./include/kunit/resource.hhMZhj hhubah}(h]h ]h"]h$]h&]uh1jrhj1hhhjIhMZubeh}(h]h ](jfunctioneh"]h$]h&]jjjj jj jjjuh1j hhhhhNhNubj)}(hu**Parameters** ``struct kunit *test`` Test case to which the resource belongs. ``const char *name`` match name.h](h)}(h**Parameters**h]j)}(hj h]h Parameters}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1hhe/var/lib/git/docbuild/linux/Documentation/dev-tools/kunit/api/resource:12: ./include/kunit/resource.hhM^hj ubj)}(hhh](j)}(h@``struct kunit *test`` Test case to which the resource belongs. h](j)}(h``struct kunit *test``h]j )}(hj h]hstruct kunit *test}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1j hj ubah}(h]h ]h"]h$]h&]uh1jhe/var/lib/git/docbuild/linux/Documentation/dev-tools/kunit/api/resource:12: ./include/kunit/resource.hhM[hj ubj )}(hhh]h)}(h(Test case to which the resource belongs.h]h(Test case to which the resource belongs.}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj hM[hj ubah}(h]h ]h"]h$]h&]uh1jhj ubeh}(h]h ]h"]h$]h&]uh1jhj hM[hj ubj)}(h ``const char *name`` match name.h](j)}(h``const char *name``h]j )}(hj!h]hconst char *name}(hj!hhhNhNubah}(h]h ]h"]h$]h&]uh1j hj !ubah}(h]h ]h"]h$]h&]uh1jhe/var/lib/git/docbuild/linux/Documentation/dev-tools/kunit/api/resource:12: ./include/kunit/resource.hhM]hj!ubj )}(hhh]h)}(h match name.h]h match name.}(hj'!hhhNhNubah}(h]h ]h"]h$]h&]uh1hhe/var/lib/git/docbuild/linux/Documentation/dev-tools/kunit/api/resource:12: ./include/kunit/resource.hhM\hj$!ubah}(h]h ]h"]h$]h&]uh1jhj!ubeh}(h]h ]h"]h$]h&]uh1jhj#!hM]hj ubeh}(h]h ]h"]h$]h&]uh1jhj ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhhhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j#kunit_destroy_resource (C function)c.kunit_destroy_resourcehNtauh1hhhhhhNhNubj )}(hhh](j)}(h_int kunit_destroy_resource (struct kunit *test, kunit_resource_match_t match, void *match_data)h]j)}(h^int kunit_destroy_resource(struct kunit *test, kunit_resource_match_t match, void *match_data)h](jZ)}(hinth]hint}(hjh!hhhNhNubah}(h]h ]jfah"]h$]h&]uh1jYhjd!hhhe/var/lib/git/docbuild/linux/Documentation/dev-tools/kunit/api/resource:12: ./include/kunit/resource.hhMgubj0)}(h h]h }(hjw!hhhNhNubah}(h]h ]j<ah"]h$]h&]uh1j/hjd!hhhjv!hMgubjA)}(hkunit_destroy_resourceh]jG)}(hkunit_destroy_resourceh]hkunit_destroy_resource}(hj!hhhNhNubah}(h]h ]jRah"]h$]h&]uh1jFhj!ubah}(h]h ](jYjZeh"]h$]h&]hhuh1j@hjd!hhhjv!hMgubj)}(hD(struct kunit *test, kunit_resource_match_t match, void *match_data)h](j)}(hstruct kunit *testh](j)}(hj!h]hstruct}(hj!hhhNhNubah}(h]h ]j*ah"]h$]h&]uh1jhj!ubj0)}(h h]h }(hj!hhhNhNubah}(h]h ]j<ah"]h$]h&]uh1j/hj!ubh)}(hhh]jG)}(hkunith]hkunit}(hj!hhhNhNubah}(h]h ]jRah"]h$]h&]uh1jFhj!ubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetj!modnameN classnameNjj)}j]j)}jj!sbc.kunit_destroy_resourceasbuh1hhj!ubj0)}(h h]h }(hj!hhhNhNubah}(h]h ]j<ah"]h$]h&]uh1j/hj!ubj)}(hjh]h*}(hj!hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj!ubjG)}(htesth]htest}(hj!hhhNhNubah}(h]h ]jRah"]h$]h&]uh1jFhj!ubeh}(h]h ]h"]h$]h&]noemphhhuh1jhj!ubj)}(hkunit_resource_match_t matchh](h)}(hhh]jG)}(hkunit_resource_match_th]hkunit_resource_match_t}(hj"hhhNhNubah}(h]h ]jRah"]h$]h&]uh1jFhj"ubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetj"modnameN classnameNjj)}j]j!c.kunit_destroy_resourceasbuh1hhj"ubj0)}(h h]h }(hj8"hhhNhNubah}(h]h ]j<ah"]h$]h&]uh1j/hj"ubjG)}(hmatchh]hmatch}(hjF"hhhNhNubah}(h]h ]jRah"]h$]h&]uh1jFhj"ubeh}(h]h ]h"]h$]h&]noemphhhuh1jhj!ubj)}(hvoid *match_datah](jZ)}(hvoidh]hvoid}(hj_"hhhNhNubah}(h]h ]jfah"]h$]h&]uh1jYhj["ubj0)}(h h]h }(hjm"hhhNhNubah}(h]h ]j<ah"]h$]h&]uh1j/hj["ubj)}(hjh]h*}(hj{"hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj["ubjG)}(h match_datah]h match_data}(hj"hhhNhNubah}(h]h ]jRah"]h$]h&]uh1jFhj["ubeh}(h]h ]h"]h$]h&]noemphhhuh1jhj!ubeh}(h]h ]h"]h$]h&]hhuh1jhjd!hhhjv!hMgubeh}(h]h ]h"]h$]h&]hhjduh1jjejfhj`!hhhjv!hMgubah}(h]j[!ah ](jjjkeh"]h$]h&]jojp)jqhuh1jhjv!hMghj]!hhubjs)}(hhh]h)}(h%Find a kunit_resource and destroy it.h]h%Find a kunit_resource and destroy it.}(hj"hhhNhNubah}(h]h ]h"]h$]h&]uh1hhe/var/lib/git/docbuild/linux/Documentation/dev-tools/kunit/api/resource:12: ./include/kunit/resource.hhMghj"hhubah}(h]h ]h"]h$]h&]uh1jrhj]!hhhjv!hMgubeh}(h]h ](jfunctioneh"]h$]h&]jjjj"jj"jjjuh1j hhhhhNhNubj)}(hX=**Parameters** ``struct kunit *test`` Test case to which the resource belongs. ``kunit_resource_match_t match`` Match function. Returns whether a given resource matches **match_data**. ``void *match_data`` Data passed into **match**. **Return** 0 if kunit_resource is found and freed, -ENOENT if not found.h](h)}(h**Parameters**h]j)}(hj"h]h Parameters}(hj"hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj"ubah}(h]h ]h"]h$]h&]uh1hhe/var/lib/git/docbuild/linux/Documentation/dev-tools/kunit/api/resource:12: ./include/kunit/resource.hhMkhj"ubj)}(hhh](j)}(h@``struct kunit *test`` Test case to which the resource belongs. h](j)}(h``struct kunit *test``h]j )}(hj"h]hstruct kunit *test}(hj"hhhNhNubah}(h]h ]h"]h$]h&]uh1j hj"ubah}(h]h ]h"]h$]h&]uh1jhe/var/lib/git/docbuild/linux/Documentation/dev-tools/kunit/api/resource:12: ./include/kunit/resource.hhMhhj"ubj )}(hhh]h)}(h(Test case to which the resource belongs.h]h(Test case to which the resource belongs.}(hj #hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj#hMhhj #ubah}(h]h ]h"]h$]h&]uh1jhj"ubeh}(h]h ]h"]h$]h&]uh1jhj#hMhhj"ubj)}(hj``kunit_resource_match_t match`` Match function. Returns whether a given resource matches **match_data**. h](j)}(h ``kunit_resource_match_t match``h]j )}(hj,#h]hkunit_resource_match_t match}(hj.#hhhNhNubah}(h]h ]h"]h$]h&]uh1j hj*#ubah}(h]h ]h"]h$]h&]uh1jhe/var/lib/git/docbuild/linux/Documentation/dev-tools/kunit/api/resource:12: ./include/kunit/resource.hhMihj&#ubj )}(hhh]h)}(hHMatch function. Returns whether a given resource matches **match_data**.h](h9Match function. Returns whether a given resource matches }(hjE#hhhNhNubj)}(h**match_data**h]h match_data}(hjM#hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjE#ubh.}(hjE#hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhjA#hMihjB#ubah}(h]h ]h"]h$]h&]uh1jhj&#ubeh}(h]h ]h"]h$]h&]uh1jhjA#hMihj"ubj)}(h1``void *match_data`` Data passed into **match**. h](j)}(h``void *match_data``h]j )}(hjw#h]hvoid *match_data}(hjy#hhhNhNubah}(h]h ]h"]h$]h&]uh1j hju#ubah}(h]h ]h"]h$]h&]uh1jhe/var/lib/git/docbuild/linux/Documentation/dev-tools/kunit/api/resource:12: ./include/kunit/resource.hhMjhjq#ubj )}(hhh]h)}(hData passed into **match**.h](hData passed into }(hj#hhhNhNubj)}(h **match**h]hmatch}(hj#hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj#ubh.}(hj#hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhj#hMjhj#ubah}(h]h ]h"]h$]h&]uh1jhjq#ubeh}(h]h ]h"]h$]h&]uh1jhj#hMjhj"ubeh}(h]h ]h"]h$]h&]uh1jhj"ubh)}(h **Return**h]j)}(hj#h]hReturn}(hj#hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj#ubah}(h]h ]h"]h$]h&]uh1hhe/var/lib/git/docbuild/linux/Documentation/dev-tools/kunit/api/resource:12: ./include/kunit/resource.hhMlhj"ubh)}(h=0 if kunit_resource is found and freed, -ENOENT if not found.h]h=0 if kunit_resource is found and freed, -ENOENT if not found.}(hj#hhhNhNubah}(h]h ]h"]h$]h&]uh1hhe/var/lib/git/docbuild/linux/Documentation/dev-tools/kunit/api/resource:12: ./include/kunit/resource.hhMlhj"ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhhhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j"kunit_remove_resource (C function)c.kunit_remove_resourcehNtauh1hhhhhhNhNubj )}(hhh](j)}(hKvoid kunit_remove_resource (struct kunit *test, struct kunit_resource *res)h]j)}(hJvoid kunit_remove_resource(struct kunit *test, struct kunit_resource *res)h](jZ)}(hvoidh]hvoid}(hj $hhhNhNubah}(h]h ]jfah"]h$]h&]uh1jYhj$hhhe/var/lib/git/docbuild/linux/Documentation/dev-tools/kunit/api/resource:12: ./include/kunit/resource.hhM{ubj0)}(h h]h }(hj$hhhNhNubah}(h]h ]j<ah"]h$]h&]uh1j/hj$hhhj$hM{ubjA)}(hkunit_remove_resourceh]jG)}(hkunit_remove_resourceh]hkunit_remove_resource}(hj*$hhhNhNubah}(h]h ]jRah"]h$]h&]uh1jFhj&$ubah}(h]h ](jYjZeh"]h$]h&]hhuh1j@hj$hhhj$hM{ubj)}(h0(struct kunit *test, struct kunit_resource *res)h](j)}(hstruct kunit *testh](j)}(hj!h]hstruct}(hjF$hhhNhNubah}(h]h ]j*ah"]h$]h&]uh1jhjB$ubj0)}(h h]h }(hjS$hhhNhNubah}(h]h ]j<ah"]h$]h&]uh1j/hjB$ubh)}(hhh]jG)}(hkunith]hkunit}(hjd$hhhNhNubah}(h]h ]jRah"]h$]h&]uh1jFhja$ubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjf$modnameN classnameNjj)}j]j)}jj,$sbc.kunit_remove_resourceasbuh1hhjB$ubj0)}(h h]h }(hj$hhhNhNubah}(h]h ]j<ah"]h$]h&]uh1j/hjB$ubj)}(hjh]h*}(hj$hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjB$ubjG)}(htesth]htest}(hj$hhhNhNubah}(h]h ]jRah"]h$]h&]uh1jFhjB$ubeh}(h]h ]h"]h$]h&]noemphhhuh1jhj>$ubj)}(hstruct kunit_resource *resh](j)}(hj!h]hstruct}(hj$hhhNhNubah}(h]h ]j*ah"]h$]h&]uh1jhj$ubj0)}(h h]h }(hj$hhhNhNubah}(h]h ]j<ah"]h$]h&]uh1j/hj$ubh)}(hhh]jG)}(hkunit_resourceh]hkunit_resource}(hj$hhhNhNubah}(h]h ]jRah"]h$]h&]uh1jFhj$ubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetj$modnameN classnameNjj)}j]j$c.kunit_remove_resourceasbuh1hhj$ubj0)}(h h]h }(hj$hhhNhNubah}(h]h ]j<ah"]h$]h&]uh1j/hj$ubj)}(hjh]h*}(hj%hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj$ubjG)}(hresh]hres}(hj%hhhNhNubah}(h]h ]jRah"]h$]h&]uh1jFhj$ubeh}(h]h ]h"]h$]h&]noemphhhuh1jhj>$ubeh}(h]h ]h"]h$]h&]hhuh1jhj$hhhj$hM{ubeh}(h]h ]h"]h$]h&]hhjduh1jjejfhj$hhhj$hM{ubah}(h]j#ah ](jjjkeh"]h$]h&]jojp)jqhuh1jhj$hM{hj#hhubjs)}(hhh]h)}(h8remove resource from resource list associated with test.h]h8remove resource from resource list associated with test.}(hj9%hhhNhNubah}(h]h ]h"]h$]h&]uh1hhe/var/lib/git/docbuild/linux/Documentation/dev-tools/kunit/api/resource:12: ./include/kunit/resource.hhM{hj6%hhubah}(h]h ]h"]h$]h&]uh1jrhj#hhhj$hM{ubeh}(h]h ](jfunctioneh"]h$]h&]jjjjQ%jjQ%jjjuh1j hhhhhNhNubj)}(hXX**Parameters** ``struct kunit *test`` The test context object. ``struct kunit_resource *res`` The resource to be removed. **Description** Note that the resource will not be immediately freed since it is likely the caller has a reference to it via alloc_and_get() or find(); in this case a final call to kunit_put_resource() is required.h](h)}(h**Parameters**h]j)}(hj[%h]h Parameters}(hj]%hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjY%ubah}(h]h ]h"]h$]h&]uh1hhe/var/lib/git/docbuild/linux/Documentation/dev-tools/kunit/api/resource:12: ./include/kunit/resource.hhMhjU%ubj)}(hhh](j)}(h0``struct kunit *test`` The test context object. h](j)}(h``struct kunit *test``h]j )}(hjz%h]hstruct kunit *test}(hj|%hhhNhNubah}(h]h ]h"]h$]h&]uh1j hjx%ubah}(h]h ]h"]h$]h&]uh1jhe/var/lib/git/docbuild/linux/Documentation/dev-tools/kunit/api/resource:12: ./include/kunit/resource.hhM}hjt%ubj )}(hhh]h)}(hThe test context object.h]hThe test context object.}(hj%hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj%hM}hj%ubah}(h]h ]h"]h$]h&]uh1jhjt%ubeh}(h]h ]h"]h$]h&]uh1jhj%hM}hjq%ubj)}(h;``struct kunit_resource *res`` The resource to be removed. h](j)}(h``struct kunit_resource *res``h]j )}(hj%h]hstruct kunit_resource *res}(hj%hhhNhNubah}(h]h ]h"]h$]h&]uh1j hj%ubah}(h]h ]h"]h$]h&]uh1jhe/var/lib/git/docbuild/linux/Documentation/dev-tools/kunit/api/resource:12: ./include/kunit/resource.hhM~hj%ubj )}(hhh]h)}(hThe resource to be removed.h]hThe resource to be removed.}(hj%hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj%hM~hj%ubah}(h]h ]h"]h$]h&]uh1jhj%ubeh}(h]h ]h"]h$]h&]uh1jhj%hM~hjq%ubeh}(h]h ]h"]h$]h&]uh1jhjU%ubh)}(h**Description**h]j)}(hj%h]h Description}(hj%hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj%ubah}(h]h ]h"]h$]h&]uh1hhe/var/lib/git/docbuild/linux/Documentation/dev-tools/kunit/api/resource:12: ./include/kunit/resource.hhMhjU%ubh)}(hNote that the resource will not be immediately freed since it is likely the caller has a reference to it via alloc_and_get() or find(); in this case a final call to kunit_put_resource() is required.h]hNote that the resource will not be immediately freed since it is likely the caller has a reference to it via alloc_and_get() or find(); in this case a final call to kunit_put_resource() is required.}(hj&hhhNhNubah}(h]h ]h"]h$]h&]uh1hhe/var/lib/git/docbuild/linux/Documentation/dev-tools/kunit/api/resource:12: ./include/kunit/resource.hhMhjU%ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhhhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j%KUNIT_DEFINE_ACTION_WRAPPER (C macro)c.KUNIT_DEFINE_ACTION_WRAPPERhNtauh1hhhhhhNhNubj )}(hhh](j)}(hKUNIT_DEFINE_ACTION_WRAPPERh]j)}(hKUNIT_DEFINE_ACTION_WRAPPERh]jA)}(hKUNIT_DEFINE_ACTION_WRAPPERh]jG)}(hj-&h]hKUNIT_DEFINE_ACTION_WRAPPER}(hj7&hhhNhNubah}(h]h ]jRah"]h$]h&]uh1jFhj3&ubah}(h]h ](jYjZeh"]h$]h&]hhuh1j@hj/&hhhe/var/lib/git/docbuild/linux/Documentation/dev-tools/kunit/api/resource:12: ./include/kunit/resource.hhMubah}(h]h ]h"]h$]h&]hhjduh1jjejfhj+&hhhjJ&hMubah}(h]j&&ah ](jjjkeh"]h$]h&]jojp)jqhuh1jhjJ&hMhj(&hhubjs)}(hhh]h}(h]h ]h"]h$]h&]uh1jrhj(&hhhjJ&hMubeh}(h]h ](jmacroeh"]h$]h&]jjjjc&jjc&jjjuh1j hhhhhNhNubh)}(h9``KUNIT_DEFINE_ACTION_WRAPPER (wrapper, orig, arg_type)``h]j )}(hji&h]h5KUNIT_DEFINE_ACTION_WRAPPER (wrapper, orig, arg_type)}(hjk&hhhNhNubah}(h]h ]h"]h$]h&]uh1j hjg&ubah}(h]h ]h"]h$]h&]uh1hhe/var/lib/git/docbuild/linux/Documentation/dev-tools/kunit/api/resource:12: ./include/kunit/resource.hhMhhhhubh block_quote)}(h.Wrap a function for use as a deferred action. h]h)}(h-Wrap a function for use as a deferred action.h]h-Wrap a function for use as a deferred action.}(hj&hhhNhNubah}(h]h ]h"]h$]h&]uh1hhe/var/lib/git/docbuild/linux/Documentation/dev-tools/kunit/api/resource:12: ./include/kunit/resource.hhMhj&ubah}(h]h ]h"]h$]h&]uh1j&hj&hMhhhhubj)}(hX**Parameters** ``wrapper`` The name of the new wrapper function define. ``orig`` The original function to wrap. ``arg_type`` The type of the argument accepted by **orig**. **Description** Defines a wrapper for a function which accepts a single, pointer-sized argument. This wrapper can then be passed to kunit_add_action() and similar. This should be used in preference to casting a function directly to kunit_action_t, as casting function pointers will break control flow integrity (CFI), leading to crashes.h](h)}(h**Parameters**h]j)}(hj&h]h Parameters}(hj&hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj&ubah}(h]h ]h"]h$]h&]uh1hhe/var/lib/git/docbuild/linux/Documentation/dev-tools/kunit/api/resource:12: ./include/kunit/resource.hhMhj&ubj)}(hhh](j)}(h9``wrapper`` The name of the new wrapper function define. h](j)}(h ``wrapper``h]j )}(hj&h]hwrapper}(hj&hhhNhNubah}(h]h ]h"]h$]h&]uh1j hj&ubah}(h]h ]h"]h$]h&]uh1jhe/var/lib/git/docbuild/linux/Documentation/dev-tools/kunit/api/resource:12: ./include/kunit/resource.hhMhj&ubj )}(hhh]h)}(h,The name of the new wrapper function define.h]h,The name of the new wrapper function define.}(hj&hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj&hMhj&ubah}(h]h ]h"]h$]h&]uh1jhj&ubeh}(h]h ]h"]h$]h&]uh1jhj&hMhj&ubj)}(h(``orig`` The original function to wrap. h](j)}(h``orig``h]j )}(hj&h]horig}(hj&hhhNhNubah}(h]h ]h"]h$]h&]uh1j hj&ubah}(h]h ]h"]h$]h&]uh1jhe/var/lib/git/docbuild/linux/Documentation/dev-tools/kunit/api/resource:12: ./include/kunit/resource.hhMhj&ubj )}(hhh]h)}(hThe original function to wrap.h]hThe original function to wrap.}(hj'hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj 'hMhj'ubah}(h]h ]h"]h$]h&]uh1jhj&ubeh}(h]h ]h"]h$]h&]uh1jhj 'hMhj&ubj)}(h<``arg_type`` The type of the argument accepted by **orig**. h](j)}(h ``arg_type``h]j )}(hj1'h]harg_type}(hj3'hhhNhNubah}(h]h ]h"]h$]h&]uh1j hj/'ubah}(h]h ]h"]h$]h&]uh1jhe/var/lib/git/docbuild/linux/Documentation/dev-tools/kunit/api/resource:12: ./include/kunit/resource.hhMhj+'ubj )}(hhh]h)}(h.The type of the argument accepted by **orig**.h](h%The type of the argument accepted by }(hjJ'hhhNhNubj)}(h**orig**h]horig}(hjR'hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjJ'ubh.}(hjJ'hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhjF'hMhjG'ubah}(h]h ]h"]h$]h&]uh1jhj+'ubeh}(h]h ]h"]h$]h&]uh1jhjF'hMhj&ubeh}(h]h ]h"]h$]h&]uh1jhj&ubh)}(h**Description**h]j)}(hj~'h]h Description}(hj'hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj|'ubah}(h]h ]h"]h$]h&]uh1hhe/var/lib/git/docbuild/linux/Documentation/dev-tools/kunit/api/resource:12: ./include/kunit/resource.hhMhj&ubh)}(hXADefines a wrapper for a function which accepts a single, pointer-sized argument. This wrapper can then be passed to kunit_add_action() and similar. This should be used in preference to casting a function directly to kunit_action_t, as casting function pointers will break control flow integrity (CFI), leading to crashes.h]hXADefines a wrapper for a function which accepts a single, pointer-sized argument. This wrapper can then be passed to kunit_add_action() and similar. This should be used in preference to casting a function directly to kunit_action_t, as casting function pointers will break control flow integrity (CFI), leading to crashes.}(hj'hhhNhNubah}(h]h ]h"]h$]h&]uh1hhe/var/lib/git/docbuild/linux/Documentation/dev-tools/kunit/api/resource:12: ./include/kunit/resource.hhMhj&ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhhhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](jkunit_add_action (C function)c.kunit_add_actionhNtauh1hhhhhhNhNubj )}(hhh](j)}(hLint kunit_add_action (struct kunit *test, kunit_action_t *action, void *ctx)h]j)}(hKint kunit_add_action(struct kunit *test, kunit_action_t *action, void *ctx)h](jZ)}(hinth]hint}(hj'hhhNhNubah}(h]h ]jfah"]h$]h&]uh1jYhj'hhhe/var/lib/git/docbuild/linux/Documentation/dev-tools/kunit/api/resource:12: ./include/kunit/resource.hhMubj0)}(h h]h }(hj'hhhNhNubah}(h]h ]j<ah"]h$]h&]uh1j/hj'hhhj'hMubjA)}(hkunit_add_actionh]jG)}(hkunit_add_actionh]hkunit_add_action}(hj'hhhNhNubah}(h]h ]jRah"]h$]h&]uh1jFhj'ubah}(h]h ](jYjZeh"]h$]h&]hhuh1j@hj'hhhj'hMubj)}(h7(struct kunit *test, kunit_action_t *action, void *ctx)h](j)}(hstruct kunit *testh](j)}(hj!h]hstruct}(hj(hhhNhNubah}(h]h ]j*ah"]h$]h&]uh1jhj'ubj0)}(h h]h }(hj (hhhNhNubah}(h]h ]j<ah"]h$]h&]uh1j/hj'ubh)}(hhh]jG)}(hkunith]hkunit}(hj(hhhNhNubah}(h]h ]jRah"]h$]h&]uh1jFhj(ubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetj (modnameN classnameNjj)}j]j)}jj'sbc.kunit_add_actionasbuh1hhj'ubj0)}(h h]h }(hj>(hhhNhNubah}(h]h ]j<ah"]h$]h&]uh1j/hj'ubj)}(hjh]h*}(hjL(hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj'ubjG)}(htesth]htest}(hjY(hhhNhNubah}(h]h ]jRah"]h$]h&]uh1jFhj'ubeh}(h]h ]h"]h$]h&]noemphhhuh1jhj'ubj)}(hkunit_action_t *actionh](h)}(hhh]jG)}(hkunit_action_th]hkunit_action_t}(hju(hhhNhNubah}(h]h ]jRah"]h$]h&]uh1jFhjr(ubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjw(modnameN classnameNjj)}j]j:(c.kunit_add_actionasbuh1hhjn(ubj0)}(h h]h }(hj(hhhNhNubah}(h]h ]j<ah"]h$]h&]uh1j/hjn(ubj)}(hjh]h*}(hj(hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjn(ubjG)}(hactionh]haction}(hj(hhhNhNubah}(h]h ]jRah"]h$]h&]uh1jFhjn(ubeh}(h]h ]h"]h$]h&]noemphhhuh1jhj'ubj)}(h void *ctxh](jZ)}(hvoidh]hvoid}(hj(hhhNhNubah}(h]h ]jfah"]h$]h&]uh1jYhj(ubj0)}(h h]h }(hj(hhhNhNubah}(h]h ]j<ah"]h$]h&]uh1j/hj(ubj)}(hjh]h*}(hj(hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj(ubjG)}(hctxh]hctx}(hj(hhhNhNubah}(h]h ]jRah"]h$]h&]uh1jFhj(ubeh}(h]h ]h"]h$]h&]noemphhhuh1jhj'ubeh}(h]h ]h"]h$]h&]hhuh1jhj'hhhj'hMubeh}(h]h ]h"]h$]h&]hhjduh1jjejfhj'hhhj'hMubah}(h]j'ah ](jjjkeh"]h$]h&]jojp)jqhuh1jhj'hMhj'hhubjs)}(hhh]h)}(h#Call a function when the test ends.h]h#Call a function when the test ends.}(hj)hhhNhNubah}(h]h ]h"]h$]h&]uh1hhe/var/lib/git/docbuild/linux/Documentation/dev-tools/kunit/api/resource:12: ./include/kunit/resource.hhMhj)hhubah}(h]h ]h"]h$]h&]uh1jrhj'hhhj'hMubeh}(h]h ](jfunctioneh"]h$]h&]jjjj2)jj2)jjjuh1j hhhhhNhNubj)}(hX**Parameters** ``struct kunit *test`` Test case to associate the action with. ``kunit_action_t *action`` The function to run on test exit ``void *ctx`` Data passed into **func** **Description** Defer the execution of a function until the test exits, either normally or due to a failure. **ctx** is passed as additional context. All functions registered with kunit_add_action() will execute in the opposite order to that they were registered in. This is useful for cleaning up allocated memory and resources, as these functions are called even if the test aborts early due to, e.g., a failed assertion. See also: devm_add_action() for the devres equivalent. **Return** 0 on success, an error if the action could not be deferred.h](h)}(h**Parameters**h]j)}(hj<)h]h Parameters}(hj>)hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj:)ubah}(h]h ]h"]h$]h&]uh1hhe/var/lib/git/docbuild/linux/Documentation/dev-tools/kunit/api/resource:12: ./include/kunit/resource.hhMhj6)ubj)}(hhh](j)}(h?``struct kunit *test`` Test case to associate the action with. h](j)}(h``struct kunit *test``h]j )}(hj[)h]hstruct kunit *test}(hj])hhhNhNubah}(h]h ]h"]h$]h&]uh1j hjY)ubah}(h]h ]h"]h$]h&]uh1jhe/var/lib/git/docbuild/linux/Documentation/dev-tools/kunit/api/resource:12: ./include/kunit/resource.hhMhjU)ubj )}(hhh]h)}(h'Test case to associate the action with.h]h'Test case to associate the action with.}(hjt)hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjp)hMhjq)ubah}(h]h ]h"]h$]h&]uh1jhjU)ubeh}(h]h ]h"]h$]h&]uh1jhjp)hMhjR)ubj)}(h<``kunit_action_t *action`` The function to run on test exit h](j)}(h``kunit_action_t *action``h]j )}(hj)h]hkunit_action_t *action}(hj)hhhNhNubah}(h]h ]h"]h$]h&]uh1j hj)ubah}(h]h ]h"]h$]h&]uh1jhe/var/lib/git/docbuild/linux/Documentation/dev-tools/kunit/api/resource:12: ./include/kunit/resource.hhMhj)ubj )}(hhh]h)}(h The function to run on test exith]h The function to run on test exit}(hj)hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj)hMhj)ubah}(h]h ]h"]h$]h&]uh1jhj)ubeh}(h]h ]h"]h$]h&]uh1jhj)hMhjR)ubj)}(h(``void *ctx`` Data passed into **func** h](j)}(h ``void *ctx``h]j )}(hj)h]h void *ctx}(hj)hhhNhNubah}(h]h ]h"]h$]h&]uh1j hj)ubah}(h]h ]h"]h$]h&]uh1jhe/var/lib/git/docbuild/linux/Documentation/dev-tools/kunit/api/resource:12: ./include/kunit/resource.hhMhj)ubj )}(hhh]h)}(hData passed into **func**h](hData passed into }(hj)hhhNhNubj)}(h**func**h]hfunc}(hj)hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj)ubeh}(h]h ]h"]h$]h&]uh1hhj)hMhj)ubah}(h]h ]h"]h$]h&]uh1jhj)ubeh}(h]h ]h"]h$]h&]uh1jhj)hMhjR)ubeh}(h]h ]h"]h$]h&]uh1jhj6)ubh)}(h**Description**h]j)}(hj*h]h Description}(hj*hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj*ubah}(h]h ]h"]h$]h&]uh1hhe/var/lib/git/docbuild/linux/Documentation/dev-tools/kunit/api/resource:12: ./include/kunit/resource.hhMhj6)ubh)}(hDefer the execution of a function until the test exits, either normally or due to a failure. **ctx** is passed as additional context. All functions registered with kunit_add_action() will execute in the opposite order to that they were registered in.h](h^Defer the execution of a function until the test exits, either normally or due to a failure. F}(hj,*hhhNhNubj)}(h**ctx**h]hctx}(hj4*hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj,*ubh is passed as additional context. All functions registered with kunit_add_action() will execute in the opposite order to that they were registered in.}(hj,*hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhe/var/lib/git/docbuild/linux/Documentation/dev-tools/kunit/api/resource:12: ./include/kunit/resource.hhMhj6)ubh)}(hThis is useful for cleaning up allocated memory and resources, as these functions are called even if the test aborts early due to, e.g., a failed assertion.h]hThis is useful for cleaning up allocated memory and resources, as these functions are called even if the test aborts early due to, e.g., a failed assertion.}(hjM*hhhNhNubah}(h]h ]h"]h$]h&]uh1hhe/var/lib/git/docbuild/linux/Documentation/dev-tools/kunit/api/resource:12: ./include/kunit/resource.hhMhj6)ubh)}(h6See also: devm_add_action() for the devres equivalent.h]h6See also: devm_add_action() for the devres equivalent.}(hj\*hhhNhNubah}(h]h ]h"]h$]h&]uh1hhe/var/lib/git/docbuild/linux/Documentation/dev-tools/kunit/api/resource:12: ./include/kunit/resource.hhMhj6)ubh)}(h **Return**h]j)}(hjm*h]hReturn}(hjo*hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjk*ubah}(h]h ]h"]h$]h&]uh1hhe/var/lib/git/docbuild/linux/Documentation/dev-tools/kunit/api/resource:12: ./include/kunit/resource.hhMhj6)ubh)}(h;0 on success, an error if the action could not be deferred.h]h;0 on success, an error if the action could not be deferred.}(hj*hhhNhNubah}(h]h ]h"]h$]h&]uh1hhe/var/lib/git/docbuild/linux/Documentation/dev-tools/kunit/api/resource:12: ./include/kunit/resource.hhMhj6)ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhhhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j&kunit_add_action_or_reset (C function)c.kunit_add_action_or_resethNtauh1hhhhhhNhNubj )}(hhh](j)}(hUint kunit_add_action_or_reset (struct kunit *test, kunit_action_t *action, void *ctx)h]j)}(hTint kunit_add_action_or_reset(struct kunit *test, kunit_action_t *action, void *ctx)h](jZ)}(hinth]hint}(hj*hhhNhNubah}(h]h ]jfah"]h$]h&]uh1jYhj*hhhe/var/lib/git/docbuild/linux/Documentation/dev-tools/kunit/api/resource:12: ./include/kunit/resource.hhMubj0)}(h h]h }(hj*hhhNhNubah}(h]h ]j<ah"]h$]h&]uh1j/hj*hhhj*hMubjA)}(hkunit_add_action_or_reseth]jG)}(hkunit_add_action_or_reseth]hkunit_add_action_or_reset}(hj*hhhNhNubah}(h]h ]jRah"]h$]h&]uh1jFhj*ubah}(h]h ](jYjZeh"]h$]h&]hhuh1j@hj*hhhj*hMubj)}(h7(struct kunit *test, kunit_action_t *action, void *ctx)h](j)}(hstruct kunit *testh](j)}(hj!h]hstruct}(hj*hhhNhNubah}(h]h ]j*ah"]h$]h&]uh1jhj*ubj0)}(h h]h }(hj*hhhNhNubah}(h]h ]j<ah"]h$]h&]uh1j/hj*ubh)}(hhh]jG)}(hkunith]hkunit}(hj +hhhNhNubah}(h]h ]jRah"]h$]h&]uh1jFhj +ubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetj+modnameN classnameNjj)}j]j)}jj*sbc.kunit_add_action_or_resetasbuh1hhj*ubj0)}(h h]h }(hj-+hhhNhNubah}(h]h ]j<ah"]h$]h&]uh1j/hj*ubj)}(hjh]h*}(hj;+hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj*ubjG)}(htesth]htest}(hjH+hhhNhNubah}(h]h ]jRah"]h$]h&]uh1jFhj*ubeh}(h]h ]h"]h$]h&]noemphhhuh1jhj*ubj)}(hkunit_action_t *actionh](h)}(hhh]jG)}(hkunit_action_th]hkunit_action_t}(hjd+hhhNhNubah}(h]h ]jRah"]h$]h&]uh1jFhja+ubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjf+modnameN classnameNjj)}j]j)+c.kunit_add_action_or_resetasbuh1hhj]+ubj0)}(h h]h }(hj+hhhNhNubah}(h]h ]j<ah"]h$]h&]uh1j/hj]+ubj)}(hjh]h*}(hj+hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj]+ubjG)}(hactionh]haction}(hj+hhhNhNubah}(h]h ]jRah"]h$]h&]uh1jFhj]+ubeh}(h]h ]h"]h$]h&]noemphhhuh1jhj*ubj)}(h void *ctxh](jZ)}(hvoidh]hvoid}(hj+hhhNhNubah}(h]h ]jfah"]h$]h&]uh1jYhj+ubj0)}(h h]h }(hj+hhhNhNubah}(h]h ]j<ah"]h$]h&]uh1j/hj+ubj)}(hjh]h*}(hj+hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj+ubjG)}(hctxh]hctx}(hj+hhhNhNubah}(h]h ]jRah"]h$]h&]uh1jFhj+ubeh}(h]h ]h"]h$]h&]noemphhhuh1jhj*ubeh}(h]h ]h"]h$]h&]hhuh1jhj*hhhj*hMubeh}(h]h ]h"]h$]h&]hhjduh1jjejfhj*hhhj*hMubah}(h]j*ah ](jjjkeh"]h$]h&]jojp)jqhuh1jhj*hMhj*hhubjs)}(hhh]h)}(h#Call a function when the test ends.h]h#Call a function when the test ends.}(hj ,hhhNhNubah}(h]h ]h"]h$]h&]uh1hhe/var/lib/git/docbuild/linux/Documentation/dev-tools/kunit/api/resource:12: ./include/kunit/resource.hhMhj,hhubah}(h]h ]h"]h$]h&]uh1jrhj*hhhj*hMubeh}(h]h ](jfunctioneh"]h$]h&]jjjj!,jj!,jjjuh1j hhhhhNhNubj)}(hX**Parameters** ``struct kunit *test`` Test case to associate the action with. ``kunit_action_t *action`` The function to run on test exit ``void *ctx`` Data passed into **func** **Description** Defer the execution of a function until the test exits, either normally or due to a failure. **ctx** is passed as additional context. All functions registered with kunit_add_action() will execute in the opposite order to that they were registered in. This is useful for cleaning up allocated memory and resources, as these functions are called even if the test aborts early due to, e.g., a failed assertion. If the action cannot be created (e.g., due to the system being out of memory), then action(ctx) will be called immediately, and an error will be returned. See also: devm_add_action_or_reset() for the devres equivalent. **Return** 0 on success, an error if the action could not be deferred.h](h)}(h**Parameters**h]j)}(hj+,h]h Parameters}(hj-,hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj),ubah}(h]h ]h"]h$]h&]uh1hhe/var/lib/git/docbuild/linux/Documentation/dev-tools/kunit/api/resource:12: ./include/kunit/resource.hhMhj%,ubj)}(hhh](j)}(h?``struct kunit *test`` Test case to associate the action with. h](j)}(h``struct kunit *test``h]j )}(hjJ,h]hstruct kunit *test}(hjL,hhhNhNubah}(h]h ]h"]h$]h&]uh1j hjH,ubah}(h]h ]h"]h$]h&]uh1jhe/var/lib/git/docbuild/linux/Documentation/dev-tools/kunit/api/resource:12: ./include/kunit/resource.hhMhjD,ubj )}(hhh]h)}(h'Test case to associate the action with.h]h'Test case to associate the action with.}(hjc,hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj_,hMhj`,ubah}(h]h ]h"]h$]h&]uh1jhjD,ubeh}(h]h ]h"]h$]h&]uh1jhj_,hMhjA,ubj)}(h<``kunit_action_t *action`` The function to run on test exit h](j)}(h``kunit_action_t *action``h]j )}(hj,h]hkunit_action_t *action}(hj,hhhNhNubah}(h]h ]h"]h$]h&]uh1j hj,ubah}(h]h ]h"]h$]h&]uh1jhe/var/lib/git/docbuild/linux/Documentation/dev-tools/kunit/api/resource:12: ./include/kunit/resource.hhMhj},ubj )}(hhh]h)}(h The function to run on test exith]h The function to run on test exit}(hj,hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj,hMhj,ubah}(h]h ]h"]h$]h&]uh1jhj},ubeh}(h]h ]h"]h$]h&]uh1jhj,hMhjA,ubj)}(h(``void *ctx`` Data passed into **func** h](j)}(h ``void *ctx``h]j )}(hj,h]h void *ctx}(hj,hhhNhNubah}(h]h ]h"]h$]h&]uh1j hj,ubah}(h]h ]h"]h$]h&]uh1jhe/var/lib/git/docbuild/linux/Documentation/dev-tools/kunit/api/resource:12: ./include/kunit/resource.hhMhj,ubj )}(hhh]h)}(hData passed into **func**h](hData passed into }(hj,hhhNhNubj)}(h**func**h]hfunc}(hj,hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj,ubeh}(h]h ]h"]h$]h&]uh1hhj,hMhj,ubah}(h]h ]h"]h$]h&]uh1jhj,ubeh}(h]h ]h"]h$]h&]uh1jhj,hMhjA,ubeh}(h]h ]h"]h$]h&]uh1jhj%,ubh)}(h**Description**h]j)}(hj-h]h Description}(hj-hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj-ubah}(h]h ]h"]h$]h&]uh1hhe/var/lib/git/docbuild/linux/Documentation/dev-tools/kunit/api/resource:12: ./include/kunit/resource.hhMhj%,ubh)}(hDefer the execution of a function until the test exits, either normally or due to a failure. **ctx** is passed as additional context. All functions registered with kunit_add_action() will execute in the opposite order to that they were registered in.h](h^Defer the execution of a function until the test exits, either normally or due to a failure. }(hj-hhhNhNubj)}(h**ctx**h]hctx}(hj#-hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj-ubh is passed as additional context. All functions registered with kunit_add_action() will execute in the opposite order to that they were registered in.}(hj-hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhe/var/lib/git/docbuild/linux/Documentation/dev-tools/kunit/api/resource:12: ./include/kunit/resource.hhMhj%,ubh)}(hThis is useful for cleaning up allocated memory and resources, as these functions are called even if the test aborts early due to, e.g., a failed assertion.h]hThis is useful for cleaning up allocated memory and resources, as these functions are called even if the test aborts early due to, e.g., a failed assertion.}(hj<-hhhNhNubah}(h]h ]h"]h$]h&]uh1hhe/var/lib/git/docbuild/linux/Documentation/dev-tools/kunit/api/resource:12: ./include/kunit/resource.hhMhj%,ubh)}(hIf the action cannot be created (e.g., due to the system being out of memory), then action(ctx) will be called immediately, and an error will be returned.h]hIf the action cannot be created (e.g., due to the system being out of memory), then action(ctx) will be called immediately, and an error will be returned.}(hjK-hhhNhNubah}(h]h ]h"]h$]h&]uh1hhe/var/lib/git/docbuild/linux/Documentation/dev-tools/kunit/api/resource:12: ./include/kunit/resource.hhMhj%,ubh)}(h?See also: devm_add_action_or_reset() for the devres equivalent.h]h?See also: devm_add_action_or_reset() for the devres equivalent.}(hjZ-hhhNhNubah}(h]h ]h"]h$]h&]uh1hhe/var/lib/git/docbuild/linux/Documentation/dev-tools/kunit/api/resource:12: ./include/kunit/resource.hhMhj%,ubh)}(h **Return**h]j)}(hjk-h]hReturn}(hjm-hhhNhNubah}(h]h ]h"]h$]h&]uh1jhji-ubah}(h]h ]h"]h$]h&]uh1hhe/var/lib/git/docbuild/linux/Documentation/dev-tools/kunit/api/resource:12: ./include/kunit/resource.hhMhj%,ubh)}(h;0 on success, an error if the action could not be deferred.h]h;0 on success, an error if the action could not be deferred.}(hj-hhhNhNubah}(h]h ]h"]h$]h&]uh1hhe/var/lib/git/docbuild/linux/Documentation/dev-tools/kunit/api/resource:12: ./include/kunit/resource.hhMhj%,ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhhhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j kunit_remove_action (C function)c.kunit_remove_actionhNtauh1hhhhhhNhNubj )}(hhh](j)}(hPvoid kunit_remove_action (struct kunit *test, kunit_action_t *action, void *ctx)h]j)}(hOvoid kunit_remove_action(struct kunit *test, kunit_action_t *action, void *ctx)h](jZ)}(hvoidh]hvoid}(hj-hhhNhNubah}(h]h ]jfah"]h$]h&]uh1jYhj-hhhe/var/lib/git/docbuild/linux/Documentation/dev-tools/kunit/api/resource:12: ./include/kunit/resource.hhMubj0)}(h h]h }(hj-hhhNhNubah}(h]h ]j<ah"]h$]h&]uh1j/hj-hhhj-hMubjA)}(hkunit_remove_actionh]jG)}(hkunit_remove_actionh]hkunit_remove_action}(hj-hhhNhNubah}(h]h ]jRah"]h$]h&]uh1jFhj-ubah}(h]h ](jYjZeh"]h$]h&]hhuh1j@hj-hhhj-hMubj)}(h7(struct kunit *test, kunit_action_t *action, void *ctx)h](j)}(hstruct kunit *testh](j)}(hj!h]hstruct}(hj-hhhNhNubah}(h]h ]j*ah"]h$]h&]uh1jhj-ubj0)}(h h]h }(hj-hhhNhNubah}(h]h ]j<ah"]h$]h&]uh1j/hj-ubh)}(hhh]jG)}(hkunith]hkunit}(hj .hhhNhNubah}(h]h ]jRah"]h$]h&]uh1jFhj.ubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetj .modnameN classnameNjj)}j]j)}jj-sbc.kunit_remove_actionasbuh1hhj-ubj0)}(h h]h }(hj+.hhhNhNubah}(h]h ]j<ah"]h$]h&]uh1j/hj-ubj)}(hjh]h*}(hj9.hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj-ubjG)}(htesth]htest}(hjF.hhhNhNubah}(h]h ]jRah"]h$]h&]uh1jFhj-ubeh}(h]h ]h"]h$]h&]noemphhhuh1jhj-ubj)}(hkunit_action_t *actionh](h)}(hhh]jG)}(hkunit_action_th]hkunit_action_t}(hjb.hhhNhNubah}(h]h ]jRah"]h$]h&]uh1jFhj_.ubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjd.modnameN classnameNjj)}j]j'.c.kunit_remove_actionasbuh1hhj[.ubj0)}(h h]h }(hj.hhhNhNubah}(h]h ]j<ah"]h$]h&]uh1j/hj[.ubj)}(hjh]h*}(hj.hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj[.ubjG)}(hactionh]haction}(hj.hhhNhNubah}(h]h ]jRah"]h$]h&]uh1jFhj[.ubeh}(h]h ]h"]h$]h&]noemphhhuh1jhj-ubj)}(h void *ctxh](jZ)}(hvoidh]hvoid}(hj.hhhNhNubah}(h]h ]jfah"]h$]h&]uh1jYhj.ubj0)}(h h]h }(hj.hhhNhNubah}(h]h ]j<ah"]h$]h&]uh1j/hj.ubj)}(hjh]h*}(hj.hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj.ubjG)}(hctxh]hctx}(hj.hhhNhNubah}(h]h ]jRah"]h$]h&]uh1jFhj.ubeh}(h]h ]h"]h$]h&]noemphhhuh1jhj-ubeh}(h]h ]h"]h$]h&]hhuh1jhj-hhhj-hMubeh}(h]h ]h"]h$]h&]hhjduh1jjejfhj-hhhj-hMubah}(h]j-ah ](jjjkeh"]h$]h&]jojp)jqhuh1jhj-hMhj-hhubjs)}(hhh]h)}(h"Cancel a matching deferred action.h]h"Cancel a matching deferred action.}(hj/hhhNhNubah}(h]h ]h"]h$]h&]uh1hhe/var/lib/git/docbuild/linux/Documentation/dev-tools/kunit/api/resource:12: ./include/kunit/resource.hhMhj/hhubah}(h]h ]h"]h$]h&]uh1jrhj-hhhj-hMubeh}(h]h ](jfunctioneh"]h$]h&]jjjj/jj/jjjuh1j hhhhhNhNubj)}(hX**Parameters** ``struct kunit *test`` Test case the action is associated with. ``kunit_action_t *action`` The deferred function to cancel. ``void *ctx`` The context passed to the deferred function to trigger. **Description** Prevent an action deferred via kunit_add_action() from executing when the test terminates. If the function/context pair was deferred multiple times, only the most recent one will be cancelled. See also: devm_remove_action() for the devres equivalent.h](h)}(h**Parameters**h]j)}(hj)/h]h Parameters}(hj+/hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj'/ubah}(h]h ]h"]h$]h&]uh1hhe/var/lib/git/docbuild/linux/Documentation/dev-tools/kunit/api/resource:12: ./include/kunit/resource.hhMhj#/ubj)}(hhh](j)}(h@``struct kunit *test`` Test case the action is associated with. h](j)}(h``struct kunit *test``h]j )}(hjH/h]hstruct kunit *test}(hjJ/hhhNhNubah}(h]h ]h"]h$]h&]uh1j hjF/ubah}(h]h ]h"]h$]h&]uh1jhe/var/lib/git/docbuild/linux/Documentation/dev-tools/kunit/api/resource:12: ./include/kunit/resource.hhMhjB/ubj )}(hhh]h)}(h(Test case the action is associated with.h]h(Test case the action is associated with.}(hja/hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj]/hMhj^/ubah}(h]h ]h"]h$]h&]uh1jhjB/ubeh}(h]h ]h"]h$]h&]uh1jhj]/hMhj?/ubj)}(h<``kunit_action_t *action`` The deferred function to cancel. h](j)}(h``kunit_action_t *action``h]j )}(hj/h]hkunit_action_t *action}(hj/hhhNhNubah}(h]h ]h"]h$]h&]uh1j hj/ubah}(h]h ]h"]h$]h&]uh1jhe/var/lib/git/docbuild/linux/Documentation/dev-tools/kunit/api/resource:12: ./include/kunit/resource.hhMhj{/ubj )}(hhh]h)}(h The deferred function to cancel.h]h The deferred function to cancel.}(hj/hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj/hMhj/ubah}(h]h ]h"]h$]h&]uh1jhj{/ubeh}(h]h ]h"]h$]h&]uh1jhj/hMhj?/ubj)}(hF``void *ctx`` The context passed to the deferred function to trigger. h](j)}(h ``void *ctx``h]j )}(hj/h]h void *ctx}(hj/hhhNhNubah}(h]h ]h"]h$]h&]uh1j hj/ubah}(h]h ]h"]h$]h&]uh1jhe/var/lib/git/docbuild/linux/Documentation/dev-tools/kunit/api/resource:12: ./include/kunit/resource.hhMhj/ubj )}(hhh]h)}(h7The context passed to the deferred function to trigger.h]h7The context passed to the deferred function to trigger.}(hj/hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj/hMhj/ubah}(h]h ]h"]h$]h&]uh1jhj/ubeh}(h]h ]h"]h$]h&]uh1jhj/hMhj?/ubeh}(h]h ]h"]h$]h&]uh1jhj#/ubh)}(h**Description**h]j)}(hj/h]h Description}(hj/hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj/ubah}(h]h ]h"]h$]h&]uh1hhe/var/lib/git/docbuild/linux/Documentation/dev-tools/kunit/api/resource:12: ./include/kunit/resource.hhMhj#/ubh)}(hZPrevent an action deferred via kunit_add_action() from executing when the test terminates.h]hZPrevent an action deferred via kunit_add_action() from executing when the test terminates.}(hj 0hhhNhNubah}(h]h ]h"]h$]h&]uh1hhe/var/lib/git/docbuild/linux/Documentation/dev-tools/kunit/api/resource:12: ./include/kunit/resource.hhMhj#/ubh)}(heIf the function/context pair was deferred multiple times, only the most recent one will be cancelled.h]heIf the function/context pair was deferred multiple times, only the most recent one will be cancelled.}(hj0hhhNhNubah}(h]h ]h"]h$]h&]uh1hhe/var/lib/git/docbuild/linux/Documentation/dev-tools/kunit/api/resource:12: ./include/kunit/resource.hhMhj#/ubh)}(h9See also: devm_remove_action() for the devres equivalent.h]h9See also: devm_remove_action() for the devres equivalent.}(hj)0hhhNhNubah}(h]h ]h"]h$]h&]uh1hhe/var/lib/git/docbuild/linux/Documentation/dev-tools/kunit/api/resource:12: ./include/kunit/resource.hhMhj#/ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhhhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j!kunit_release_action (C function)c.kunit_release_actionhNtauh1hhhhhhNhNubj )}(hhh](j)}(hQvoid kunit_release_action (struct kunit *test, kunit_action_t *action, void *ctx)h]j)}(hPvoid kunit_release_action(struct kunit *test, kunit_action_t *action, void *ctx)h](jZ)}(hvoidh]hvoid}(hjX0hhhNhNubah}(h]h ]jfah"]h$]h&]uh1jYhjT0hhhe/var/lib/git/docbuild/linux/Documentation/dev-tools/kunit/api/resource:12: ./include/kunit/resource.hhMubj0)}(h h]h }(hjg0hhhNhNubah}(h]h ]j<ah"]h$]h&]uh1j/hjT0hhhjf0hMubjA)}(hkunit_release_actionh]jG)}(hkunit_release_actionh]hkunit_release_action}(hjy0hhhNhNubah}(h]h ]jRah"]h$]h&]uh1jFhju0ubah}(h]h ](jYjZeh"]h$]h&]hhuh1j@hjT0hhhjf0hMubj)}(h7(struct kunit *test, kunit_action_t *action, void *ctx)h](j)}(hstruct kunit *testh](j)}(hj!h]hstruct}(hj0hhhNhNubah}(h]h ]j*ah"]h$]h&]uh1jhj0ubj0)}(h h]h }(hj0hhhNhNubah}(h]h ]j<ah"]h$]h&]uh1j/hj0ubh)}(hhh]jG)}(hkunith]hkunit}(hj0hhhNhNubah}(h]h ]jRah"]h$]h&]uh1jFhj0ubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetj0modnameN classnameNjj)}j]j)}jj{0sbc.kunit_release_actionasbuh1hhj0ubj0)}(h h]h }(hj0hhhNhNubah}(h]h ]j<ah"]h$]h&]uh1j/hj0ubj)}(hjh]h*}(hj0hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj0ubjG)}(htesth]htest}(hj0hhhNhNubah}(h]h ]jRah"]h$]h&]uh1jFhj0ubeh}(h]h ]h"]h$]h&]noemphhhuh1jhj0ubj)}(hkunit_action_t *actionh](h)}(hhh]jG)}(hkunit_action_th]hkunit_action_t}(hj 1hhhNhNubah}(h]h ]jRah"]h$]h&]uh1jFhj1ubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetj 1modnameN classnameNjj)}j]j0c.kunit_release_actionasbuh1hhj1ubj0)}(h h]h }(hj(1hhhNhNubah}(h]h ]j<ah"]h$]h&]uh1j/hj1ubj)}(hjh]h*}(hj61hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj1ubjG)}(hactionh]haction}(hjC1hhhNhNubah}(h]h ]jRah"]h$]h&]uh1jFhj1ubeh}(h]h ]h"]h$]h&]noemphhhuh1jhj0ubj)}(h void *ctxh](jZ)}(hvoidh]hvoid}(hj\1hhhNhNubah}(h]h ]jfah"]h$]h&]uh1jYhjX1ubj0)}(h h]h }(hjj1hhhNhNubah}(h]h ]j<ah"]h$]h&]uh1j/hjX1ubj)}(hjh]h*}(hjx1hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjX1ubjG)}(hctxh]hctx}(hj1hhhNhNubah}(h]h ]jRah"]h$]h&]uh1jFhjX1ubeh}(h]h ]h"]h$]h&]noemphhhuh1jhj0ubeh}(h]h ]h"]h$]h&]hhuh1jhjT0hhhjf0hMubeh}(h]h ]h"]h$]h&]hhjduh1jjejfhjP0hhhjf0hMubah}(h]jK0ah ](jjjkeh"]h$]h&]jojp)jqhuh1jhjf0hMhjM0hhubjs)}(hhh]h)}(h'Run a matching action call immediately.h]h'Run a matching action call immediately.}(hj1hhhNhNubah}(h]h ]h"]h$]h&]uh1hhe/var/lib/git/docbuild/linux/Documentation/dev-tools/kunit/api/resource:12: ./include/kunit/resource.hhMhj1hhubah}(h]h ]h"]h$]h&]uh1jrhjM0hhhjf0hMubeh}(h]h ](jfunctioneh"]h$]h&]jjjj1jj1jjjuh1j hhhhhNhNubj)}(hX**Parameters** ``struct kunit *test`` Test case the action is associated with. ``kunit_action_t *action`` The deferred function to trigger. ``void *ctx`` The context passed to the deferred function to trigger. **Description** Execute a function deferred via kunit_add_action()) immediately, rather than when the test ends. If the function/context pair was deferred multiple times, it will only be executed once here. The most recent deferral will no longer execute when the test ends. kunit_release_action(test, func, ctx); is equivalent to func(ctx); kunit_remove_action(test, func, ctx); See also: devm_release_action() for the devres equivalent.h](h)}(h**Parameters**h]j)}(hj1h]h Parameters}(hj1hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj1ubah}(h]h ]h"]h$]h&]uh1hhe/var/lib/git/docbuild/linux/Documentation/dev-tools/kunit/api/resource:12: ./include/kunit/resource.hhMhj1ubj)}(hhh](j)}(h@``struct kunit *test`` Test case the action is associated with. h](j)}(h``struct kunit *test``h]j )}(hj1h]hstruct kunit *test}(hj1hhhNhNubah}(h]h ]h"]h$]h&]uh1j hj1ubah}(h]h ]h"]h$]h&]uh1jhe/var/lib/git/docbuild/linux/Documentation/dev-tools/kunit/api/resource:12: ./include/kunit/resource.hhMhj1ubj )}(hhh]h)}(h(Test case the action is associated with.h]h(Test case the action is associated with.}(hj 2hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj2hMhj2ubah}(h]h ]h"]h$]h&]uh1jhj1ubeh}(h]h ]h"]h$]h&]uh1jhj2hMhj1ubj)}(h=``kunit_action_t *action`` The deferred function to trigger. h](j)}(h``kunit_action_t *action``h]j )}(hj)2h]hkunit_action_t *action}(hj+2hhhNhNubah}(h]h ]h"]h$]h&]uh1j hj'2ubah}(h]h ]h"]h$]h&]uh1jhe/var/lib/git/docbuild/linux/Documentation/dev-tools/kunit/api/resource:12: ./include/kunit/resource.hhMhj#2ubj )}(hhh]h)}(h!The deferred function to trigger.h]h!The deferred function to trigger.}(hjB2hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj>2hMhj?2ubah}(h]h ]h"]h$]h&]uh1jhj#2ubeh}(h]h ]h"]h$]h&]uh1jhj>2hMhj1ubj)}(hF``void *ctx`` The context passed to the deferred function to trigger. h](j)}(h ``void *ctx``h]j )}(hjb2h]h void *ctx}(hjd2hhhNhNubah}(h]h ]h"]h$]h&]uh1j hj`2ubah}(h]h ]h"]h$]h&]uh1jhe/var/lib/git/docbuild/linux/Documentation/dev-tools/kunit/api/resource:12: ./include/kunit/resource.hhMhj\2ubj )}(hhh]h)}(h7The context passed to the deferred function to trigger.h]h7The context passed to the deferred function to trigger.}(hj{2hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjw2hMhjx2ubah}(h]h ]h"]h$]h&]uh1jhj\2ubeh}(h]h ]h"]h$]h&]uh1jhjw2hMhj1ubeh}(h]h ]h"]h$]h&]uh1jhj1ubh)}(h**Description**h]j)}(hj2h]h Description}(hj2hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj2ubah}(h]h ]h"]h$]h&]uh1hhe/var/lib/git/docbuild/linux/Documentation/dev-tools/kunit/api/resource:12: ./include/kunit/resource.hhMhj1ubh)}(h`Execute a function deferred via kunit_add_action()) immediately, rather than when the test ends.h]h`Execute a function deferred via kunit_add_action()) immediately, rather than when the test ends.}(hj2hhhNhNubah}(h]h ]h"]h$]h&]uh1hhe/var/lib/git/docbuild/linux/Documentation/dev-tools/kunit/api/resource:12: ./include/kunit/resource.hhMhj1ubh)}(hIf the function/context pair was deferred multiple times, it will only be executed once here. The most recent deferral will no longer execute when the test ends.h]hIf the function/context pair was deferred multiple times, it will only be executed once here. The most recent deferral will no longer execute when the test ends.}(hj2hhhNhNubah}(h]h ]h"]h$]h&]uh1hhe/var/lib/git/docbuild/linux/Documentation/dev-tools/kunit/api/resource:12: ./include/kunit/resource.hhMhj1ubh)}(hhkunit_release_action(test, func, ctx); is equivalent to func(ctx); kunit_remove_action(test, func, ctx);h]hhkunit_release_action(test, func, ctx); is equivalent to func(ctx); kunit_remove_action(test, func, ctx);}(hj2hhhNhNubah}(h]h ]h"]h$]h&]uh1hhe/var/lib/git/docbuild/linux/Documentation/dev-tools/kunit/api/resource:12: ./include/kunit/resource.hhMhj1ubh)}(h:See also: devm_release_action() for the devres equivalent.h]h:See also: devm_release_action() for the devres equivalent.}(hj2hhhNhNubah}(h]h ]h"]h$]h&]uh1hhe/var/lib/git/docbuild/linux/Documentation/dev-tools/kunit/api/resource:12: ./include/kunit/resource.hhMhj1ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhhhhhNhNubh)}(hhh](h)}(hManaged Devicesh]hManaged Devices}(hj2hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj2hhhhhKubh)}(hrFunctions for using KUnit-managed struct device and struct device_driver. Include ``kunit/device.h`` to use these.h](hRFunctions for using KUnit-managed struct device and struct device_driver. Include }(hj3hhhNhNubj )}(h``kunit/device.h``h]hkunit/device.h}(hj3hhhNhNubah}(h]h ]h"]h$]h&]uh1j hj3ubh to use these.}(hj3hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKhj2hhubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j kunit_driver_create (C function)c.kunit_driver_createhNtauh1hhj2hhhNhNubj )}(hhh](j)}(hQstruct device_driver * kunit_driver_create (struct kunit *test, const char *name)h]j)}(hOstruct device_driver *kunit_driver_create(struct kunit *test, const char *name)h](j)}(hj!h]hstruct}(hj@3hhhNhNubah}(h]h ]j*ah"]h$]h&]uh1jhj<3hhhc/var/lib/git/docbuild/linux/Documentation/dev-tools/kunit/api/resource:21: ./include/kunit/device.hhKubj0)}(h h]h }(hjN3hhhNhNubah}(h]h ]j<ah"]h$]h&]uh1j/hj<3hhhjM3hKubh)}(hhh]jG)}(h device_driverh]h device_driver}(hj_3hhhNhNubah}(h]h ]jRah"]h$]h&]uh1jFhj\3ubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetja3modnameN classnameNjj)}j]j)}jkunit_driver_createsbc.kunit_driver_createasbuh1hhj<3hhhjM3hKubj0)}(h h]h }(hj3hhhNhNubah}(h]h ]j<ah"]h$]h&]uh1j/hj<3hhhjM3hKubj)}(hjh]h*}(hj3hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj<3hhhjM3hKubjA)}(hkunit_driver_createh]jG)}(hj}3h]hkunit_driver_create}(hj3hhhNhNubah}(h]h ]jRah"]h$]h&]uh1jFhj3ubah}(h]h ](jYjZeh"]h$]h&]hhuh1j@hj<3hhhjM3hKubj)}(h&(struct kunit *test, const char *name)h](j)}(hstruct kunit *testh](j)}(hj!h]hstruct}(hj3hhhNhNubah}(h]h ]j*ah"]h$]h&]uh1jhj3ubj0)}(h h]h }(hj3hhhNhNubah}(h]h ]j<ah"]h$]h&]uh1j/hj3ubh)}(hhh]jG)}(hkunith]hkunit}(hj3hhhNhNubah}(h]h ]jRah"]h$]h&]uh1jFhj3ubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetj3modnameN classnameNjj)}j]j{3c.kunit_driver_createasbuh1hhj3ubj0)}(h h]h }(hj3hhhNhNubah}(h]h ]j<ah"]h$]h&]uh1j/hj3ubj)}(hjh]h*}(hj4hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj3ubjG)}(htesth]htest}(hj4hhhNhNubah}(h]h ]jRah"]h$]h&]uh1jFhj3ubeh}(h]h ]h"]h$]h&]noemphhhuh1jhj3ubj)}(hconst char *nameh](j)}(hjWh]hconst}(hj*4hhhNhNubah}(h]h ]j*ah"]h$]h&]uh1jhj&4ubj0)}(h h]h }(hj74hhhNhNubah}(h]h ]j<ah"]h$]h&]uh1j/hj&4ubjZ)}(hcharh]hchar}(hjE4hhhNhNubah}(h]h ]jfah"]h$]h&]uh1jYhj&4ubj0)}(h h]h }(hjS4hhhNhNubah}(h]h ]j<ah"]h$]h&]uh1j/hj&4ubj)}(hjh]h*}(hja4hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj&4ubjG)}(hnameh]hname}(hjn4hhhNhNubah}(h]h ]jRah"]h$]h&]uh1jFhj&4ubeh}(h]h ]h"]h$]h&]noemphhhuh1jhj3ubeh}(h]h ]h"]h$]h&]hhuh1jhj<3hhhjM3hKubeh}(h]h ]h"]h$]h&]hhjduh1jjejfhj83hhhjM3hKubah}(h]j33ah ](jjjkeh"]h$]h&]jojp)jqhuh1jhjM3hKhj53hhubjs)}(hhh]h)}(h7Create a struct device_driver attached to the kunit_bush]h7Create a struct device_driver attached to the kunit_bus}(hj4hhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/dev-tools/kunit/api/resource:21: ./include/kunit/device.hhKhj4hhubah}(h]h ]h"]h$]h&]uh1jrhj53hhhjM3hKubeh}(h]h ](jfunctioneh"]h$]h&]jjjj4jj4jjjuh1j hhhj2hNhNubj)}(hXq**Parameters** ``struct kunit *test`` The test context object. ``const char *name`` The name to give the created driver. **Description** Creates a struct device_driver attached to the kunit_bus, with the name **name**. This driver will automatically be cleaned up on test exit. **Return** a stub struct device_driver, managed by KUnit, with the name **name**.h](h)}(h**Parameters**h]j)}(hj4h]h Parameters}(hj4hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj4ubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/dev-tools/kunit/api/resource:21: ./include/kunit/device.hhKhj4ubj)}(hhh](j)}(h0``struct kunit *test`` The test context object. h](j)}(h``struct kunit *test``h]j )}(hj4h]hstruct kunit *test}(hj4hhhNhNubah}(h]h ]h"]h$]h&]uh1j hj4ubah}(h]h ]h"]h$]h&]uh1jhc/var/lib/git/docbuild/linux/Documentation/dev-tools/kunit/api/resource:21: ./include/kunit/device.hhKhj4ubj )}(hhh]h)}(hThe test context object.h]hThe test context object.}(hj4hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj4hKhj4ubah}(h]h ]h"]h$]h&]uh1jhj4ubeh}(h]h ]h"]h$]h&]uh1jhj4hKhj4ubj)}(h:``const char *name`` The name to give the created driver. h](j)}(h``const char *name``h]j )}(hj5h]hconst char *name}(hj5hhhNhNubah}(h]h ]h"]h$]h&]uh1j hj5ubah}(h]h ]h"]h$]h&]uh1jhc/var/lib/git/docbuild/linux/Documentation/dev-tools/kunit/api/resource:21: ./include/kunit/device.hhKhj 5ubj )}(hhh]h)}(h$The name to give the created driver.h]h$The name to give the created driver.}(hj+5hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj'5hKhj(5ubah}(h]h ]h"]h$]h&]uh1jhj 5ubeh}(h]h ]h"]h$]h&]uh1jhj'5hKhj4ubeh}(h]h ]h"]h$]h&]uh1jhj4ubh)}(h**Description**h]j)}(hjM5h]h Description}(hjO5hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjK5ubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/dev-tools/kunit/api/resource:21: ./include/kunit/device.hhKhj4ubh)}(hCreates a struct device_driver attached to the kunit_bus, with the name **name**. This driver will automatically be cleaned up on test exit.h](hHCreates a struct device_driver attached to the kunit_bus, with the name }(hjc5hhhNhNubj)}(h**name**h]hname}(hjk5hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjc5ubh<. This driver will automatically be cleaned up on test exit.}(hjc5hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/dev-tools/kunit/api/resource:21: ./include/kunit/device.hhKhj4ubh)}(h **Return**h]j)}(hj5h]hReturn}(hj5hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj5ubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/dev-tools/kunit/api/resource:21: ./include/kunit/device.hhKhj4ubh)}(hFa stub struct device_driver, managed by KUnit, with the name **name**.h](h=a stub struct device_driver, managed by KUnit, with the name }(hj5hhhNhNubj)}(h**name**h]hname}(hj5hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj5ubh.}(hj5hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/dev-tools/kunit/api/resource:21: ./include/kunit/device.hhKhj4ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj2hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j"kunit_device_register (C function)c.kunit_device_registerhNtauh1hhj2hhhNhNubj )}(hhh](j)}(hLstruct device * kunit_device_register (struct kunit *test, const char *name)h]j)}(hJstruct device *kunit_device_register(struct kunit *test, const char *name)h](j)}(hj!h]hstruct}(hj5hhhNhNubah}(h]h ]j*ah"]h$]h&]uh1jhj5hhhc/var/lib/git/docbuild/linux/Documentation/dev-tools/kunit/api/resource:21: ./include/kunit/device.hhK"ubj0)}(h h]h }(hj5hhhNhNubah}(h]h ]j<ah"]h$]h&]uh1j/hj5hhhj5hK"ubh)}(hhh]jG)}(hdeviceh]hdevice}(hj5hhhNhNubah}(h]h ]jRah"]h$]h&]uh1jFhj5ubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetj5modnameN classnameNjj)}j]j)}jkunit_device_registersbc.kunit_device_registerasbuh1hhj5hhhj5hK"ubj0)}(h h]h }(hj6hhhNhNubah}(h]h ]j<ah"]h$]h&]uh1j/hj5hhhj5hK"ubj)}(hjh]h*}(hj+6hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj5hhhj5hK"ubjA)}(hkunit_device_registerh]jG)}(hj6h]hkunit_device_register}(hj<6hhhNhNubah}(h]h ]jRah"]h$]h&]uh1jFhj86ubah}(h]h ](jYjZeh"]h$]h&]hhuh1j@hj5hhhj5hK"ubj)}(h&(struct kunit *test, const char *name)h](j)}(hstruct kunit *testh](j)}(hj!h]hstruct}(hjW6hhhNhNubah}(h]h ]j*ah"]h$]h&]uh1jhjS6ubj0)}(h h]h }(hjd6hhhNhNubah}(h]h ]j<ah"]h$]h&]uh1j/hjS6ubh)}(hhh]jG)}(hkunith]hkunit}(hju6hhhNhNubah}(h]h ]jRah"]h$]h&]uh1jFhjr6ubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjw6modnameN classnameNjj)}j]j6c.kunit_device_registerasbuh1hhjS6ubj0)}(h h]h }(hj6hhhNhNubah}(h]h ]j<ah"]h$]h&]uh1j/hjS6ubj)}(hjh]h*}(hj6hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjS6ubjG)}(htesth]htest}(hj6hhhNhNubah}(h]h ]jRah"]h$]h&]uh1jFhjS6ubeh}(h]h ]h"]h$]h&]noemphhhuh1jhjO6ubj)}(hconst char *nameh](j)}(hjWh]hconst}(hj6hhhNhNubah}(h]h ]j*ah"]h$]h&]uh1jhj6ubj0)}(h h]h }(hj6hhhNhNubah}(h]h ]j<ah"]h$]h&]uh1j/hj6ubjZ)}(hcharh]hchar}(hj6hhhNhNubah}(h]h ]jfah"]h$]h&]uh1jYhj6ubj0)}(h h]h }(hj6hhhNhNubah}(h]h ]j<ah"]h$]h&]uh1j/hj6ubj)}(hjh]h*}(hj6hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj6ubjG)}(hnameh]hname}(hj 7hhhNhNubah}(h]h ]jRah"]h$]h&]uh1jFhj6ubeh}(h]h ]h"]h$]h&]noemphhhuh1jhjO6ubeh}(h]h ]h"]h$]h&]hhuh1jhj5hhhj5hK"ubeh}(h]h ]h"]h$]h&]hhjduh1jjejfhj5hhhj5hK"ubah}(h]j5ah ](jjjkeh"]h$]h&]jojp)jqhuh1jhj5hK"hj5hhubjs)}(hhh]h)}(h-Create a struct device for use in KUnit testsh]h-Create a struct device for use in KUnit tests}(hj57hhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/dev-tools/kunit/api/resource:21: ./include/kunit/device.hhK"hj27hhubah}(h]h ]h"]h$]h&]uh1jrhj5hhhj5hK"ubeh}(h]h ](jfunctioneh"]h$]h&]jjjjM7jjM7jjjuh1j hhhj2hNhNubj)}(hX^**Parameters** ``struct kunit *test`` The test context object. ``const char *name`` The name to give the created device. **Description** Creates a struct kunit_device (which is a struct device) with the given name, and a corresponding driver. The device and driver will be cleaned up on test exit, or when kunit_device_unregister is called. See also kunit_device_register_with_driver, if you wish to provide your own struct device_driver. **Return** a pointer to a struct device which will be cleaned up when the test exits, or an error pointer if the device could not be allocated or registered.h](h)}(h**Parameters**h]j)}(hjW7h]h Parameters}(hjY7hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjU7ubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/dev-tools/kunit/api/resource:21: ./include/kunit/device.hhK&hjQ7ubj)}(hhh](j)}(h0``struct kunit *test`` The test context object. h](j)}(h``struct kunit *test``h]j )}(hjv7h]hstruct kunit *test}(hjx7hhhNhNubah}(h]h ]h"]h$]h&]uh1j hjt7ubah}(h]h ]h"]h$]h&]uh1jhc/var/lib/git/docbuild/linux/Documentation/dev-tools/kunit/api/resource:21: ./include/kunit/device.hhK#hjp7ubj )}(hhh]h)}(hThe test context object.h]hThe test context object.}(hj7hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj7hK#hj7ubah}(h]h ]h"]h$]h&]uh1jhjp7ubeh}(h]h ]h"]h$]h&]uh1jhj7hK#hjm7ubj)}(h:``const char *name`` The name to give the created device. h](j)}(h``const char *name``h]j )}(hj7h]hconst char *name}(hj7hhhNhNubah}(h]h ]h"]h$]h&]uh1j hj7ubah}(h]h ]h"]h$]h&]uh1jhc/var/lib/git/docbuild/linux/Documentation/dev-tools/kunit/api/resource:21: ./include/kunit/device.hhK$hj7ubj )}(hhh]h)}(h$The name to give the created device.h]h$The name to give the created device.}(hj7hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj7hK$hj7ubah}(h]h ]h"]h$]h&]uh1jhj7ubeh}(h]h ]h"]h$]h&]uh1jhj7hK$hjm7ubeh}(h]h ]h"]h$]h&]uh1jhjQ7ubh)}(h**Description**h]j)}(hj7h]h Description}(hj7hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj7ubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/dev-tools/kunit/api/resource:21: ./include/kunit/device.hhK&hjQ7ubh)}(hX-Creates a struct kunit_device (which is a struct device) with the given name, and a corresponding driver. The device and driver will be cleaned up on test exit, or when kunit_device_unregister is called. See also kunit_device_register_with_driver, if you wish to provide your own struct device_driver.h]hX-Creates a struct kunit_device (which is a struct device) with the given name, and a corresponding driver. The device and driver will be cleaned up on test exit, or when kunit_device_unregister is called. See also kunit_device_register_with_driver, if you wish to provide your own struct device_driver.}(hj8hhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/dev-tools/kunit/api/resource:21: ./include/kunit/device.hhK%hjQ7ubh)}(h **Return**h]j)}(hj8h]hReturn}(hj8hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj8ubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/dev-tools/kunit/api/resource:21: ./include/kunit/device.hhK+hjQ7ubh)}(ha pointer to a struct device which will be cleaned up when the test exits, or an error pointer if the device could not be allocated or registered.h]ha pointer to a struct device which will be cleaned up when the test exits, or an error pointer if the device could not be allocated or registered.}(hj'8hhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/dev-tools/kunit/api/resource:21: ./include/kunit/device.hhK,hjQ7ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj2hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](j.kunit_device_register_with_driver (C function)#c.kunit_device_register_with_driverhNtauh1hhj2hhhNhNubj )}(hhh](j)}(hystruct device * kunit_device_register_with_driver (struct kunit *test, const char *name, const struct device_driver *drv)h]j)}(hwstruct device *kunit_device_register_with_driver(struct kunit *test, const char *name, const struct device_driver *drv)h](j)}(hj!h]hstruct}(hjV8hhhNhNubah}(h]h ]j*ah"]h$]h&]uh1jhjR8hhhc/var/lib/git/docbuild/linux/Documentation/dev-tools/kunit/api/resource:21: ./include/kunit/device.hhK2ubj0)}(h h]h }(hjd8hhhNhNubah}(h]h ]j<ah"]h$]h&]uh1j/hjR8hhhjc8hK2ubh)}(hhh]jG)}(hdeviceh]hdevice}(hju8hhhNhNubah}(h]h ]jRah"]h$]h&]uh1jFhjr8ubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjw8modnameN classnameNjj)}j]j)}j!kunit_device_register_with_driversb#c.kunit_device_register_with_driverasbuh1hhjR8hhhjc8hK2ubj0)}(h h]h }(hj8hhhNhNubah}(h]h ]j<ah"]h$]h&]uh1j/hjR8hhhjc8hK2ubj)}(hjh]h*}(hj8hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjR8hhhjc8hK2ubjA)}(h!kunit_device_register_with_driverh]jG)}(hj8h]h!kunit_device_register_with_driver}(hj8hhhNhNubah}(h]h ]jRah"]h$]h&]uh1jFhj8ubah}(h]h ](jYjZeh"]h$]h&]hhuh1j@hjR8hhhjc8hK2ubj)}(hG(struct kunit *test, const char *name, const struct device_driver *drv)h](j)}(hstruct kunit *testh](j)}(hj!h]hstruct}(hj8hhhNhNubah}(h]h ]j*ah"]h$]h&]uh1jhj8ubj0)}(h h]h }(hj8hhhNhNubah}(h]h ]j<ah"]h$]h&]uh1j/hj8ubh)}(hhh]jG)}(hkunith]hkunit}(hj8hhhNhNubah}(h]h ]jRah"]h$]h&]uh1jFhj8ubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetj8modnameN classnameNjj)}j]j8#c.kunit_device_register_with_driverasbuh1hhj8ubj0)}(h h]h }(hj 9hhhNhNubah}(h]h ]j<ah"]h$]h&]uh1j/hj8ubj)}(hjh]h*}(hj9hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj8ubjG)}(htesth]htest}(hj'9hhhNhNubah}(h]h ]jRah"]h$]h&]uh1jFhj8ubeh}(h]h ]h"]h$]h&]noemphhhuh1jhj8ubj)}(hconst char *nameh](j)}(hjWh]hconst}(hj@9hhhNhNubah}(h]h ]j*ah"]h$]h&]uh1jhj<9ubj0)}(h h]h }(hjM9hhhNhNubah}(h]h ]j<ah"]h$]h&]uh1j/hj<9ubjZ)}(hcharh]hchar}(hj[9hhhNhNubah}(h]h ]jfah"]h$]h&]uh1jYhj<9ubj0)}(h h]h }(hji9hhhNhNubah}(h]h ]j<ah"]h$]h&]uh1j/hj<9ubj)}(hjh]h*}(hjw9hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj<9ubjG)}(hnameh]hname}(hj9hhhNhNubah}(h]h ]jRah"]h$]h&]uh1jFhj<9ubeh}(h]h ]h"]h$]h&]noemphhhuh1jhj8ubj)}(hconst struct device_driver *drvh](j)}(hjWh]hconst}(hj9hhhNhNubah}(h]h ]j*ah"]h$]h&]uh1jhj9ubj0)}(h h]h }(hj9hhhNhNubah}(h]h ]j<ah"]h$]h&]uh1j/hj9ubj)}(hj!h]hstruct}(hj9hhhNhNubah}(h]h ]j*ah"]h$]h&]uh1jhj9ubj0)}(h h]h }(hj9hhhNhNubah}(h]h ]j<ah"]h$]h&]uh1j/hj9ubh)}(hhh]jG)}(h device_driverh]h device_driver}(hj9hhhNhNubah}(h]h ]jRah"]h$]h&]uh1jFhj9ubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetj9modnameN classnameNjj)}j]j8#c.kunit_device_register_with_driverasbuh1hhj9ubj0)}(h h]h }(hj9hhhNhNubah}(h]h ]j<ah"]h$]h&]uh1j/hj9ubj)}(hjh]h*}(hj:hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj9ubjG)}(hdrvh]hdrv}(hj:hhhNhNubah}(h]h ]jRah"]h$]h&]uh1jFhj9ubeh}(h]h ]h"]h$]h&]noemphhhuh1jhj8ubeh}(h]h ]h"]h$]h&]hhuh1jhjR8hhhjc8hK2ubeh}(h]h ]h"]h$]h&]hhjduh1jjejfhjN8hhhjc8hK2ubah}(h]jI8ah ](jjjkeh"]h$]h&]jojp)jqhuh1jhjc8hK2hjK8hhubjs)}(hhh]h)}(h-Create a struct device for use in KUnit testsh]h-Create a struct device for use in KUnit tests}(hj9:hhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/dev-tools/kunit/api/resource:21: ./include/kunit/device.hhK2hj6:hhubah}(h]h ]h"]h$]h&]uh1jrhjK8hhhjc8hK2ubeh}(h]h ](jfunctioneh"]h$]h&]jjjjQ:jjQ:jjjuh1j hhhj2hNhNubj)}(hX**Parameters** ``struct kunit *test`` The test context object. ``const char *name`` The name to give the created device. ``const struct device_driver *drv`` The struct device_driver to associate with the device. **Description** Creates a struct kunit_device (which is a struct device) with the given name, and driver. The device will be cleaned up on test exit, or when kunit_device_unregister is called. See also kunit_device_register, if you wish KUnit to create and manage a driver for you. **Return** a pointer to a struct device which will be cleaned up when the test exits, or an error pointer if the device could not be allocated or registered.h](h)}(h**Parameters**h]j)}(hj[:h]h Parameters}(hj]:hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjY:ubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/dev-tools/kunit/api/resource:21: ./include/kunit/device.hhK6hjU:ubj)}(hhh](j)}(h0``struct kunit *test`` The test context object. h](j)}(h``struct kunit *test``h]j )}(hjz:h]hstruct kunit *test}(hj|:hhhNhNubah}(h]h ]h"]h$]h&]uh1j hjx:ubah}(h]h ]h"]h$]h&]uh1jhc/var/lib/git/docbuild/linux/Documentation/dev-tools/kunit/api/resource:21: ./include/kunit/device.hhK3hjt:ubj )}(hhh]h)}(hThe test context object.h]hThe test context object.}(hj:hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj:hK3hj:ubah}(h]h ]h"]h$]h&]uh1jhjt:ubeh}(h]h ]h"]h$]h&]uh1jhj:hK3hjq:ubj)}(h:``const char *name`` The name to give the created device. h](j)}(h``const char *name``h]j )}(hj:h]hconst char *name}(hj:hhhNhNubah}(h]h ]h"]h$]h&]uh1j hj:ubah}(h]h ]h"]h$]h&]uh1jhc/var/lib/git/docbuild/linux/Documentation/dev-tools/kunit/api/resource:21: ./include/kunit/device.hhK4hj:ubj )}(hhh]h)}(h$The name to give the created device.h]h$The name to give the created device.}(hj:hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj:hK4hj:ubah}(h]h ]h"]h$]h&]uh1jhj:ubeh}(h]h ]h"]h$]h&]uh1jhj:hK4hjq:ubj)}(h[``const struct device_driver *drv`` The struct device_driver to associate with the device. h](j)}(h#``const struct device_driver *drv``h]j )}(hj:h]hconst struct device_driver *drv}(hj:hhhNhNubah}(h]h ]h"]h$]h&]uh1j hj:ubah}(h]h ]h"]h$]h&]uh1jhc/var/lib/git/docbuild/linux/Documentation/dev-tools/kunit/api/resource:21: ./include/kunit/device.hhK5hj:ubj )}(hhh]h)}(h6The struct device_driver to associate with the device.h]h6The struct device_driver to associate with the device.}(hj;hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj;hK5hj;ubah}(h]h ]h"]h$]h&]uh1jhj:ubeh}(h]h ]h"]h$]h&]uh1jhj;hK5hjq:ubeh}(h]h ]h"]h$]h&]uh1jhjU:ubh)}(h**Description**h]j)}(hj';h]h Description}(hj);hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj%;ubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/dev-tools/kunit/api/resource:21: ./include/kunit/device.hhK7hjU:ubh)}(hX Creates a struct kunit_device (which is a struct device) with the given name, and driver. The device will be cleaned up on test exit, or when kunit_device_unregister is called. See also kunit_device_register, if you wish KUnit to create and manage a driver for you.h]hX Creates a struct kunit_device (which is a struct device) with the given name, and driver. The device will be cleaned up on test exit, or when kunit_device_unregister is called. See also kunit_device_register, if you wish KUnit to create and manage a driver for you.}(hj=;hhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/dev-tools/kunit/api/resource:21: ./include/kunit/device.hhK6hjU:ubh)}(h **Return**h]j)}(hjN;h]hReturn}(hjP;hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjL;ubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/dev-tools/kunit/api/resource:21: ./include/kunit/device.hhK;hjU:ubh)}(ha pointer to a struct device which will be cleaned up when the test exits, or an error pointer if the device could not be allocated or registered.h]ha pointer to a struct device which will be cleaned up when the test exits, or an error pointer if the device could not be allocated or registered.}(hjd;hhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/dev-tools/kunit/api/resource:21: ./include/kunit/device.hhK<ubj0)}(h h]h }(hjO<hhhNhNubah}(h]h ]j<ah"]h$]h&]uh1j/hj><ubh)}(hhh]jG)}(hdeviceh]hdevice}(hj`<hhhNhNubah}(h]h ]jRah"]h$]h&]uh1jFhj]<ubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjb<modnameN classnameNjj)}j]j <c.kunit_device_unregisterasbuh1hhj><ubj0)}(h h]h }(hj~<hhhNhNubah}(h]h ]j<ah"]h$]h&]uh1j/hj><ubj)}(hjh]h*}(hj<hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj><ubjG)}(hdevh]hdev}(hj<hhhNhNubah}(h]h ]jRah"]h$]h&]uh1jFhj><ubeh}(h]h ]h"]h$]h&]noemphhhuh1jhj;ubeh}(h]h ]h"]h$]h&]hhuh1jhj;hhhj;hKDubeh}(h]h ]h"]h$]h&]hhjduh1jjejfhj;hhhj;hKDubah}(h]j;ah ](jjjkeh"]h$]h&]jojp)jqhuh1jhj;hKDhj;hhubjs)}(hhh]h)}(h!Unregister a KUnit-managed deviceh]h!Unregister a KUnit-managed device}(hj<hhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/dev-tools/kunit/api/resource:21: ./include/kunit/device.hhKDhj<hhubah}(h]h ]h"]h$]h&]uh1jrhj;hhhj;hKDubeh}(h]h ](jfunctioneh"]h$]h&]jjjj<jj<jjjuh1j hhhj2hNhNubj)}(hX>**Parameters** ``struct kunit *test`` The test context object which created the device ``struct device *dev`` The device. **Description** Unregisters and destroys a struct device which was created with kunit_device_register or kunit_device_register_with_driver. If KUnit created a driver, cleans it up as well.h](h)}(h**Parameters**h]j)}(hj<h]h Parameters}(hj<hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj<ubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/dev-tools/kunit/api/resource:21: ./include/kunit/device.hhKHhj<ubj)}(hhh](j)}(hH``struct kunit *test`` The test context object which created the device h](j)}(h``struct kunit *test``h]j )}(hj=h]hstruct kunit *test}(hj=hhhNhNubah}(h]h ]h"]h$]h&]uh1j hj=ubah}(h]h ]h"]h$]h&]uh1jhc/var/lib/git/docbuild/linux/Documentation/dev-tools/kunit/api/resource:21: ./include/kunit/device.hhKEhj<ubj )}(hhh]h)}(h0The test context object which created the deviceh]h0The test context object which created the device}(hj=hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj=hKEhj=ubah}(h]h ]h"]h$]h&]uh1jhj<ubeh}(h]h ]h"]h$]h&]uh1jhj=hKEhj<ubj)}(h#``struct device *dev`` The device. h](j)}(h``struct device *dev``h]j )}(hj==h]hstruct device *dev}(hj?=hhhNhNubah}(h]h ]h"]h$]h&]uh1j hj;=ubah}(h]h ]h"]h$]h&]uh1jhc/var/lib/git/docbuild/linux/Documentation/dev-tools/kunit/api/resource:21: ./include/kunit/device.hhKFhj7=ubj )}(hhh]h)}(h The device.h]h The device.}(hjV=hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjR=hKFhjS=ubah}(h]h ]h"]h$]h&]uh1jhj7=ubeh}(h]h ]h"]h$]h&]uh1jhjR=hKFhj<ubeh}(h]h ]h"]h$]h&]uh1jhj<ubh)}(h**Description**h]j)}(hjx=h]h Description}(hjz=hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjv=ubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/dev-tools/kunit/api/resource:21: ./include/kunit/device.hhKHhj<ubh)}(hUnregisters and destroys a struct device which was created with kunit_device_register or kunit_device_register_with_driver. If KUnit created a driver, cleans it up as well.h]hUnregisters and destroys a struct device which was created with kunit_device_register or kunit_device_register_with_driver. If KUnit created a driver, cleans it up as well.}(hj=hhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/dev-tools/kunit/api/resource:21: ./include/kunit/device.hhKGhj<ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj2hhhNhNubeh}(h]managed-devicesah ]h"]managed devicesah$]h&]uh1hhhhhhhhKubeh}(h] resource-apiah ]h"] resource apiah$]h&]uh1hhhhhhhhKubeh}(h]h ]h"]h$]h&]sourcehuh1hcurrent_sourceN current_lineNsettingsdocutils.frontendValues)}(hN generatorN datestampN source_linkN source_urlN toc_backlinksentryfootnote_backlinksK sectnum_xformKstrip_commentsNstrip_elements_with_classesN strip_classesN report_levelK halt_levelKexit_status_levelKdebugNwarning_streamN tracebackinput_encoding utf-8-siginput_encoding_error_handlerstrictoutput_encodingutf-8output_encoding_error_handlerj=error_encodingutf-8error_encoding_error_handlerbackslashreplace language_codeenrecord_dependenciesNconfigN id_prefixhauto_id_prefixid dump_settingsNdump_internalsNdump_transformsNdump_pseudo_xmlNexpose_internalsNstrict_visitorN_disable_configN_sourcehnj _destinationN _config_files]7/var/lib/git/docbuild/linux/Documentation/docutils.confafile_insertion_enabled raw_enabledKline_length_limitM'pep_referencesN pep_base_urlhttps://peps.python.org/pep_file_url_templatepep-%04drfc_referencesN rfc_base_url&https://datatracker.ietf.org/doc/html/ tab_widthKtrim_footnote_reference_spacesyntax_highlightlong smart_quotessmartquotes_locales]character_level_inline_markupdoctitle_xform docinfo_xformKsectsubtitle_xform image_loadinglinkembed_stylesheetcloak_email_addressessection_self_linkenvNubreporterNindirect_targets]substitution_defs}substitution_names}refnames}refids}nameids}(j=j=j=j=u nametypes}(j=j=uh}(j=hj jjLjQjjjjj j j j jjjjjj#jjj/j4j[!j`!j#j$j&&j+&j'j'j*j*j-j-jK0jP0j=j2j33j83j5j5jI8jN8j;j;u footnote_refs} citation_refs} autofootnotes]autofootnote_refs]symbol_footnotes]symbol_footnote_refs] footnotes] citations]autofootnote_startKsymbol_footnote_startK id_counter collectionsCounter}Rparse_messages]transform_messages] transformerN include_log] decorationNhhub.