mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-11-16 16:54:20 +08:00
dbb751ffab
This patch is rework of lowcomms handling, the main goal was here to handle recvmsg() and sendpage() to run parallel. Parallel in two senses: 1. per connection and 2. that recvmsg()/sendpage() doesn't block each other. Currently recvmsg()/sendpage() cannot run parallel because two workqueues "dlm_recv" and "dlm_send" are ordered workqueues. That means only one work item can be executed. The amount of queue items will be increased about the amount of nodes being inside the cluster. The current two workqueues for sending and receiving can also block each other if the same connection is executed at the same time in dlm_recv and dlm_send workqueue because a per connection mutex for the socket handling. To make it more parallel we introduce one "dlm_io" workqueue which is not an ordered workqueue, the amount of workers are not limited. Due per connection flags SEND/RECV pending we schedule workers ordered per connection and per send and receive task. To get rid of the mutex blocking same workers to do socket handling we switched to a semaphore which handles socket operations as read lock and sock releases as write operations, to prevent sock_release() being called while the socket is being used. There might be more optimization removing the semaphore and replacing it with other synchronization mechanism, however due other circumstances e.g. othercon behaviour it seems complicated to doing this change. I added comments to remove the othercon handling and moving to a different synchronization mechanism as this is done. We need to do that to the next dlm major version upgrade because it is not backwards compatible with the current connect mechanism. The processing of dlm messages need to be still handled by a ordered workqueue. An dlm_process ordered workqueue was introduced which gets filled by the receive worker. This is probably the next bottleneck of DLM but the application can't currently parse dlm messages parallel. A comment was introduced to lift the workqueue context of dlm processing in a non-sleepable softirq to get messages processing done fast. Signed-off-by: Alexander Aring <aahringo@redhat.com> Signed-off-by: David Teigland <teigland@redhat.com>
42 lines
1.6 KiB
C
42 lines
1.6 KiB
C
/* SPDX-License-Identifier: GPL-2.0-only */
|
|
/******************************************************************************
|
|
*******************************************************************************
|
|
**
|
|
** Copyright (C) Sistina Software, Inc. 1997-2003 All rights reserved.
|
|
** Copyright (C) 2004-2005 Red Hat, Inc. All rights reserved.
|
|
**
|
|
**
|
|
*******************************************************************************
|
|
******************************************************************************/
|
|
|
|
#ifndef __MIDCOMMS_DOT_H__
|
|
#define __MIDCOMMS_DOT_H__
|
|
|
|
struct midcomms_node;
|
|
|
|
int dlm_validate_incoming_buffer(int nodeid, unsigned char *buf, int len);
|
|
int dlm_process_incoming_buffer(int nodeid, unsigned char *buf, int buflen);
|
|
struct dlm_mhandle *dlm_midcomms_get_mhandle(int nodeid, int len,
|
|
gfp_t allocation, char **ppc);
|
|
void dlm_midcomms_commit_mhandle(struct dlm_mhandle *mh, const void *name,
|
|
int namelen);
|
|
int dlm_midcomms_close(int nodeid);
|
|
int dlm_midcomms_start(void);
|
|
void dlm_midcomms_stop(void);
|
|
void dlm_midcomms_init(void);
|
|
void dlm_midcomms_exit(void);
|
|
void dlm_midcomms_shutdown(void);
|
|
void dlm_midcomms_add_member(int nodeid);
|
|
void dlm_midcomms_remove_member(int nodeid);
|
|
void dlm_midcomms_unack_msg_resend(int nodeid);
|
|
const char *dlm_midcomms_state(struct midcomms_node *node);
|
|
unsigned long dlm_midcomms_flags(struct midcomms_node *node);
|
|
int dlm_midcomms_send_queue_cnt(struct midcomms_node *node);
|
|
uint32_t dlm_midcomms_version(struct midcomms_node *node);
|
|
int dlm_midcomms_rawmsg_send(struct midcomms_node *node, void *buf,
|
|
int buflen);
|
|
struct kmem_cache *dlm_midcomms_cache_create(void);
|
|
|
|
#endif /* __MIDCOMMS_DOT_H__ */
|
|
|