lists.openwall.net   lists  /  announce  owl-users  owl-dev  john-users  john-dev  passwdqc-users  yescrypt  popa3d-users  /  oss-security  kernel-hardening  musl  sabotage  tlsify  passwords  /  crypt-dev  xvendor  /  Bugtraq  Full-Disclosure  linux-kernel  linux-netdev  linux-ext4  linux-hardening  linux-cve-announce  PHC 
Open Source and information security mailing list archives
 
Hash Suite: Windows password security audit tool. GUI, reports in PDF.
[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Date:   Sat, 26 Mar 2022 12:27:46 +0800
From:   David Gow <davidgow@...gle.com>
To:     Daniel Latypov <dlatypov@...gle.com>
Cc:     Brendan Higgins <brendanhiggins@...gle.com>,
        Linux Kernel Mailing List <linux-kernel@...r.kernel.org>,
        KUnit Development <kunit-dev@...glegroups.com>,
        "open list:KERNEL SELFTEST FRAMEWORK" 
        <linux-kselftest@...r.kernel.org>,
        Shuah Khan <skhan@...uxfoundation.org>
Subject: Re: [PATCH v2 2/2] kunit: split resource API impl from test.c into
 new resource.c

On Sat, Mar 26, 2022 at 8:20 AM Daniel Latypov <dlatypov@...gle.com> wrote:
>
> We've split out the declarations from include/kunit/test.h into
> resource.h.
> This patch splits out the definitions as well for consistency.
>
> A side effect of this is git blame won't properly track history by
> default, users need to run
> $ git blame -L ,1 -C13 lib/kunit/resource.c
>
> Signed-off-by: Daniel Latypov <dlatypov@...gle.com>
> ---

Looks good and works fine here. I'm going to try to rebase most of the
other resource system stuff I'm working on on top of these (which will
likely end up moving a bunch of code _again_, but is probably the
least terrible of all the available options).

One nitpick (newline at end of file) below, otherwise this is good.

Reviewed-by: David Gow <davidgow@...gle.com>

Cheers,
-- David

>  lib/kunit/Makefile   |   1 +
>  lib/kunit/resource.c | 126 +++++++++++++++++++++++++++++++++++++++++++
>  lib/kunit/test.c     | 116 +--------------------------------------
>  3 files changed, 128 insertions(+), 115 deletions(-)
>  create mode 100644 lib/kunit/resource.c
>
> diff --git a/lib/kunit/Makefile b/lib/kunit/Makefile
> index c49f4ffb6273..29aff6562b42 100644
> --- a/lib/kunit/Makefile
> +++ b/lib/kunit/Makefile
> @@ -1,6 +1,7 @@
>  obj-$(CONFIG_KUNIT) +=                 kunit.o
>
>  kunit-objs +=                          test.o \
> +                                       resource.o \
>                                         string-stream.o \
>                                         assert.o \
>                                         try-catch.o \
> diff --git a/lib/kunit/resource.c b/lib/kunit/resource.c
> new file mode 100644
> index 000000000000..b8bced246217
> --- /dev/null
> +++ b/lib/kunit/resource.c
> @@ -0,0 +1,126 @@
> +// SPDX-License-Identifier: GPL-2.0
> +/*
> + * KUnit resource API for test managed resources (allocations, etc.).
> + *
> + * Copyright (C) 2022, Google LLC.
> + * Author: Daniel Latypov <dlatypov@...gle.com>
> + */
> +
> +#include <kunit/resource.h>
> +#include <kunit/test.h>
> +#include <linux/kref.h>
> +
> +/*
> + * Used for static resources and when a kunit_resource * has been created by
> + * kunit_alloc_resource().  When an init function is supplied, @data is passed
> + * into the init function; otherwise, we simply set the resource data field to
> + * the data value passed in.
> + */
> +int kunit_add_resource(struct kunit *test,
> +                      kunit_resource_init_t init,
> +                      kunit_resource_free_t free,
> +                      struct kunit_resource *res,
> +                      void *data)
> +{
> +       int ret = 0;
> +       unsigned long flags;
> +
> +       res->free = free;
> +       kref_init(&res->refcount);
> +
> +       if (init) {
> +               ret = init(res, data);
> +               if (ret)
> +                       return ret;
> +       } else {
> +               res->data = data;
> +       }
> +
> +       spin_lock_irqsave(&test->lock, flags);
> +       list_add_tail(&res->node, &test->resources);
> +       /* refcount for list is established by kref_init() */
> +       spin_unlock_irqrestore(&test->lock, flags);
> +
> +       return ret;
> +}
> +EXPORT_SYMBOL_GPL(kunit_add_resource);
> +
> +int 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)
> +{
> +       struct kunit_resource *existing;
> +
> +       if (!name)
> +               return -EINVAL;
> +
> +       existing = kunit_find_named_resource(test, name);
> +       if (existing) {
> +               kunit_put_resource(existing);
> +               return -EEXIST;
> +       }
> +
> +       res->name = name;
> +
> +       return kunit_add_resource(test, init, free, res, data);
> +}
> +EXPORT_SYMBOL_GPL(kunit_add_named_resource);
> +
> +struct 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 *data)
> +{
> +       struct kunit_resource *res;
> +       int ret;
> +
> +       res = kzalloc(sizeof(*res), internal_gfp);
> +       if (!res)
> +               return NULL;
> +
> +       ret = kunit_add_resource(test, init, free, res, data);
> +       if (!ret) {
> +               /*
> +                * bump refcount for get; kunit_resource_put() should be called
> +                * when done.
> +                */
> +               kunit_get_resource(res);
> +               return res;
> +       }
> +       return NULL;
> +}
> +EXPORT_SYMBOL_GPL(kunit_alloc_and_get_resource);
> +
> +void kunit_remove_resource(struct kunit *test, struct kunit_resource *res)
> +{
> +       unsigned long flags;
> +
> +       spin_lock_irqsave(&test->lock, flags);
> +       list_del(&res->node);
> +       spin_unlock_irqrestore(&test->lock, flags);
> +       kunit_put_resource(res);
> +}
> +EXPORT_SYMBOL_GPL(kunit_remove_resource);
> +
> +int kunit_destroy_resource(struct kunit *test, kunit_resource_match_t match,
> +                          void *match_data)
> +{
> +       struct kunit_resource *res = kunit_find_resource(test, match,
> +                                                        match_data);
> +
> +       if (!res)
> +               return -ENOENT;
> +
> +       kunit_remove_resource(test, res);
> +
> +       /* We have a reference also via _find(); drop it. */
> +       kunit_put_resource(res);
> +
> +       return 0;
> +}
> +EXPORT_SYMBOL_GPL(kunit_destroy_resource);
> +

.git/rebase-apply/patch:151: new blank line at EOF.

+

> diff --git a/lib/kunit/test.c b/lib/kunit/test.c
> index 3bca3bf5c15b..0f66c13d126e 100644
> --- a/lib/kunit/test.c
> +++ b/lib/kunit/test.c
> @@ -6,10 +6,10 @@
>   * Author: Brendan Higgins <brendanhiggins@...gle.com>
>   */
>
> +#include <kunit/resource.h>
>  #include <kunit/test.h>
>  #include <kunit/test-bug.h>
>  #include <linux/kernel.h>
> -#include <linux/kref.h>
>  #include <linux/moduleparam.h>
>  #include <linux/sched/debug.h>
>  #include <linux/sched.h>
> @@ -592,120 +592,6 @@ void __kunit_test_suites_exit(struct kunit_suite **suites)
>  }
>  EXPORT_SYMBOL_GPL(__kunit_test_suites_exit);
>
> -/*
> - * Used for static resources and when a kunit_resource * has been created by
> - * kunit_alloc_resource().  When an init function is supplied, @data is passed
> - * into the init function; otherwise, we simply set the resource data field to
> - * the data value passed in.
> - */
> -int kunit_add_resource(struct kunit *test,
> -                      kunit_resource_init_t init,
> -                      kunit_resource_free_t free,
> -                      struct kunit_resource *res,
> -                      void *data)
> -{
> -       int ret = 0;
> -       unsigned long flags;
> -
> -       res->free = free;
> -       kref_init(&res->refcount);
> -
> -       if (init) {
> -               ret = init(res, data);
> -               if (ret)
> -                       return ret;
> -       } else {
> -               res->data = data;
> -       }
> -
> -       spin_lock_irqsave(&test->lock, flags);
> -       list_add_tail(&res->node, &test->resources);
> -       /* refcount for list is established by kref_init() */
> -       spin_unlock_irqrestore(&test->lock, flags);
> -
> -       return ret;
> -}
> -EXPORT_SYMBOL_GPL(kunit_add_resource);
> -
> -int 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)
> -{
> -       struct kunit_resource *existing;
> -
> -       if (!name)
> -               return -EINVAL;
> -
> -       existing = kunit_find_named_resource(test, name);
> -       if (existing) {
> -               kunit_put_resource(existing);
> -               return -EEXIST;
> -       }
> -
> -       res->name = name;
> -
> -       return kunit_add_resource(test, init, free, res, data);
> -}
> -EXPORT_SYMBOL_GPL(kunit_add_named_resource);
> -
> -struct 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 *data)
> -{
> -       struct kunit_resource *res;
> -       int ret;
> -
> -       res = kzalloc(sizeof(*res), internal_gfp);
> -       if (!res)
> -               return NULL;
> -
> -       ret = kunit_add_resource(test, init, free, res, data);
> -       if (!ret) {
> -               /*
> -                * bump refcount for get; kunit_resource_put() should be called
> -                * when done.
> -                */
> -               kunit_get_resource(res);
> -               return res;
> -       }
> -       return NULL;
> -}
> -EXPORT_SYMBOL_GPL(kunit_alloc_and_get_resource);
> -
> -void kunit_remove_resource(struct kunit *test, struct kunit_resource *res)
> -{
> -       unsigned long flags;
> -
> -       spin_lock_irqsave(&test->lock, flags);
> -       list_del(&res->node);
> -       spin_unlock_irqrestore(&test->lock, flags);
> -       kunit_put_resource(res);
> -}
> -EXPORT_SYMBOL_GPL(kunit_remove_resource);
> -
> -int kunit_destroy_resource(struct kunit *test, kunit_resource_match_t match,
> -                          void *match_data)
> -{
> -       struct kunit_resource *res = kunit_find_resource(test, match,
> -                                                        match_data);
> -
> -       if (!res)
> -               return -ENOENT;
> -
> -       kunit_remove_resource(test, res);
> -
> -       /* We have a reference also via _find(); drop it. */
> -       kunit_put_resource(res);
> -
> -       return 0;
> -}
> -EXPORT_SYMBOL_GPL(kunit_destroy_resource);
> -
>  struct kunit_kmalloc_array_params {
>         size_t n;
>         size_t size;
> --
> 2.35.1.1021.g381101b075-goog
>

Powered by blists - more mailing lists

Powered by Openwall GNU/*/Linux Powered by OpenVZ