int conn_state;
        struct rds_conn_path *cp;
        struct in6_addr *my_addr, *peer_addr;
-       struct proto_accept_arg arg = {
-               .flags = O_NONBLOCK,
-               .kern = true,
-       };
 #if !IS_ENABLED(CONFIG_IPV6)
        struct in6_addr saddr, daddr;
 #endif
        if (!sock) /* module unload or netns delete in progress */
                return -ENETUNREACH;
 
-       ret = sock_create_lite(sock->sk->sk_family,
-                              sock->sk->sk_type, sock->sk->sk_protocol,
-                              &new_sock);
+       ret = kernel_accept(sock, &new_sock, O_NONBLOCK);
        if (ret)
-               goto out;
-
-       ret = sock->ops->accept(sock, new_sock, &arg);
-       if (ret < 0)
-               goto out;
-
-       /* sock_create_lite() does not get a hold on the owner module so we
-        * need to do it here.  Note that sock_release() uses sock->ops to
-        * determine if it needs to decrement the reference count.  So set
-        * sock->ops after calling accept() in case that fails.  And there's
-        * no need to do try_module_get() as the listener should have a hold
-        * already.
-        */
-       new_sock->ops = sock->ops;
-       __module_get(new_sock->ops->owner);
+               return ret;
 
        rds_tcp_keepalive(new_sock);
        if (!rds_tcp_tune(new_sock)) {