Bug in the error handling in TTMs pool implementation
Christian König
christian.koenig at amd.com
Mon Nov 27 13:12:57 UTC 2023
Am 27.11.23 um 13:24 schrieb Karolina Stolarek:
>
> On 24.11.2023 16:53, Christian König wrote:
>> @Karolina do you of hand know a way how we could exercise this in a
>> TTM unit test? Basically we would need to redirect the
>> alloc_pages_node() symbol to an unit test internal function and let
>> it return an error (or something like that).
>
> Do I understand correctly that you want to mock NULL from
> alloc_pages_node() in ttm_pool_alloc_page()? I had a quick look at it,
> and found a(n ugly) way to do it.
>
> KUnit provides an API to redirect calls using
> KUNIT_STATIC_STUB_REDIRECT that can be registered in the original
> function and then overridden in the test. You can read more about the
> mechanism in [1].
>
> The problem is that we'd need to introduce a wrapper call for
> alloc_pages_node() in TTM and expose it, so the function can be
> substituted during the test. We can't directly modify
> alloc_pages_node() due to cyclic dependencies caused by
> kunit/static_stub.h.
>
> For example, in ttm_pool.c, we'd have:
>
> +struct page *ttm_alloc_pages_node(int nid, gfp_t gfp_mask,
> + unsigned int order)
> +{
> + KUNIT_STATIC_STUB_REDIRECT(ttm_alloc_pages_node, nid, gfp_mask,
> order);
> + return alloc_pages_node(nid, gfp_mask, order);
> +}
> +EXPORT_SYMBOL(ttm_alloc_pages_node);
> +
> /* Allocate pages of size 1 << order with the given gfp_flags */
> static struct page *ttm_pool_alloc_page(struct ttm_pool *pool, gfp_t
> gfp_flags,
> unsigned int order)
> (...)
> if (!pool->use_dma_alloc) {
> - p = alloc_pages_node(pool->nid, gfp_flags, order);
> + p = ttm_alloc_pages_node(pool->nid, gfp_flags, order);
> if (p)
> p->private = order;
> return p;
>
> And in the test we would say:
>
> +static struct page *fake_ttm_alloc_pages_node(int nid, gfp_t gfp_mask,
> + unsigned int order)
> +{
> + return NULL;
> +}
> +
> +static void ttm_pool_alloc_failed(struct kunit *test)
> +{
> (...)
> + kunit_activate_static_stub(test, ttm_alloc_pages_node,
> + fake_ttm_alloc_pages_node);
> + err = ttm_pool_alloc(pool, tt, &simple_ctx);
> + kunit_deactivate_static_stub(test, ttm_alloc_pages_node);
>
> Christian, what do you think?
Yes, that was exactly what I was looking for.
And you are right that is indeed quite a bit ugly, I was hoping more
like adding debugging hooks or something like that.
Need to look into that in more detail, thanks for the pointer.
Regards,
Christian.
>
> All the best,
> Karolina
>
> ---------------------------------------------------------
> [1] -
> https://lore.kernel.org/all/20230128074918.1180523-1-davidgow@google.com/
>
>
More information about the dri-devel
mailing list