@@ -271,32 +271,33 @@ static int single_step_handler(unsigned long addr, unsigned int esr,
271271 * Use reader/writer locks instead of plain spinlock.
272272 */
273273static LIST_HEAD (break_hook );
274- static DEFINE_RWLOCK (break_hook_lock );
274+ static DEFINE_SPINLOCK (break_hook_lock );
275275
276276void register_break_hook (struct break_hook * hook )
277277{
278- write_lock (& break_hook_lock );
279- list_add (& hook -> node , & break_hook );
280- write_unlock (& break_hook_lock );
278+ spin_lock (& break_hook_lock );
279+ list_add_rcu (& hook -> node , & break_hook );
280+ spin_unlock (& break_hook_lock );
281281}
282282
283283void unregister_break_hook (struct break_hook * hook )
284284{
285- write_lock (& break_hook_lock );
286- list_del (& hook -> node );
287- write_unlock (& break_hook_lock );
285+ spin_lock (& break_hook_lock );
286+ list_del_rcu (& hook -> node );
287+ spin_unlock (& break_hook_lock );
288+ synchronize_rcu ();
288289}
289290
290291static int call_break_hook (struct pt_regs * regs , unsigned int esr )
291292{
292293 struct break_hook * hook ;
293294 int (* fn )(struct pt_regs * regs , unsigned int esr ) = NULL ;
294295
295- read_lock ( & break_hook_lock );
296- list_for_each_entry (hook , & break_hook , node )
296+ rcu_read_lock ( );
297+ list_for_each_entry_rcu (hook , & break_hook , node )
297298 if ((esr & hook -> esr_mask ) == hook -> esr_val )
298299 fn = hook -> fn ;
299- read_unlock ( & break_hook_lock );
300+ rcu_read_unlock ( );
300301
301302 return fn ? fn (regs , esr ) : DBG_HOOK_ERROR ;
302303}
0 commit comments