On 21/06/21(Mon) 23:45, Alexander Bluhm wrote:
> On Thu, Jun 17, 2021 at 03:19:11PM +0200, Alexander Bluhm wrote:
> > On Thu, Jun 17, 2021 at 10:09:47AM +0200, Martin Pieuchot wrote:
> > > Could you annotate which field is being protected by the KERNEL_LOCK()?
> > 
> > No.  I do not want to invest into fine grained crypto locking.  I
> > need a stable test machine.
> 
> Now my machine is stable again, I can do some annotations.
> 
> - remove unused variable cryptodesc_pool
> - document global variables in crypto.c
> - assert kernel lock where needed
> - remove dead code from crypto_get_driverid()
> - move crypto_init() prototype into header file

Diff is ok mpi@.

The annotations are not really coherent with the rest of the tree but this
can be improved in tree, especially if we start using a mutex to replace
the various splvm/splx dances and protect the cc_* fields.

> 
> ok?
> 
> bluhm
> 
> Index: crypto/crypto.c
> ===================================================================
> RCS file: /data/mirror/openbsd/cvs/src/sys/crypto/crypto.c,v
> retrieving revision 1.82
> diff -u -p -r1.82 crypto.c
> --- crypto/crypto.c   30 Mar 2020 17:48:39 -0000      1.82
> +++ crypto/crypto.c   21 Jun 2021 21:00:19 -0000
> @@ -27,16 +27,23 @@
>  
>  #include <crypto/cryptodev.h>
>  
> -void crypto_init(void);
> -
> -struct cryptocap *crypto_drivers = NULL;
> -int crypto_drivers_num = 0;
> -
> -struct pool cryptop_pool;
> -struct pool cryptodesc_pool;
> +/*
> + * Locks used to protect struct members in this file:
> + *   A       allocated during driver attach, no hotplug, no detach
> + *   I       initialized by main()

This doesn't tell if a lock is needed or not.  Other data structure use:

        "I       immutable after creation"

Is it what you meant?  That the variables aren't marked as 'const'
because they are initialized once but after that never change?

> + *   K       modified with kernel lock

Can we use the same wording as other files:

        "K       kernel lock"

> + */
>  
> -struct taskq *crypto_taskq;
> -struct taskq *crypto_taskq_mpsafe;
> +struct cryptocap *crypto_drivers;    /* [A] array allocated by driver

Isn't it possible to have a USB driver calling crypto_get_driverid()?
If that's the case what's protecting the structure is the KERNEL_LOCK().

If we want to simplify things and prevent hotpluging then maybe we
should assert for `cold'?

> +                                        [K] driver data and session count */

Until now we've been annotating the fields in the data structure
definitions, you're referring to `cc_sessions', `cc_newsession', etc,
right?

> +int crypto_drivers_num = 0;          /* [A] attached drivers array size */
> +
> +struct pool cryptop_pool;            /* [I] set of crypto descriptors */

Pool are protected by their own lock, not sure we should start annotating
them.

> +
> +struct taskq *crypto_taskq;          /* [I] run crypto_invoke() and callback
> +                                            with kernel lock */
> +struct taskq *crypto_taskq_mpsafe;   /* [I] run crypto_invoke()
> +                                            without kernel lock */
>  
>  /*
>   * Create a new session.
> @@ -52,6 +59,8 @@ crypto_newsession(u_int64_t *sid, struct
>       if (crypto_drivers == NULL)
>               return EINVAL;
>  
> +     KERNEL_ASSERT_LOCKED();
> +
>       s = splvm();
>  
>       /*
> @@ -186,6 +195,8 @@ crypto_freesession(u_int64_t sid)
>       if (hid >= crypto_drivers_num)
>               return ENOENT;
>  
> +     KERNEL_ASSERT_LOCKED();
> +
>       s = splvm();
>  
>       if (crypto_drivers[hid].cc_sessions)
> @@ -215,6 +226,9 @@ crypto_get_driverid(u_int8_t flags)
>  {
>       struct cryptocap *newdrv;
>       int i, s;
> +
> +     /* called from attach routines */
> +     KERNEL_ASSERT_LOCKED();
>       
>       s = splvm();
>  
> @@ -241,39 +255,33 @@ crypto_get_driverid(u_int8_t flags)
>       }
>  
>       /* Out of entries, allocate some more. */
> -     if (i == crypto_drivers_num) {
> -             if (crypto_drivers_num >= CRYPTO_DRIVERS_MAX) {
> -                     splx(s);
> -                     return -1;
> -             }
> -
> -             newdrv = mallocarray(crypto_drivers_num,
> -                 2 * sizeof(struct cryptocap), M_CRYPTO_DATA, M_NOWAIT);
> -             if (newdrv == NULL) {
> -                     splx(s);
> -                     return -1;
> -             }
> +     if (crypto_drivers_num >= CRYPTO_DRIVERS_MAX) {
> +             splx(s);
> +             return -1;
> +     }
>  
> -             memcpy(newdrv, crypto_drivers,
> -                 crypto_drivers_num * sizeof(struct cryptocap));
> -             bzero(&newdrv[crypto_drivers_num],
> -                 crypto_drivers_num * sizeof(struct cryptocap));
> +     newdrv = mallocarray(crypto_drivers_num,
> +         2 * sizeof(struct cryptocap), M_CRYPTO_DATA, M_NOWAIT);
> +     if (newdrv == NULL) {
> +             splx(s);
> +             return -1;
> +     }
>  
> -             newdrv[i].cc_sessions = 1; /* Mark */
> -             newdrv[i].cc_flags = flags;
> +     memcpy(newdrv, crypto_drivers,
> +         crypto_drivers_num * sizeof(struct cryptocap));
> +     bzero(&newdrv[crypto_drivers_num],
> +         crypto_drivers_num * sizeof(struct cryptocap));
>  
> -             free(crypto_drivers, M_CRYPTO_DATA,
> -                 crypto_drivers_num * sizeof(struct cryptocap));
> +     newdrv[i].cc_sessions = 1; /* Mark */
> +     newdrv[i].cc_flags = flags;
>  
> -             crypto_drivers_num *= 2;
> -             crypto_drivers = newdrv;
> -             splx(s);
> -             return i;
> -     }
> +     free(crypto_drivers, M_CRYPTO_DATA,
> +         crypto_drivers_num * sizeof(struct cryptocap));
>  
> -     /* Shouldn't really get here... */
> +     crypto_drivers_num *= 2;
> +     crypto_drivers = newdrv;
>       splx(s);
> -     return -1;
> +     return i;
>  }
>  
>  /*
> @@ -287,11 +295,13 @@ crypto_register(u_int32_t driverid, int 
>  {
>       int s, i;
>  
> -
>       if (driverid >= crypto_drivers_num || alg == NULL ||
>           crypto_drivers == NULL)
>               return EINVAL;
>       
> +     /* called from attach routines */
> +     KERNEL_ASSERT_LOCKED();
> +
>       s = splvm();
>  
>       for (i = 0; i <= CRYPTO_ALGORITHM_MAX; i++) {
> @@ -326,6 +336,9 @@ crypto_unregister(u_int32_t driverid, in
>  {
>       int i = CRYPTO_ALGORITHM_MAX + 1, s;
>       u_int32_t ses;
> +
> +     /* may be called from detach routines, but not used */
> +     KERNEL_ASSERT_LOCKED();
>  
>       s = splvm();
>  
> Index: crypto/cryptodev.h
> ===================================================================
> RCS file: /data/mirror/openbsd/cvs/src/sys/crypto/cryptodev.h,v
> retrieving revision 1.71
> diff -u -p -r1.71 cryptodev.h
> --- crypto/cryptodev.h        10 Aug 2017 18:57:20 -0000      1.71
> +++ crypto/cryptodev.h        21 Jun 2021 20:59:08 -0000
> @@ -216,6 +216,7 @@ struct cryptocap {
>       int             (*cc_freesession) (u_int64_t);
>  };
>  
> +void crypto_init(void);
>  
>  int  crypto_newsession(u_int64_t *, struct cryptoini *, int);
>  int  crypto_freesession(u_int64_t);
> Index: kern/init_main.c
> ===================================================================
> RCS file: /data/mirror/openbsd/cvs/src/sys/kern/init_main.c,v
> retrieving revision 1.307
> diff -u -p -r1.307 init_main.c
> --- kern/init_main.c  2 Jun 2021 13:56:28 -0000       1.307
> +++ kern/init_main.c  21 Jun 2021 20:59:08 -0000
> @@ -145,7 +145,6 @@ long      __guard_local __attribute__((sectio
>  int  main(void *);
>  void check_console(struct proc *);
>  void start_init(void *);
> -void crypto_init(void);
>  void db_ctf_init(void);
>  void prof_init(void);
>  void init_exec(void);
> 

Reply via email to