From: Krzysztof Kozlowski Subject: Locking for HW crypto accelerators Date: Thu, 30 Aug 2018 14:22:22 +0200 Message-ID: Mime-Version: 1.0 Content-Type: text/plain; charset="UTF-8" To: Herbert Xu , "David S. Miller" , linux-crypto@vger.kernel.org, linux-kernel@vger.kernel.org, smueller@chronox.de Return-path: Sender: linux-kernel-owner@vger.kernel.org List-Id: linux-crypto.vger.kernel.org Hi, I am trying to figure out necessary locking on the driver side of crypto HW accelerator for symmetric hash (actually: CRC). I implemented quite simple driver for shash_alg. I looked at the docs, I looked at the crypto kcapi core code... and there is nothing about necessary locking. kcapi does not perform it. My HW is quite similar to drivers/crypto/stm32/stm32_crc32.c so it has only one HW set of registers for dealing with CRC. Or in other words, only one queue of one element. :) I implemented all shash_alg callbacks - init(), update(), final()... and also finup() (manually calling update+final) and digest() (init+update+final). Now imagine multiple user-space users of this crypto alg where all of them call kcapi_md_digest() (so essentially init() -> update() -> final()). It seems that kcapi does not perform any locking here so at some point updates from different processes might be mixed with finals: Process A: Process B: init() init() update() update() final() final() My findings show that the requests are indeed being mixed with each other... Should driver perform any weird locking here? Or maybe that is the case of using ONLY the digest() callback (so no update, no final) because my HW cannot track different kcapi requests? Best regards, Krzysztof