Skip to content

Commit

Permalink
crypto: omap-sham - add proper load balancing support for multicore
Browse files Browse the repository at this point in the history
The current implementation of the multiple accelerator core support for
OMAP SHA does not work properly. It always picks up the first probed
accelerator core if this is available, and rest of the book keeping also
gets confused if there are two cores available. Add proper load
balancing support for SHA, and also fix any bugs related to the
multicore support while doing it.

Signed-off-by: Tero Kristo <t-kristo@ti.com>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
  • Loading branch information
Tero Kristo authored and Herbert Xu committed Jun 4, 2020
1 parent 9ef4e6e commit 281c377
Showing 1 changed file with 31 additions and 33 deletions.
64 changes: 31 additions & 33 deletions drivers/crypto/omap-sham.c
Original file line number Diff line number Diff line change
Expand Up @@ -168,8 +168,6 @@ struct omap_sham_hmac_ctx {
};

struct omap_sham_ctx {
struct omap_sham_dev *dd;

unsigned long flags;

/* fallback stuff */
Expand Down Expand Up @@ -934,27 +932,35 @@ static int omap_sham_update_dma_stop(struct omap_sham_dev *dd)
return 0;
}

struct omap_sham_dev *omap_sham_find_dev(struct omap_sham_reqctx *ctx)
{
struct omap_sham_dev *dd;

if (ctx->dd)
return ctx->dd;

spin_lock_bh(&sham.lock);
dd = list_first_entry(&sham.dev_list, struct omap_sham_dev, list);
list_move_tail(&dd->list, &sham.dev_list);
ctx->dd = dd;
spin_unlock_bh(&sham.lock);

return dd;
}

static int omap_sham_init(struct ahash_request *req)
{
struct crypto_ahash *tfm = crypto_ahash_reqtfm(req);
struct omap_sham_ctx *tctx = crypto_ahash_ctx(tfm);
struct omap_sham_reqctx *ctx = ahash_request_ctx(req);
struct omap_sham_dev *dd = NULL, *tmp;
struct omap_sham_dev *dd;
int bs = 0;

spin_lock_bh(&sham.lock);
if (!tctx->dd) {
list_for_each_entry(tmp, &sham.dev_list, list) {
dd = tmp;
break;
}
tctx->dd = dd;
} else {
dd = tctx->dd;
}
spin_unlock_bh(&sham.lock);
ctx->dd = NULL;

ctx->dd = dd;
dd = omap_sham_find_dev(ctx);
if (!dd)
return -ENODEV;

ctx->flags = 0;

Expand Down Expand Up @@ -1224,8 +1230,7 @@ static int omap_sham_handle_queue(struct omap_sham_dev *dd,
static int omap_sham_enqueue(struct ahash_request *req, unsigned int op)
{
struct omap_sham_reqctx *ctx = ahash_request_ctx(req);
struct omap_sham_ctx *tctx = crypto_tfm_ctx(req->base.tfm);
struct omap_sham_dev *dd = tctx->dd;
struct omap_sham_dev *dd = ctx->dd;

ctx->op = op;

Expand All @@ -1235,7 +1240,7 @@ static int omap_sham_enqueue(struct ahash_request *req, unsigned int op)
static int omap_sham_update(struct ahash_request *req)
{
struct omap_sham_reqctx *ctx = ahash_request_ctx(req);
struct omap_sham_dev *dd = ctx->dd;
struct omap_sham_dev *dd = omap_sham_find_dev(ctx);

if (!req->nbytes)
return 0;
Expand Down Expand Up @@ -1328,21 +1333,8 @@ static int omap_sham_setkey(struct crypto_ahash *tfm, const u8 *key,
struct omap_sham_hmac_ctx *bctx = tctx->base;
int bs = crypto_shash_blocksize(bctx->shash);
int ds = crypto_shash_digestsize(bctx->shash);
struct omap_sham_dev *dd = NULL, *tmp;
int err, i;

spin_lock_bh(&sham.lock);
if (!tctx->dd) {
list_for_each_entry(tmp, &sham.dev_list, list) {
dd = tmp;
break;
}
tctx->dd = dd;
} else {
dd = tctx->dd;
}
spin_unlock_bh(&sham.lock);

err = crypto_shash_setkey(tctx->fallback, key, keylen);
if (err)
return err;
Expand All @@ -1359,7 +1351,7 @@ static int omap_sham_setkey(struct crypto_ahash *tfm, const u8 *key,

memset(bctx->ipad + keylen, 0, bs - keylen);

if (!test_bit(FLAGS_AUTO_XOR, &dd->flags)) {
if (!test_bit(FLAGS_AUTO_XOR, &sham.flags)) {
memcpy(bctx->opad, bctx->ipad, bs);

for (i = 0; i < bs; i++) {
Expand Down Expand Up @@ -2171,6 +2163,7 @@ static int omap_sham_probe(struct platform_device *pdev)
}

dd->flags |= dd->pdata->flags;
sham.flags |= dd->pdata->flags;

pm_runtime_use_autosuspend(dev);
pm_runtime_set_autosuspend_delay(dev, DEFAULT_AUTOSUSPEND_DELAY);
Expand Down Expand Up @@ -2198,6 +2191,9 @@ static int omap_sham_probe(struct platform_device *pdev)
spin_unlock(&sham.lock);

for (i = 0; i < dd->pdata->algs_info_size; i++) {
if (dd->pdata->algs_info[i].registered)
break;

for (j = 0; j < dd->pdata->algs_info[i].size; j++) {
struct ahash_alg *alg;

Expand Down Expand Up @@ -2249,9 +2245,11 @@ static int omap_sham_remove(struct platform_device *pdev)
list_del(&dd->list);
spin_unlock(&sham.lock);
for (i = dd->pdata->algs_info_size - 1; i >= 0; i--)
for (j = dd->pdata->algs_info[i].registered - 1; j >= 0; j--)
for (j = dd->pdata->algs_info[i].registered - 1; j >= 0; j--) {
crypto_unregister_ahash(
&dd->pdata->algs_info[i].algs_list[j]);
dd->pdata->algs_info[i].registered--;
}
tasklet_kill(&dd->done_task);
pm_runtime_disable(&pdev->dev);

Expand Down

0 comments on commit 281c377

Please sign in to comment.