@@ -21,6 +21,7 @@
#include <linux/module.h>
#include <linux/net.h>
#include <linux/rwsem.h>
+#include <linux/sched/signal.h>
#include <linux/security.h>
struct alg_type_list {
@@ -711,6 +712,40 @@ void af_alg_free_areq_sgls(struct af_alg_async_req *areq)
}
EXPORT_SYMBOL_GPL(af_alg_free_areq_sgls);
+/**
+ * af_alg_wait_for_wmem - wait for availability of writable memory
+ *
+ * @sk socket of connection to user space
+ * @flags If MSG_DONTWAIT is set, then only report if function would sleep
+ * @return 0 when writable memory is available, < 0 upon error
+ */
+int af_alg_wait_for_wmem(struct sock *sk, unsigned int flags)
+{
+ DEFINE_WAIT_FUNC(wait, woken_wake_function);
+ int err = -ERESTARTSYS;
+ long timeout;
+
+ if (flags & MSG_DONTWAIT)
+ return -EAGAIN;
+
+ sk_set_bit(SOCKWQ_ASYNC_NOSPACE, sk);
+
+ add_wait_queue(sk_sleep(sk), &wait);
+ for (;;) {
+ if (signal_pending(current))
+ break;
+ timeout = MAX_SCHEDULE_TIMEOUT;
+ if (sk_wait_event(sk, &timeout, af_alg_writable(sk), &wait)) {
+ err = 0;
+ break;
+ }
+ }
+ remove_wait_queue(sk_sleep(sk), &wait);
+
+ return err;
+}
+EXPORT_SYMBOL_GPL(af_alg_wait_for_wmem);
+
static int __init af_alg_init(void)
{
int err = proto_register(&alg_proto, 0);
@@ -64,32 +64,6 @@ static inline bool aead_sufficient_data(struct sock *sk)
return ctx->used >= ctx->aead_assoclen + (ctx->enc ? 0 : as);
}
-static int aead_wait_for_wmem(struct sock *sk, unsigned int flags)
-{
- DEFINE_WAIT_FUNC(wait, woken_wake_function);
- int err = -ERESTARTSYS;
- long timeout;
-
- if (flags & MSG_DONTWAIT)
- return -EAGAIN;
-
- sk_set_bit(SOCKWQ_ASYNC_NOSPACE, sk);
-
- add_wait_queue(sk_sleep(sk), &wait);
- for (;;) {
- if (signal_pending(current))
- break;
- timeout = MAX_SCHEDULE_TIMEOUT;
- if (sk_wait_event(sk, &timeout, af_alg_writable(sk), &wait)) {
- err = 0;
- break;
- }
- }
- remove_wait_queue(sk_sleep(sk), &wait);
-
- return err;
-}
-
static void aead_wmem_wakeup(struct sock *sk)
{
struct socket_wq *wq;
@@ -237,7 +211,7 @@ static int aead_sendmsg(struct socket *sock, struct msghdr *msg, size_t size)
}
if (!af_alg_writable(sk)) {
- err = aead_wait_for_wmem(sk, msg->msg_flags);
+ err = af_alg_wait_for_wmem(sk, msg->msg_flags);
if (err)
goto unlock;
}
@@ -319,7 +293,7 @@ static ssize_t aead_sendpage(struct socket *sock, struct page *page,
goto done;
if (!af_alg_writable(sk)) {
- err = aead_wait_for_wmem(sk, flags);
+ err = af_alg_wait_for_wmem(sk, flags);
if (err)
goto unlock;
}
@@ -44,32 +44,6 @@ struct skcipher_tfm {
bool has_key;
};
-static int skcipher_wait_for_wmem(struct sock *sk, unsigned flags)
-{
- DEFINE_WAIT_FUNC(wait, woken_wake_function);
- int err = -ERESTARTSYS;
- long timeout;
-
- if (flags & MSG_DONTWAIT)
- return -EAGAIN;
-
- sk_set_bit(SOCKWQ_ASYNC_NOSPACE, sk);
-
- add_wait_queue(sk_sleep(sk), &wait);
- for (;;) {
- if (signal_pending(current))
- break;
- timeout = MAX_SCHEDULE_TIMEOUT;
- if (sk_wait_event(sk, &timeout, af_alg_writable(sk), &wait)) {
- err = 0;
- break;
- }
- }
- remove_wait_queue(sk_sleep(sk), &wait);
-
- return err;
-}
-
static void skcipher_wmem_wakeup(struct sock *sk)
{
struct socket_wq *wq;
@@ -218,7 +192,7 @@ static int skcipher_sendmsg(struct socket *sock, struct msghdr *msg,
}
if (!af_alg_writable(sk)) {
- err = skcipher_wait_for_wmem(sk, msg->msg_flags);
+ err = af_alg_wait_for_wmem(sk, msg->msg_flags);
if (err)
goto unlock;
}
@@ -296,7 +270,7 @@ static ssize_t skcipher_sendpage(struct socket *sock, struct page *page,
goto done;
if (!af_alg_writable(sk)) {
- err = skcipher_wait_for_wmem(sk, flags);
+ err = af_alg_wait_for_wmem(sk, flags);
if (err)
goto unlock;
}
@@ -245,5 +245,6 @@ unsigned int af_alg_count_tsgl(struct sock *sk, size_t bytes, size_t offset);
void af_alg_pull_tsgl(struct sock *sk, size_t used, struct scatterlist *dst,
size_t dst_offset);
void af_alg_free_areq_sgls(struct af_alg_async_req *areq);
+int af_alg_wait_for_wmem(struct sock *sk, unsigned int flags);
#endif /* _CRYPTO_IF_ALG_H */
Consoliate aead_wait_for_wmem, skcipher_wait_for_wmem ==> af_alg_wait_for_wmem Signed-off-by: Stephan Mueller <smueller@chronox.de> --- crypto/af_alg.c | 35 +++++++++++++++++++++++++++++++++++ crypto/algif_aead.c | 30 ++---------------------------- crypto/algif_skcipher.c | 30 ++---------------------------- include/crypto/if_alg.h | 1 + 4 files changed, 40 insertions(+), 56 deletions(-)