dlm: add lock timeouts and warnings
David Teigland
maintainerPATCH 2/6 dlm: add lock timeouts and warnings
New features: lock timeouts and time warnings. If the DLM_LKF_TIMEOUT flag is set, then the request/conversion will be canceled after waiting the specified number of centiseconds (specified per lock). This feature is only available for locks requested through libdlm (can be enabled for kernel dlm users if there's a use for it.)
If the new DLM_LSFL_TIMEWARN flag is set when creating the lockspace, then a warning message will be sent to userspace (using genetlink) after a request/conversion has been waiting for a given number of centiseconds (configurable per node). The time warnings will be used in the future to do deadlock detection in userspace.
fs/dlm/Makefile +1 -0
@@ -8,6 +8,7 @@ member.o \ memory.o \ midcomms.o \ + netlink.o \ lowcomms.o \ rcom.o \ recover.o \
fs/dlm/config.c +7 -1
@@ -90,6 +90,7 @@unsigned int cl_scan_secs;unsigned int cl_log_debug;unsigned int cl_protocol; +unsigned int cl_timewarn_cs; };enum {
@@ -103,6 +104,7 @@CLUSTER_ATTR_SCAN_SECS ,CLUSTER_ATTR_LOG_DEBUG ,CLUSTER_ATTR_PROTOCOL , + CLUSTER_ATTR_TIMEWARN_CS, }; struct cluster_attribute {
@@ -162,6 +164,7 @@CLUSTER_ATTR (scan_secs,1 );CLUSTER_ATTR (log_debug,0 );CLUSTER_ATTR (protocol,0 ); +CLUSTER_ATTR (timewarn_cs,1 );static struct configfs_attribute *cluster_attrs[] = { [CLUSTER_ATTR_TCP_PORT ] = &cluster_attr_tcp_port.attr,
@@ -174,6 +177,7 @@ [CLUSTER_ATTR_SCAN_SECS] = &cluster_attr_scan_secs.attr, [CLUSTER_ATTR_LOG_DEBUG] = &cluster_attr_log_debug.attr, [CLUSTER_ATTR_PROTOCOL] = &cluster_attr_protocol.attr, + [CLUSTER_ATTR_TIMEWARN_CS ] = &cluster_attr_timewarn_cs.attr, NULL, };
@@ -909,6 +913,7 @@#define DEFAULT_SCAN_SECS 5#define DEFAULT_LOG_DEBUG 0#define DEFAULT_PROTOCOL 0 +#define DEFAULT_TIMEWARN_CS 500/* 5 sec = 500 centiseconds */ struct dlm_config_info dlm_config = { .ci_tcp_port =DEFAULT_TCP_PORT ,
@@ -920,6 +925,7 @@ .ci_toss_secs = DEFAULT_TOSS_SECS, .ci_scan_secs = DEFAULT_SCAN_SECS, .ci_log_debug = DEFAULT_LOG_DEBUG, - .ci_protocol = DEFAULT_PROTOCOL + .ci_protocol = DEFAULT_PROTOCOL, + .ci_timewarn_cs = DEFAULT_TIMEWARN_CS };
fs/dlm/config.h +1 -0
@@ -27,6 +27,7 @@int ci_scan_secs;int ci_log_debug;int ci_protocol; +int ci_timewarn_cs; };extern struct dlm_config_info dlm_config;
fs/dlm/dlm_internal.h +10 -0
@@ -213,8 +213,10 @@#define DLM_IFL_OVERLAP_UNLOCK 0x00080000#define DLM_IFL_OVERLAP_CANCEL 0x00100000#define DLM_IFL_ENDOFLIFE 0x00200000 +#define DLM_IFL_WATCH_TIMEWARN 0x00400000#define DLM_IFL_USER 0x00000001#define DLM_IFL_ORPHAN 0x00000002 +#define DLM_IFL_TIMEOUT_CANCEL 0x00000004struct dlm_lkb {struct dlm_rsb *lkb_resource;/* the rsb */
@@ -243,6 +245,9 @@struct list_head lkb_wait_reply;/* waiting for remote reply */ struct list_head lkb_astqueue;/* need ast to be sent */ struct list_head lkb_ownqueue;/* list of locks for a process */ +struct list_head lkb_time_list; +unsigned long lkb_timestamp; +unsigned long lkb_timeout_cs;char *lkb_lvbptr;struct dlm_lksb *lkb_lksb;/* caller's status block */
@@ -447,6 +452,9 @@struct mutex ls_orphans_mutex;struct list_head ls_orphans; +struct mutex ls_timeout_mutex; +struct list_head ls_timeout; +struct list_head ls_nodes;/* current nodes in ls */ struct list_head ls_nodes_gone;/* dead node list, recovery */ int ls_num_nodes;/* number of nodes in ls */
@@ -472,6 +480,7 @@struct task_struct *ls_recoverd_task;struct mutex ls_recoverd_active;spinlock_t ls_recover_lock; +unsigned long ls_recover_begin;/* jiffies timestamp */ uint32_t ls_recover_status;/* DLM_RS_ */ uint64_t ls_recover_seq;struct dlm_recover *ls_recover_args;
@@ -501,6 +510,7 @@#define LSFL_RCOM_READY 3#define LSFL_RCOM_WAIT 4#define LSFL_UEVENT_WAIT 5 +#define LSFL_TIMEWARN 6/* much of this is just saving user space pointers associated with the lock that we pass back to the user lib with an ast */
fs/dlm/lock.c +144 -2
213 lines not on this page · raw message
fs/dlm/lock.h +3 -1
@@ -1,7 +1,7 @@/****************************************************************************** ******************************************************************************* ** -** Copyright (C) 2005 Red Hat, Inc. All rights reserved. +** Copyright (C) 2005-2007 Red Hat, Inc. All rights reserved. ** ** This copyrighted material is made available to anyone wishing to use, ** modify, copy, or redistribute it subject to the terms and conditions
@@ -26,6 +26,8 @@void dlm_scan_rsbs (struct dlm_ls *ls);int dlm_lock_recovery_try (struct dlm_ls *ls);void dlm_unlock_recovery (struct dlm_ls *ls); +void dlm_scan_timeout (struct dlm_ls *ls); +void dlm_adjust_timeouts (struct dlm_ls *ls);int dlm_purge_locks (struct dlm_ls *ls);void dlm_purge_mstcpy_locks (struct dlm_rsb *r);
fs/dlm/lockspace.c +9 -1
@@ -237,6 +237,7 @@list_for_each_entry (ls, &lslist, ls_list) {if (dlm_lock_recovery_try (ls)) {dlm_scan_rsbs (ls); +dlm_scan_timeout (ls);dlm_unlock_recovery (ls); } }
@@ -421,11 +422,16 @@ goto out;memcpy (ls->ls_name, name, namelen); ls->ls_namelen = namelen; - ls->ls_exflags = flags; ls->ls_lvblen = lvblen; ls->ls_count =0 ; ls->ls_flags =0 ; +/* ls_exflags are forced to match among nodes, and we don't +need to require all nodes to have TIMEWARN active */ +if (flags &DLM_LSFL_TIMEWARN ) +set_bit (LSFL_TIMEWARN , &ls->ls_flags); + ls->ls_exflags = (flags & ~DLM_LSFL_TIMEWARN ); + size = dlm_config.ci_rsbtbl_size; ls->ls_rsbtbl_size = size;
@@ -465,6 +471,8 @@mutex_init (&ls->ls_waiters_mutex);INIT_LIST_HEAD (&ls->ls_orphans);mutex_init (&ls->ls_orphans_mutex); +INIT_LIST_HEAD (&ls->ls_timeout); +mutex_init (&ls->ls_timeout_mutex);INIT_LIST_HEAD (&ls->ls_nodes);INIT_LIST_HEAD (&ls->ls_nodes_gone);
fs/dlm/main.c +10 -1
@@ -2,7 +2,7 @@ ******************************************************************************* ** ** Copyright (C) Sistina Software, Inc. 1997-2003 All rights reserved. -** Copyright (C) 2004-2005 Red Hat, Inc. All rights reserved. +** Copyright (C) 2004-2007 Red Hat, Inc. All rights reserved. ** ** This copyrighted material is made available to anyone wishing to use, ** modify, copy, or redistribute it subject to the terms and conditions
@@ -25,6 +25,8 @@static inline int dlm_register_debugfs (void ) {return 0 ; }static inline void dlm_unregister_debugfs (void ) { }#endif +int dlm_netlink_init (void ); +void dlm_netlink_exit (void );static int __init init_dlm (void ) {
@@ -50,10 +52,16 @@if (error) goto out_debug; + error =dlm_netlink_init (); +if (error) + goto out_user; +printk ("DLM (built %s %s) installed\n" , __DATE__, __TIME__);return 0 ; + out_user: +dlm_user_exit (); out_debug:dlm_unregister_debugfs (); out_config:
@@ -68,6 +76,7 @@ static void __exit exit_dlm(void) { +dlm_netlink_exit ();dlm_user_exit ();dlm_config_exit ();dlm_memory_exit ();
fs/dlm/netlink.c new file +155 -0
155 lines not on this page · raw message
fs/dlm/user.c +1 -1
@@ -348,7 +348,7 @@return -EPERM ; error =dlm_new_lockspace (params->name,strlen (params->name), - &lockspace,0 ,DLM_USER_LVB_LEN ); + &lockspace, params->flags,DLM_USER_LVB_LEN );if (error)return error;
include/linux/dlm.h +4 -3
@@ -2,7 +2,7 @@ ******************************************************************************* ** ** Copyright (C) Sistina Software, Inc. 1997-2003 All rights reserved. -** Copyright (C) 2004-2005 Red Hat, Inc. All rights reserved. +** Copyright (C) 2004-2007 Red Hat, Inc. All rights reserved. ** ** This copyrighted material is made available to anyone wishing to use, ** modify, copy, or redistribute it subject to the terms and conditions
@@ -149,6 +149,7 @@#define DLM_LKF_ALTPR 0x00008000#define DLM_LKF_ALTCW 0x00010000#define DLM_LKF_FORCEUNLOCK 0x00020000 +#define DLM_LKF_TIMEOUT 0x00040000/* * Some return codes that are not in errno.h
@@ -199,11 +200,11 @@char * sb_lvbptr; }; +#define DLM_LSFL_NODIR 0x00000001 +#define DLM_LSFL_TIMEWARN 0x00000002#ifdef __KERNEL__ -#define DLM_LSFL_NODIR 0x00000001 -/* * dlm_new_lockspace *
include/linux/dlm_netlink.h new file +56 -0
56 lines not on this page · raw message
fs/dlm/member.c +4 -1
@@ -1,7 +1,7 @@/****************************************************************************** ******************************************************************************* ** -** Copyright (C) 2005 Red Hat, Inc. All rights reserved. +** Copyright (C) 2005-2007 Red Hat, Inc. All rights reserved. ** ** This copyrighted material is made available to anyone wishing to use, ** modify, copy, or redistribute it subject to the terms and conditions
@@ -284,6 +284,9 @@dlm_recoverd_suspend (ls); ls->ls_recover_status =0 ;dlm_recoverd_resume (ls); + +if (!ls->ls_recover_begin) + ls->ls_recover_begin = jiffies;return 0 ; }
fs/dlm/recoverd.c +3 -1
@@ -2,7 +2,7 @@ ******************************************************************************* ** ** Copyright (C) Sistina Software, Inc. 1997-2003 All rights reserved. -** Copyright (C) 2004-2005 Red Hat, Inc. All rights reserved. +** Copyright (C) 2004-2007 Red Hat, Inc. All rights reserved. ** ** This copyrighted material is made available to anyone wishing to use, ** modify, copy, or redistribute it subject to the terms and conditions
@@ -190,6 +190,8 @@dlm_clear_members_gone (ls); +dlm_adjust_timeouts (ls); + error =enable_locking (ls, rv->seq);if (error) {log_debug (ls,"enable_locking failed %d" , error);
include/linux/Kbuild +1 -0
@@ -49,6 +49,7 @@ header-y += const.h header-y += cycx_cfm.h header-y += dlm_device.h +header-y += dlm_netlink.h header-y += dm-ioctl.h header-y += dn.h header-y += dqblk_v1.h