#include <linux/io_uring/cmd.h>
 #include <linux/audit.h>
 #include <linux/security.h>
+#include <linux/jump_label.h>
 #include <asm/shmparam.h>
 
 #define CREATE_TRACE_POINTS
 
 static void io_queue_sqe(struct io_kiocb *req);
 
+static __read_mostly DEFINE_STATIC_KEY_FALSE(io_key_has_sqarray);
+
 struct kmem_cache *req_cachep;
 static struct workqueue_struct *iou_wq __ro_after_init;
 
        unsigned mask = ctx->sq_entries - 1;
        unsigned head = ctx->cached_sq_head++ & mask;
 
-       if (!(ctx->flags & IORING_SETUP_NO_SQARRAY)) {
+       if (static_branch_unlikely(&io_key_has_sqarray) &&
+           (!(ctx->flags & IORING_SETUP_NO_SQARRAY))) {
                head = READ_ONCE(ctx->sq_array[head]);
                if (unlikely(head >= ctx->sq_entries)) {
                        /* drop invalid entries */
        }
        io_rings_free(ctx);
 
+       if (!(ctx->flags & IORING_SETUP_NO_SQARRAY))
+               static_branch_dec(&io_key_has_sqarray);
+
        percpu_ref_exit(&ctx->refs);
        free_uid(ctx->user);
        io_req_caches_free(ctx);
        ctx->clockid = CLOCK_MONOTONIC;
        ctx->clock_offset = 0;
 
+       if (!(ctx->flags & IORING_SETUP_NO_SQARRAY))
+               static_branch_inc(&io_key_has_sqarray);
+
        if ((ctx->flags & IORING_SETUP_DEFER_TASKRUN) &&
            !(ctx->flags & IORING_SETUP_IOPOLL) &&
            !(ctx->flags & IORING_SETUP_SQPOLL))