History

crypto: af_alg - remove locking in async callback

The code paths protected by the socket-lock do not use or modify the socket in a non-atomic fashion. The actions pertaining the socket do not even need to be handled as an atomic operation. Thus, the socket-lock can be safely ignored. This fixes a bug regarding scheduling in atomic as the callback function may be invoked in interrupt context. In addition, the sock_hold is moved before the AIO encrypt/decrypt operation to ensure that the socket is always present. This avoids a tiny race window where the socket is unprotected and yet used by the AIO operation. Finally, the release of resources for a crypto operation is moved into a common function of af_alg_free_resources.

Stephan Mueller committed 9 years ago

Commit 7d2c3f51 parent 8e1fa894 files · +39 −29Browse files

Showing the changes to include/crypto (1 of 4 files). Show all

Unified · Split

include/crypto/if_alg.h+1−0
@@ -242,6 +242,7 @@ int af_alg_sendmsg(struct socket *sock, struct msghdr *msg, size_t size, · 241 unmodified lines
242 unsigned int ivsize);242 unsigned int ivsize);
243ssize_t af_alg_sendpage(struct socket *sock, struct page *page,243ssize_t af_alg_sendpage(struct socket *sock, struct page *page,
244 int offset, size_t size, int flags);244 int offset, size_t size, int flags);
245void af_alg_free_resources(struct af_alg_async_req *areq);
245void af_alg_async_cb(struct crypto_async_request *_req, int err);246void af_alg_async_cb(struct crypto_async_request *_req, int err);
246unsigned int af_alg_poll(struct file *file, struct socket *sock,247unsigned int af_alg_poll(struct file *file, struct socket *sock,
247 poll_table *wait);248 poll_table *wait);