RE: [RFC/PATCH] crypto: ccree - fix a race of enqueue_seq() in send_request_init()

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hi,

> From: Yoshihiro Shimoda, Sent: Monday, March 14, 2022 6:11 PM
> > From: Gilad Ben-Yossef, Sent: Sunday, March 13, 2022 11:52 PM
> > On Fri, Mar 11, 2022 at 10:19 AM Yoshihiro Shimoda
<snip>
> > Having said that, adding a lock here is not the best solution. To be
> > effective, the lock should be taken before the call to
> > cc_queues_status() and released only after the updating of the free
> > slots.
> > However, while doing so will ensure there is no race condition with
> > regard to writing to the hardware control registers, it does not deal
> > at all with the case the hardware command FIFO is full due to
> > encryption/decryption requests.
> > This is by design, as the whole purpose of a seperate init time only
> > send_request variant is to avoid these complexities, under the
> > assumption that all access to the hardware is serialised at init time.
> >
> > Therefore, a better solution is to switch the order of algo
> > allocations so that the hash is allocated first, prior to any other
> > alg that might be using the hardware FIFO and thus guaranteeing
> > synchronized access and available FIFO space.
> >
> > Can you please verify that the following patch indeed resolves the
> > issue for you?
> 
> Yes, we will verify that. Please wait a while.
> 
> > diff --git a/drivers/crypto/ccree/cc_driver.c b/drivers/crypto/ccree/cc_driver.c
> > index 790fa9058a36..7d1bee86d581 100644
> > --- a/drivers/crypto/ccree/cc_driver.c
> > +++ b/drivers/crypto/ccree/cc_driver.c
> > @@ -529,24 +529,26 @@ static int init_cc_resources(struct
> > platform_device *plat_dev)
> >                 goto post_req_mgr_err;
> >         }
> >
> > -       /* Allocate crypto algs */
> > -       rc = cc_cipher_alloc(new_drvdata);
> > +       /* hash must be allocated first due to use of send_request_init()
> > +        * and dependency of AEAD on it
> > +        */
> > +       rc = cc_hash_alloc(new_drvdata);
> >         if (rc) {
> > -               dev_err(dev, "cc_cipher_alloc failed\n");
> > +               dev_err(dev, "cc_hash_alloc failed\n");
> >                 goto post_buf_mgr_err;
> >         }
> >
> > -       /* hash must be allocated before aead since hash exports APIs */
> > -       rc = cc_hash_alloc(new_drvdata);
> > +       /* Allocate crypto algs */
> > +       rc = cc_cipher_alloc(new_drvdata);
> >         if (rc) {
> > -               dev_err(dev, "cc_hash_alloc failed\n");
> > -               goto post_cipher_err;
> > +               dev_err(dev, "cc_cipher_alloc failed\n");
> > +               goto post_hash_err;
> >         }
> >
> >         rc = cc_aead_alloc(new_drvdata);
> >         if (rc) {
> >                 dev_err(dev, "cc_aead_alloc failed\n");
> > -               goto post_hash_err;
> > +               goto post_cipher_err;
> >         }
> >
> >         /* If we got here and FIPS mode is enabled
> > @@ -558,10 +560,10 @@ static int init_cc_resources(struct
> > platform_device *plat_dev)
> >         pm_runtime_put(dev);
> >         return 0;
> >
> > -post_hash_err:
> > -       cc_hash_free(new_drvdata);
> >  post_cipher_err:
> >         cc_cipher_free(new_drvdata);
> > +post_hash_err:
> > +       cc_hash_free(new_drvdata);
> >  post_buf_mgr_err:
> >          cc_buffer_mgr_fini(new_drvdata);
> >  post_req_mgr_err:
> > @@ -593,8 +595,8 @@ static void cleanup_cc_resources(struct
> > platform_device *plat_dev)
> >                 (struct cc_drvdata *)platform_get_drvdata(plat_dev);
> >
> >
> > Thanks again!
> > Gilad

My colleagues tested your patch, and then this patch also resolved this issue.
So,

Tested-by: Jing Dan <jing.dan.nx@xxxxxxxxxxx>
Tested-by: Dung Nguyen <dung.nguyen.zy@xxxxxxxxxxx>

Thank you very much for your support!

Best regards,
Yoshihiro Shimoda

> > --
> > Gilad Ben-Yossef
> > Chief Coffee Drinker
> >
> > values of β will give rise to dom!




[Index of Archives]     [Kernel]     [Gnu Classpath]     [Gnu Crypto]     [DM Crypt]     [Netfilter]     [Bugtraq]

  Powered by Linux