We always build as standalone module (or as part of the core kernel).
This also removes unused elements from struct smbdirect_socket
and unused exports.
Cc: Steve French <smfrench@gmail.com>
Cc: Tom Talpey <tom@talpey.com>
Cc: Long Li <longli@microsoft.com>
Cc: Namjae Jeon <linkinjeon@kernel.org>
Cc: linux-cifs@vger.kernel.org
Cc: samba-technical@lists.samba.org
Signed-off-by: Stefan Metzmacher <metze@samba.org>
Acked-by: Namjae Jeon <linkinjeon@kernel.org>
Signed-off-by: Steve French <stfrench@microsoft.com>
static void smbdirect_accept_negotiate_recv_done(struct ib_cq *cq, struct ib_wc *wc);
static void smbdirect_accept_negotiate_send_done(struct ib_cq *cq, struct ib_wc *wc);
-__SMBDIRECT_PUBLIC__
int smbdirect_accept_connect_request(struct smbdirect_socket *sc,
const struct rdma_conn_param *param)
{
init_params_failed:
return ret;
}
-__SMBDIRECT_EXPORT_SYMBOL__(smbdirect_accept_connect_request);
static int smbdirect_accept_init_params(struct smbdirect_socket *sc)
{
return 0;
}
-__SMBDIRECT_PUBLIC__
struct smbdirect_socket *smbdirect_socket_accept(struct smbdirect_socket *lsc,
long timeo,
struct proto_accept_arg *arg)
+++ /dev/null
-// SPDX-License-Identifier: GPL-2.0-or-later
-/*
- * Copyright (c) 2025, Stefan Metzmacher
- */
-
-/*
- * This is a temporary solution in order
- * to include the common smbdirect functions
- * into .c files in order to make a transformation
- * in tiny bisectable steps possible.
- *
- * It will be replaced by a smbdirect.ko with
- * exported public functions at the end.
- */
-#ifndef SMBDIRECT_USE_INLINE_C_FILES
-#error SMBDIRECT_USE_INLINE_C_FILES define needed
-#endif
-#include "smbdirect_socket.c"
-#include "smbdirect_connection.c"
-#include "smbdirect_mr.c"
-#include "smbdirect_rw.c"
-#include "smbdirect_debug.c"
-#include "smbdirect_connect.c"
-#include "smbdirect_accept.c"
-#include "smbdirect_listen.c"
static void smbdirect_connect_negotiate_send_done(struct ib_cq *cq, struct ib_wc *wc);
static void smbdirect_connect_negotiate_recv_done(struct ib_cq *cq, struct ib_wc *wc);
-__SMBDIRECT_PUBLIC__
int smbdirect_connect(struct smbdirect_socket *sc, const struct sockaddr *dst)
{
const struct sockaddr *src = NULL;
smbdirect_connection_negotiation_done(sc);
}
-__SMBDIRECT_PUBLIC__
int smbdirect_connect_sync(struct smbdirect_socket *sc,
const struct sockaddr *dst)
{
static void smbdirect_connection_recv_io_refill_work(struct work_struct *work);
static void smbdirect_connection_send_immediate_work(struct work_struct *work);
-__maybe_unused /* this is temporary while this file is included in others */
static void smbdirect_connection_qp_event_handler(struct ib_event *event, void *context)
{
struct smbdirect_socket *sc = context;
return 0;
}
-__SMBDIRECT_PRIVATE__
void smbdirect_connection_rdma_established(struct smbdirect_socket *sc)
{
smbdirect_log_rdma_event(sc, SMBDIRECT_LOG_INFO,
sc->rdma.expected_event = RDMA_CM_EVENT_DISCONNECTED;
}
-__SMBDIRECT_PRIVATE__
void smbdirect_connection_negotiation_done(struct smbdirect_socket *sc)
{
if (unlikely(sc->first_error))
return factor * attr->cap.max_rdma_ctxs;
}
-__SMBDIRECT_PRIVATE__
int smbdirect_connection_create_qp(struct smbdirect_socket *sc)
{
const struct smbdirect_socket_parameters *sp = &sc->parameters;
return ret;
}
-__SMBDIRECT_PRIVATE__
void smbdirect_connection_destroy_qp(struct smbdirect_socket *sc)
{
if (sc->ib.qp) {
}
}
-__SMBDIRECT_PRIVATE__
int smbdirect_connection_create_mem_pools(struct smbdirect_socket *sc)
{
const struct smbdirect_socket_parameters *sp = &sc->parameters;
return -ENOMEM;
}
-__SMBDIRECT_PRIVATE__
void smbdirect_connection_destroy_mem_pools(struct smbdirect_socket *sc)
{
struct smbdirect_recv_io *recv_io, *next_io;
sc->send_io.mem.cache = NULL;
}
-__SMBDIRECT_PRIVATE__
struct smbdirect_send_io *smbdirect_connection_alloc_send_io(struct smbdirect_socket *sc)
{
struct smbdirect_send_io *msg;
return msg;
}
-__SMBDIRECT_PRIVATE__
void smbdirect_connection_free_send_io(struct smbdirect_send_io *msg)
{
struct smbdirect_socket *sc = msg->socket;
mempool_free(msg, sc->send_io.mem.pool);
}
-__SMBDIRECT_PRIVATE__
struct smbdirect_recv_io *smbdirect_connection_get_recv_io(struct smbdirect_socket *sc)
{
struct smbdirect_recv_io *msg = NULL;
return msg;
}
-__SMBDIRECT_PRIVATE__
void smbdirect_connection_put_recv_io(struct smbdirect_recv_io *msg)
{
struct smbdirect_socket *sc = msg->socket;
queue_work(sc->workqueues.refill, &sc->recv_io.posted.refill_work);
}
-__SMBDIRECT_PRIVATE__
void smbdirect_connection_reassembly_append_recv_io(struct smbdirect_socket *sc,
struct smbdirect_recv_io *msg,
u32 data_length)
sc->statistics.enqueue_reassembly_queue++;
}
-__SMBDIRECT_PRIVATE__
struct smbdirect_recv_io *
smbdirect_connection_reassembly_first_recv_io(struct smbdirect_socket *sc)
{
return msg;
}
-__SMBDIRECT_PRIVATE__
void smbdirect_connection_negotiate_rdma_resources(struct smbdirect_socket *sc,
u8 peer_initiator_depth,
u8 peer_responder_resources,
peer_responder_resources);
}
-__SMBDIRECT_PUBLIC__
bool smbdirect_connection_is_connected(struct smbdirect_socket *sc)
{
if (unlikely(!sc || sc->first_error || sc->status != SMBDIRECT_SOCKET_CONNECTED))
}
__SMBDIRECT_EXPORT_SYMBOL__(smbdirect_connection_is_connected);
-__SMBDIRECT_PUBLIC__
int smbdirect_connection_wait_for_connected(struct smbdirect_socket *sc)
{
const struct smbdirect_socket_parameters *sp = &sc->parameters;
}
__SMBDIRECT_EXPORT_SYMBOL__(smbdirect_connection_wait_for_connected);
-__SMBDIRECT_PRIVATE__
void smbdirect_connection_idle_timer_work(struct work_struct *work)
{
struct smbdirect_socket *sc =
queue_work(sc->workqueues.immediate, &sc->idle.immediate_work);
}
-__SMBDIRECT_PRIVATE__
u16 smbdirect_connection_grant_recv_credits(struct smbdirect_socket *sc)
{
int missing;
return new_credits;
}
-__maybe_unused /* this is temporary while this file is included in others */
static bool smbdirect_connection_request_keep_alive(struct smbdirect_socket *sc)
{
const struct smbdirect_socket_parameters *sp = &sc->parameters;
return false;
}
-__SMBDIRECT_PRIVATE__
int smbdirect_connection_post_send_wr(struct smbdirect_socket *sc,
struct ib_send_wr *wr)
{
batch->credit = 0;
}
-__SMBDIRECT_PUBLIC__
int smbdirect_connection_send_batch_flush(struct smbdirect_socket *sc,
struct smbdirect_send_batch *batch,
bool is_last)
}
__SMBDIRECT_EXPORT_SYMBOL__(smbdirect_connection_send_batch_flush);
-__SMBDIRECT_PUBLIC__
struct smbdirect_send_batch *
smbdirect_init_send_batch_storage(struct smbdirect_send_batch_storage *storage,
bool need_invalidate_rkey,
return smbdirect_connection_post_send_wr(sc, &msg->wr);
}
-__SMBDIRECT_PUBLIC__
int smbdirect_connection_send_single_iter(struct smbdirect_socket *sc,
struct smbdirect_send_batch *batch,
struct iov_iter *iter,
}
__SMBDIRECT_EXPORT_SYMBOL__(smbdirect_connection_send_single_iter);
-__SMBDIRECT_PUBLIC__
int smbdirect_connection_send_wait_zero_pending(struct smbdirect_socket *sc)
{
/*
}
__SMBDIRECT_EXPORT_SYMBOL__(smbdirect_connection_send_wait_zero_pending);
-__SMBDIRECT_PUBLIC__
int smbdirect_connection_send_iter(struct smbdirect_socket *sc,
struct iov_iter *iter,
unsigned int flags,
if (atomic_dec_and_test(&sc->send_io.pending.count))
wake_up(&sc->send_io.pending.zero_wait_queue);
-
- wake_up(&sc->send_io.pending.dec_wait_queue);
}
static void smbdirect_connection_send_immediate_work(struct work_struct *work)
}
}
-__SMBDIRECT_PRIVATE__
int smbdirect_connection_post_recv_io(struct smbdirect_recv_io *msg)
{
struct smbdirect_socket *sc = msg->socket;
return ret;
}
-__SMBDIRECT_PRIVATE__
void smbdirect_connection_recv_io_done(struct ib_cq *cq, struct ib_wc *wc)
{
struct smbdirect_recv_io *recv_io =
smbdirect_socket_schedule_cleanup(sc, -ECONNABORTED);
}
-__SMBDIRECT_PRIVATE__
int smbdirect_connection_recv_io_refill(struct smbdirect_socket *sc)
{
int missing;
}
}
-__SMBDIRECT_PUBLIC__
int smbdirect_connection_recvmsg(struct smbdirect_socket *sc,
struct msghdr *msg,
unsigned int flags)
#include "smbdirect_internal.h"
#include <linux/seq_file.h>
-__SMBDIRECT_PUBLIC__
void smbdirect_connection_legacy_debug_proc_show(struct smbdirect_socket *sc,
unsigned int rdma_readwrite_threshold,
struct seq_file *m)
#ifndef __FS_SMB_COMMON_SMBDIRECT_INTERNAL_H__
#define __FS_SMB_COMMON_SMBDIRECT_INTERNAL_H__
-#ifndef SMBDIRECT_USE_INLINE_C_FILES
#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
-#endif /* ! SMBDIRECT_USE_INLINE_C_FILES */
#include "smbdirect.h"
#include "smbdirect_pdu.h"
char ib_name[IB_DEVICE_NAME_MAX];
};
-#ifdef SMBDIRECT_USE_INLINE_C_FILES
-/* this is temporary while this file is included in others */
-#define __SMBDIRECT_PRIVATE__ __maybe_unused static
-#else
-#define __SMBDIRECT_PRIVATE__
-#endif
-
-__SMBDIRECT_PRIVATE__
int smbdirect_socket_init_new(struct net *net, struct smbdirect_socket *sc);
-__SMBDIRECT_PRIVATE__
int smbdirect_socket_init_accepting(struct rdma_cm_id *id, struct smbdirect_socket *sc);
-__SMBDIRECT_PRIVATE__
void __smbdirect_socket_schedule_cleanup(struct smbdirect_socket *sc,
const char *macro_name,
unsigned int lvl,
__func__, __LINE__, __error, &__force_status); \
} while (0)
-__SMBDIRECT_PRIVATE__
void smbdirect_socket_destroy_sync(struct smbdirect_socket *sc);
-__SMBDIRECT_PRIVATE__
int smbdirect_socket_wait_for_credits(struct smbdirect_socket *sc,
enum smbdirect_socket_status expected_status,
int unexpected_errno,
atomic_t *total_credits,
int needed);
-__SMBDIRECT_PRIVATE__
void smbdirect_connection_rdma_established(struct smbdirect_socket *sc);
-__SMBDIRECT_PRIVATE__
void smbdirect_connection_negotiation_done(struct smbdirect_socket *sc);
-__SMBDIRECT_PRIVATE__
int smbdirect_connection_create_qp(struct smbdirect_socket *sc);
-__SMBDIRECT_PRIVATE__
void smbdirect_connection_destroy_qp(struct smbdirect_socket *sc);
-__SMBDIRECT_PRIVATE__
int smbdirect_connection_create_mem_pools(struct smbdirect_socket *sc);
-__SMBDIRECT_PRIVATE__
void smbdirect_connection_destroy_mem_pools(struct smbdirect_socket *sc);
-__SMBDIRECT_PRIVATE__
struct smbdirect_send_io *smbdirect_connection_alloc_send_io(struct smbdirect_socket *sc);
-__SMBDIRECT_PRIVATE__
void smbdirect_connection_free_send_io(struct smbdirect_send_io *msg);
-__SMBDIRECT_PRIVATE__
struct smbdirect_recv_io *smbdirect_connection_get_recv_io(struct smbdirect_socket *sc);
-__SMBDIRECT_PRIVATE__
void smbdirect_connection_put_recv_io(struct smbdirect_recv_io *msg);
-__SMBDIRECT_PRIVATE__
void smbdirect_connection_reassembly_append_recv_io(struct smbdirect_socket *sc,
struct smbdirect_recv_io *msg,
u32 data_length);
-__SMBDIRECT_PRIVATE__
struct smbdirect_recv_io *
smbdirect_connection_reassembly_first_recv_io(struct smbdirect_socket *sc);
-__SMBDIRECT_PRIVATE__
void smbdirect_connection_negotiate_rdma_resources(struct smbdirect_socket *sc,
u8 peer_initiator_depth,
u8 peer_responder_resources,
const struct rdma_conn_param *param);
-__SMBDIRECT_PRIVATE__
void smbdirect_connection_idle_timer_work(struct work_struct *work);
-__SMBDIRECT_PRIVATE__
u16 smbdirect_connection_grant_recv_credits(struct smbdirect_socket *sc);
-__SMBDIRECT_PRIVATE__
int smbdirect_connection_post_send_wr(struct smbdirect_socket *sc,
struct ib_send_wr *wr);
-__SMBDIRECT_PRIVATE__
int smbdirect_connection_post_recv_io(struct smbdirect_recv_io *msg);
-__SMBDIRECT_PRIVATE__
void smbdirect_connection_recv_io_done(struct ib_cq *cq, struct ib_wc *wc);
-__SMBDIRECT_PRIVATE__
int smbdirect_connection_recv_io_refill(struct smbdirect_socket *sc);
-__SMBDIRECT_PRIVATE__
int smbdirect_connection_create_mr_list(struct smbdirect_socket *sc);
-__SMBDIRECT_PRIVATE__
void smbdirect_connection_destroy_mr_list(struct smbdirect_socket *sc);
+int smbdirect_accept_connect_request(struct smbdirect_socket *sc,
+ const struct rdma_conn_param *param);
+
void smbdirect_accept_negotiate_finish(struct smbdirect_socket *sc, u32 ntstatus);
__init int smbdirect_devices_init(void);
static int smbdirect_listen_rdma_event_handler(struct rdma_cm_id *id,
struct rdma_cm_event *event);
-__SMBDIRECT_PUBLIC__
int smbdirect_socket_listen(struct smbdirect_socket *sc, int backlog)
{
int ret;
* Recovery is done in smbd_mr_recovery_work. The content of list entry changes
* as MRs are used and recovered for I/O, but the list links will not change
*/
-__SMBDIRECT_PRIVATE__
int smbdirect_connection_create_mr_list(struct smbdirect_socket *sc)
{
const struct smbdirect_socket_parameters *sp = &sc->parameters;
kfree(mr);
}
-__SMBDIRECT_PRIVATE__
void smbdirect_connection_destroy_mr_list(struct smbdirect_socket *sc)
{
struct smbdirect_mr_io *mr, *tmp;
* need_invalidate: true if this MR needs to be locally invalidated after I/O
* return value: the MR registered, NULL if failed.
*/
-__SMBDIRECT_PUBLIC__
struct smbdirect_mr_io *
smbdirect_connection_register_mr_io(struct smbdirect_socket *sc,
struct iov_iter *iter,
}
__SMBDIRECT_EXPORT_SYMBOL__(smbdirect_connection_register_mr_io);
-__SMBDIRECT_PUBLIC__
void smbdirect_mr_io_fill_buffer_descriptor(struct smbdirect_mr_io *mr,
struct smbdirect_buffer_descriptor_v1 *v1)
{
* and we have to locally invalidate the buffer to prevent data is being
* modified by remote peer after upper layer consumes it
*/
-__SMBDIRECT_PUBLIC__
void smbdirect_connection_deregister_mr_io(struct smbdirect_mr_io *mr)
{
struct smbdirect_socket *sc = mr->socket;
struct smbdirect_send_batch;
struct smbdirect_mr_io;
-#ifdef SMBDIRECT_USE_INLINE_C_FILES
-/* this is temporary while this file is included in others */
-#define __SMBDIRECT_PUBLIC__ __maybe_unused static
-#define __SMBDIRECT_EXPORT_SYMBOL__(__sym)
-#else
-#define __SMBDIRECT_PUBLIC__
#define __SMBDIRECT_EXPORT_SYMBOL__(__sym) EXPORT_SYMBOL_FOR_MODULES(__sym, "cifs,ksmbd")
-#endif
#include <rdma/rw.h>
-__SMBDIRECT_PUBLIC__
u8 smbdirect_netdev_rdma_capable_node_type(struct net_device *netdev);
-__SMBDIRECT_PUBLIC__
bool smbdirect_frwr_is_supported(const struct ib_device_attr *attrs);
-__SMBDIRECT_PUBLIC__
int smbdirect_socket_create_kern(struct net *net, struct smbdirect_socket **_sc);
-__SMBDIRECT_PUBLIC__
int smbdirect_socket_create_accepting(struct rdma_cm_id *id, struct smbdirect_socket **_sc);
-__SMBDIRECT_PUBLIC__
int smbdirect_socket_set_initial_parameters(struct smbdirect_socket *sc,
const struct smbdirect_socket_parameters *sp);
-__SMBDIRECT_PUBLIC__
const struct smbdirect_socket_parameters *
smbdirect_socket_get_current_parameters(struct smbdirect_socket *sc);
-__SMBDIRECT_PUBLIC__
int smbdirect_socket_set_kernel_settings(struct smbdirect_socket *sc,
enum ib_poll_context poll_ctx,
gfp_t gfp_mask);
-__SMBDIRECT_PUBLIC__
-int smbdirect_socket_set_custom_workqueue(struct smbdirect_socket *sc,
- struct workqueue_struct *workqueue);
-
#define SMBDIRECT_LOG_ERR 0x0
#define SMBDIRECT_LOG_INFO 0x1
#define SMBDIRECT_LOG_RDMA_MR 0x100
#define SMBDIRECT_LOG_RDMA_RW 0x200
#define SMBDIRECT_LOG_NEGOTIATE 0x400
-__SMBDIRECT_PUBLIC__
void smbdirect_socket_set_logging(struct smbdirect_socket *sc,
void *private_ptr,
bool (*needed)(struct smbdirect_socket *sc,
unsigned int cls,
struct va_format *vaf));
-__SMBDIRECT_PUBLIC__
bool smbdirect_connection_is_connected(struct smbdirect_socket *sc);
-__SMBDIRECT_PUBLIC__
int smbdirect_connection_wait_for_connected(struct smbdirect_socket *sc);
-__SMBDIRECT_PUBLIC__
int smbdirect_socket_bind(struct smbdirect_socket *sc, struct sockaddr *addr);
-__SMBDIRECT_PUBLIC__
void smbdirect_socket_shutdown(struct smbdirect_socket *sc);
-__SMBDIRECT_PUBLIC__
void smbdirect_socket_release(struct smbdirect_socket *sc);
-__SMBDIRECT_PUBLIC__
int smbdirect_connection_send_batch_flush(struct smbdirect_socket *sc,
struct smbdirect_send_batch *batch,
bool is_last);
};
};
-__SMBDIRECT_PUBLIC__
struct smbdirect_send_batch *
smbdirect_init_send_batch_storage(struct smbdirect_send_batch_storage *storage,
bool need_invalidate_rkey,
unsigned int remote_key);
-__SMBDIRECT_PUBLIC__
int smbdirect_connection_send_single_iter(struct smbdirect_socket *sc,
struct smbdirect_send_batch *batch,
struct iov_iter *iter,
unsigned int flags,
u32 remaining_data_length);
-__SMBDIRECT_PUBLIC__
int smbdirect_connection_send_wait_zero_pending(struct smbdirect_socket *sc);
-__SMBDIRECT_PUBLIC__
int smbdirect_connection_send_iter(struct smbdirect_socket *sc,
struct iov_iter *iter,
unsigned int flags,
bool need_invalidate,
unsigned int remote_key);
-__SMBDIRECT_PUBLIC__
int smbdirect_connection_recvmsg(struct smbdirect_socket *sc,
struct msghdr *msg,
unsigned int flags);
-__SMBDIRECT_PUBLIC__
int smbdirect_connect(struct smbdirect_socket *sc,
const struct sockaddr *dst);
-__SMBDIRECT_PUBLIC__
int smbdirect_connect_sync(struct smbdirect_socket *sc,
const struct sockaddr *dst);
-__SMBDIRECT_PUBLIC__
int smbdirect_socket_listen(struct smbdirect_socket *sc, int backlog);
-__SMBDIRECT_PUBLIC__
-int smbdirect_accept_connect_request(struct smbdirect_socket *sc,
- const struct rdma_conn_param *param);
-
-__SMBDIRECT_PUBLIC__
struct smbdirect_socket *smbdirect_socket_accept(struct smbdirect_socket *lsc,
long timeo,
struct proto_accept_arg *arg);
-__SMBDIRECT_PUBLIC__
int smbdirect_connection_rdma_xmit(struct smbdirect_socket *sc,
void *buf, size_t buf_len,
struct smbdirect_buffer_descriptor_v1 *desc,
size_t desc_len,
bool is_read);
-__SMBDIRECT_PUBLIC__
struct smbdirect_mr_io *
smbdirect_connection_register_mr_io(struct smbdirect_socket *sc,
struct iov_iter *iter,
bool writing,
bool need_invalidate);
-__SMBDIRECT_PUBLIC__
void smbdirect_mr_io_fill_buffer_descriptor(struct smbdirect_mr_io *mr,
struct smbdirect_buffer_descriptor_v1 *v1);
-__SMBDIRECT_PUBLIC__
void smbdirect_connection_deregister_mr_io(struct smbdirect_mr_io *mr);
-__SMBDIRECT_PUBLIC__
void smbdirect_connection_legacy_debug_proc_show(struct smbdirect_socket *sc,
unsigned int rdma_readwrite_threshold,
struct seq_file *m);
smbdirect_connection_rdma_rw_done(cq, wc, DMA_TO_DEVICE);
}
-__SMBDIRECT_PUBLIC__
int smbdirect_connection_rdma_xmit(struct smbdirect_socket *sc,
void *buf, size_t buf_len,
struct smbdirect_buffer_descriptor_v1 *desc,
#include "smbdirect_internal.h"
-__SMBDIRECT_PUBLIC__
bool smbdirect_frwr_is_supported(const struct ib_device_attr *attrs)
{
/*
return -ESTALE;
}
-__SMBDIRECT_PRIVATE__
int smbdirect_socket_init_new(struct net *net, struct smbdirect_socket *sc)
{
struct rdma_cm_id *id;
return 0;
}
-__SMBDIRECT_PUBLIC__
int smbdirect_socket_create_kern(struct net *net, struct smbdirect_socket **_sc)
{
struct smbdirect_socket *sc;
}
__SMBDIRECT_EXPORT_SYMBOL__(smbdirect_socket_create_kern);
-__SMBDIRECT_PRIVATE__
int smbdirect_socket_init_accepting(struct rdma_cm_id *id, struct smbdirect_socket *sc)
{
smbdirect_socket_init(sc);
return 0;
}
-__SMBDIRECT_PUBLIC__
int smbdirect_socket_create_accepting(struct rdma_cm_id *id, struct smbdirect_socket **_sc)
{
struct smbdirect_socket *sc;
}
__SMBDIRECT_EXPORT_SYMBOL__(smbdirect_socket_create_accepting);
-__SMBDIRECT_PUBLIC__
int smbdirect_socket_set_initial_parameters(struct smbdirect_socket *sc,
const struct smbdirect_socket_parameters *sp)
{
}
__SMBDIRECT_EXPORT_SYMBOL__(smbdirect_socket_set_initial_parameters);
-__SMBDIRECT_PUBLIC__
const struct smbdirect_socket_parameters *
smbdirect_socket_get_current_parameters(struct smbdirect_socket *sc)
{
}
__SMBDIRECT_EXPORT_SYMBOL__(smbdirect_socket_get_current_parameters);
-__SMBDIRECT_PUBLIC__
int smbdirect_socket_set_kernel_settings(struct smbdirect_socket *sc,
enum ib_poll_context poll_ctx,
gfp_t gfp_mask)
}
__SMBDIRECT_EXPORT_SYMBOL__(smbdirect_socket_set_kernel_settings);
-__SMBDIRECT_PUBLIC__
-int smbdirect_socket_set_custom_workqueue(struct smbdirect_socket *sc,
- struct workqueue_struct *workqueue)
-{
- /*
- * This is only allowed before connect or accept
- */
- WARN_ONCE(sc->status != SMBDIRECT_SOCKET_CREATED,
- "status=%s first_error=%1pe",
- smbdirect_socket_status_string(sc->status),
- SMBDIRECT_DEBUG_ERR_PTR(sc->first_error));
- if (sc->status != SMBDIRECT_SOCKET_CREATED)
- return -EINVAL;
-
- /*
- * Remember the callers workqueue
- */
- sc->workqueues.accept = workqueue;
- sc->workqueues.connect = workqueue;
- sc->workqueues.idle = workqueue;
- sc->workqueues.refill = workqueue;
- sc->workqueues.immediate = workqueue;
- sc->workqueues.cleanup = workqueue;
-
- return 0;
-}
-__SMBDIRECT_EXPORT_SYMBOL__(smbdirect_socket_set_custom_workqueue);
-
-__maybe_unused /* this is temporary while this file is included in others */
-static void smbdirect_socket_prepare_create(struct smbdirect_socket *sc,
- const struct smbdirect_socket_parameters *sp,
- struct workqueue_struct *workqueue)
-{
- smbdirect_socket_init(sc);
-
- /*
- * Make a copy of the callers parameters
- * from here we only work on the copy
- */
- smbdirect_socket_set_initial_parameters(sc, sp);
-
- /*
- * Remember the callers workqueue
- */
- smbdirect_socket_set_custom_workqueue(sc, workqueue);
-
- INIT_WORK(&sc->disconnect_work, smbdirect_socket_cleanup_work);
-
- INIT_DELAYED_WORK(&sc->idle.timer_work, smbdirect_connection_idle_timer_work);
-}
-
-__SMBDIRECT_PUBLIC__
void smbdirect_socket_set_logging(struct smbdirect_socket *sc,
void *private_ptr,
bool (*needed)(struct smbdirect_socket *sc,
wake_up_all(&sc->send_io.bcredits.wait_queue);
wake_up_all(&sc->send_io.lcredits.wait_queue);
wake_up_all(&sc->send_io.credits.wait_queue);
- wake_up_all(&sc->send_io.pending.dec_wait_queue);
wake_up_all(&sc->send_io.pending.zero_wait_queue);
wake_up_all(&sc->recv_io.reassembly.wait_queue);
wake_up_all(&sc->rw_io.credits.wait_queue);
wake_up_all(&sc->mr_io.ready.wait_queue);
- wake_up_all(&sc->mr_io.cleanup.wait_queue);
}
-__SMBDIRECT_PRIVATE__
void __smbdirect_socket_schedule_cleanup(struct smbdirect_socket *sc,
const char *macro_name,
unsigned int lvl,
*/
disable_work(&sc->connect.work);
disable_work(&sc->recv_io.posted.refill_work);
- disable_work(&sc->mr_io.recovery_work);
disable_work(&sc->idle.immediate_work);
sc->idle.keepalive = SMBDIRECT_KEEPALIVE_NONE;
disable_delayed_work(&sc->idle.timer_work);
disable_work(&sc->disconnect_work);
disable_work(&sc->connect.work);
disable_work(&sc->recv_io.posted.refill_work);
- disable_work(&sc->mr_io.recovery_work);
disable_work(&sc->idle.immediate_work);
sc->idle.keepalive = SMBDIRECT_KEEPALIVE_NONE;
disable_delayed_work(&sc->idle.timer_work);
disable_work_sync(&sc->disconnect_work);
disable_work_sync(&sc->connect.work);
disable_work_sync(&sc->recv_io.posted.refill_work);
- disable_work_sync(&sc->mr_io.recovery_work);
disable_work_sync(&sc->idle.immediate_work);
disable_delayed_work_sync(&sc->idle.timer_work);
"rdma session destroyed\n");
}
-__SMBDIRECT_PRIVATE__
void smbdirect_socket_destroy_sync(struct smbdirect_socket *sc)
{
smbdirect_log_rdma_event(sc, SMBDIRECT_LOG_INFO,
SMBDIRECT_DEBUG_ERR_PTR(sc->first_error));
}
-__SMBDIRECT_PUBLIC__
int smbdirect_socket_bind(struct smbdirect_socket *sc, struct sockaddr *addr)
{
int ret;
}
__SMBDIRECT_EXPORT_SYMBOL__(smbdirect_socket_bind);
-__SMBDIRECT_PUBLIC__
void smbdirect_socket_shutdown(struct smbdirect_socket *sc)
{
smbdirect_socket_schedule_cleanup_lvl(sc, SMBDIRECT_LOG_INFO, -ESHUTDOWN);
kfree(sc);
}
-__SMBDIRECT_PUBLIC__
void smbdirect_socket_release(struct smbdirect_socket *sc)
{
/*
}
__SMBDIRECT_EXPORT_SYMBOL__(smbdirect_socket_release);
-__SMBDIRECT_PRIVATE__
int smbdirect_socket_wait_for_credits(struct smbdirect_socket *sc,
enum smbdirect_socket_status expected_status,
int unexpected_errno,
*/
struct {
atomic_t count;
- /*
- * woken when count is decremented
- */
- wait_queue_head_t dec_wait_queue;
/*
* woken when count reached zero
*/
struct {
atomic_t count;
} used;
-
- struct work_struct recovery_work;
-
- /* Used by transport to wait until all MRs are returned */
- struct {
- wait_queue_head_t wait_queue;
- } cleanup;
} mr_io;
/*
init_waitqueue_head(&sc->send_io.credits.wait_queue);
atomic_set(&sc->send_io.pending.count, 0);
- init_waitqueue_head(&sc->send_io.pending.dec_wait_queue);
init_waitqueue_head(&sc->send_io.pending.zero_wait_queue);
sc->recv_io.mem.gfp_mask = GFP_KERNEL;
atomic_set(&sc->mr_io.ready.count, 0);
init_waitqueue_head(&sc->mr_io.ready.wait_queue);
atomic_set(&sc->mr_io.used.count, 0);
- INIT_WORK(&sc->mr_io.recovery_work, __smbdirect_socket_disabled_work);
- disable_work_sync(&sc->mr_io.recovery_work);
- init_waitqueue_head(&sc->mr_io.cleanup.wait_queue);
sc->logging.private_ptr = NULL;
sc->logging.needed = __smbdirect_log_needed;