[02/11] nptl: Consolidate aysnc cancel enable/disable implementation in libc

Message ID fd42c6bf2b221dd7b390a3bfac4f24523b8d23f5.1620049437.git.fweimer@redhat.com
State New
Headers show
Series
  • nptl: Move semaphore functions into libc
Related show

Commit Message

Previously, the source file nptl/cancellation.c was compiled multiple
times, for libc, libpthread, librt.  This commit switches to a single
implementation, with new __pthread_enable_asynccancel@@GLIBC_PRIVATE,
__pthread_disable_asynccancel@@GLIBC_PRIVATE exports.

The almost-unused CANCEL_ASYNC and CANCEL_RESET macros are replaced
by LIBC_CANCEL_ASYNC and LIBC_CANCEL_ASYNC macros.  They call the
__pthread_* functions unconditionally now.  The macros are still
needed because shared code uses them; Hurd has different definitions.
---
 elf/Makefile                            |  6 ++--
 manual/llio.texi                        |  4 +--
 nptl/Makefile                           |  4 +--
 nptl/Versions                           |  2 ++
 nptl/cancellation.c                     |  4 +--
 nptl/libc-cancellation.c                | 24 --------------
 nptl/pthreadP.h                         |  2 --
 nptl/pthread_create.c                   |  4 +--
 rt/Makefile                             |  1 -
 sysdeps/nptl/Makefile                   |  3 +-
 sysdeps/nptl/librt-cancellation.c       | 24 --------------
 sysdeps/nptl/lowlevellock-futex.h       |  8 ++---
 sysdeps/unix/sysv/linux/socketcall.h    |  5 ---
 sysdeps/unix/sysv/linux/sysdep-cancel.h | 44 ++++---------------------
 14 files changed, 25 insertions(+), 110 deletions(-)
 delete mode 100644 nptl/libc-cancellation.c
 delete mode 100644 sysdeps/nptl/librt-cancellation.c

-- 
2.30.2

Comments

On 03/05/2021 10:51, Florian Weimer via Libc-alpha wrote:
> Previously, the source file nptl/cancellation.c was compiled multiple

> times, for libc, libpthread, librt.  This commit switches to a single

> implementation, with new __pthread_enable_asynccancel@@GLIBC_PRIVATE,

> __pthread_disable_asynccancel@@GLIBC_PRIVATE exports.

> 

> The almost-unused CANCEL_ASYNC and CANCEL_RESET macros are replaced

> by LIBC_CANCEL_ASYNC and LIBC_CANCEL_ASYNC macros.  They call the

> __pthread_* functions unconditionally now.  The macros are still

> needed because shared code uses them; Hurd has different definitions.


LGTM, thanks.

Reviewed-by: Adhemerval Zanella  <adhemerval.zanella@linaro.org>


> ---

>  elf/Makefile                            |  6 ++--

>  manual/llio.texi                        |  4 +--

>  nptl/Makefile                           |  4 +--

>  nptl/Versions                           |  2 ++

>  nptl/cancellation.c                     |  4 +--

>  nptl/libc-cancellation.c                | 24 --------------

>  nptl/pthreadP.h                         |  2 --

>  nptl/pthread_create.c                   |  4 +--

>  rt/Makefile                             |  1 -

>  sysdeps/nptl/Makefile                   |  3 +-

>  sysdeps/nptl/librt-cancellation.c       | 24 --------------

>  sysdeps/nptl/lowlevellock-futex.h       |  8 ++---

>  sysdeps/unix/sysv/linux/socketcall.h    |  5 ---

>  sysdeps/unix/sysv/linux/sysdep-cancel.h | 44 ++++---------------------

>  14 files changed, 25 insertions(+), 110 deletions(-)

>  delete mode 100644 nptl/libc-cancellation.c

>  delete mode 100644 sysdeps/nptl/librt-cancellation.c

> 

> diff --git a/elf/Makefile b/elf/Makefile

> index f09988f7d2..4f99af626f 100644

> --- a/elf/Makefile

> +++ b/elf/Makefile

> @@ -528,8 +528,10 @@ $(objpfx)dl-allobjs.os: $(all-rtld-routines:%=$(objpfx)%.os)

>  # discovery mechanism is not compatible with the libc implementation

>  # when compiled for libc.

>  rtld-stubbed-symbols = \

> -  __libc_disable_asynccancel \

> -  __libc_enable_asynccancel \

> +  __GI___pthread_disable_asynccancel \

> +  __GI___pthread_enable_asynccancel \

> +  __pthread_disable_asynccancel \

> +  __pthread_enable_asynccancel \

>    calloc \

>    free \

>    malloc \


Ok.

> diff --git a/manual/llio.texi b/manual/llio.texi

> index c0a53e1a6e..cbc4909fd5 100644

> --- a/manual/llio.texi

> +++ b/manual/llio.texi

> @@ -2534,13 +2534,13 @@ aiocb64}, since the LFS transparently replaces the old interface.

>  @c     sigemptyset ok

>  @c     sigaddset ok

>  @c     setjmp ok

> -@c     CANCEL_ASYNC -> pthread_enable_asynccancel ok

> +@c     LIBC_CANCEL_ASYNC -> __pthread_enable_asynccancel ok

>  @c      do_cancel ok

>  @c       pthread_unwind ok

>  @c        Unwind_ForcedUnwind or longjmp ok [@ascuheap @acsmem?]

>  @c     lll_lock @asulock @aculock

>  @c     lll_unlock @asulock @aculock

> -@c     CANCEL_RESET -> pthread_disable_asynccancel ok

> +@c     LIBC_CANCEL_RESET -> __pthread_disable_asynccancel ok

>  @c      lll_futex_wait ok

>  @c     ->start_routine ok -----

>  @c     call_tls_dtors @asulock @ascuheap @aculock @acsmem


Ok.

> diff --git a/nptl/Makefile b/nptl/Makefile

> index 884cb69bb4..1337b9e648 100644

> --- a/nptl/Makefile

> +++ b/nptl/Makefile

> @@ -30,6 +30,7 @@ extra-libs-others := $(extra-libs)

>  

>  routines = \

>    alloca_cutoff \

> +  cancellation \

>    cleanup_compat \

>    cleanup_defer_compat \

>    cleanup_routine \

> @@ -39,7 +40,6 @@ routines = \

>    elision-trylock \

>    elision-unlock \

>    futex-internal \

> -  libc-cancellation \

>    libc-cleanup \

>    libc_multiple_threads \

>    libc_pthread_init \


Ok.

> @@ -157,7 +157,6 @@ shared-only-routines = forward

>  static-only-routines = pthread_atfork

>  

>  libpthread-routines = \

> -  cancellation \

>    cleanup \

>    cleanup_defer \

>    events \

> @@ -239,7 +238,6 @@ CFLAGS-pthread_setcanceltype.c += -fexceptions -fasynchronous-unwind-tables

>  # These are internal functions which similar functionality as setcancelstate

>  # and setcanceltype.

>  CFLAGS-cancellation.c += -fasynchronous-unwind-tables

> -CFLAGS-libc-cancellation.c += -fasynchronous-unwind-tables

>  

>  # Calling pthread_exit() must cause the registered cancel handlers to

>  # be executed.  Therefore exceptions have to be thrown through this


Ok.

> diff --git a/nptl/Versions b/nptl/Versions

> index ce09c73727..e845cbf804 100644

> --- a/nptl/Versions

> +++ b/nptl/Versions

> @@ -281,6 +281,8 @@ libc {

>      __pthread_cleanup_push;

>      __pthread_cleanup_upto;

>      __pthread_current_priority;

> +    __pthread_disable_asynccancel;

> +    __pthread_enable_asynccancel;

>      __pthread_force_elision;

>      __pthread_getattr_default_np;

>      __pthread_keys;


Ok.

> diff --git a/nptl/cancellation.c b/nptl/cancellation.c

> index 2ee633eabc..c20845adc0 100644

> --- a/nptl/cancellation.c

> +++ b/nptl/cancellation.c

> @@ -28,7 +28,6 @@

>     AS-safe, with the exception of the actual cancellation, because they

>     are called by wrappers around AS-safe functions like write().*/

>  int

> -attribute_hidden

>  __pthread_enable_asynccancel (void)

>  {

>    struct pthread *self = THREAD_SELF;

> @@ -60,11 +59,11 @@ __pthread_enable_asynccancel (void)

>  

>    return oldval;

>  }

> +libc_hidden_def (__pthread_enable_asynccancel)

>  

>  /* See the comment for __pthread_enable_asynccancel regarding

>     the AS-safety of this function.  */

>  void

> -attribute_hidden

>  __pthread_disable_asynccancel (int oldtype)

>  {

>    /* If asynchronous cancellation was enabled before we do not have

> @@ -102,3 +101,4 @@ __pthread_disable_asynccancel (int oldtype)

>        newval = THREAD_GETMEM (self, cancelhandling);

>      }

>  }

> +libc_hidden_def (__pthread_disable_asynccancel)


Ok.

> diff --git a/nptl/libc-cancellation.c b/nptl/libc-cancellation.c

> deleted file mode 100644

> index 29f5a5864b..0000000000

> --- a/nptl/libc-cancellation.c

> +++ /dev/null

> @@ -1,24 +0,0 @@

> -/* Copyright (C) 2002-2021 Free Software Foundation, Inc.

> -   This file is part of the GNU C Library.

> -   Contributed by Ulrich Drepper <drepper@redhat.com>, 2002.

> -

> -   The GNU C Library is free software; you can redistribute it and/or

> -   modify it under the terms of the GNU Lesser General Public

> -   License as published by the Free Software Foundation; either

> -   version 2.1 of the License, or (at your option) any later version.

> -

> -   The GNU C Library is distributed in the hope that it will be useful,

> -   but WITHOUT ANY WARRANTY; without even the implied warranty of

> -   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU

> -   Lesser General Public License for more details.

> -

> -   You should have received a copy of the GNU Lesser General Public

> -   License along with the GNU C Library; if not, see

> -   <https://www.gnu.org/licenses/>.  */

> -

> -#include "pthreadP.h"

> -

> -

> -#define __pthread_enable_asynccancel __libc_enable_asynccancel

> -#define __pthread_disable_asynccancel __libc_disable_asynccancel

> -#include <nptl/cancellation.c>


Ok.

> diff --git a/nptl/pthreadP.h b/nptl/pthreadP.h

> index ee77928fc7..2d9e42173e 100644

> --- a/nptl/pthreadP.h

> +++ b/nptl/pthreadP.h

> @@ -569,8 +569,6 @@ libc_hidden_proto (__pthread_exit)

>  extern int __pthread_join (pthread_t threadid, void **thread_return);

>  extern int __pthread_setcanceltype (int type, int *oldtype);

>  libc_hidden_proto (__pthread_setcanceltype)

> -extern int __pthread_enable_asynccancel (void) attribute_hidden;

> -extern void __pthread_disable_asynccancel (int oldtype) attribute_hidden;

>  extern void __pthread_testcancel (void);

>  libc_hidden_proto (__pthread_testcancel)

>  extern int __pthread_clockjoin_ex (pthread_t, void **, clockid_t,


Ok.

> diff --git a/nptl/pthread_create.c b/nptl/pthread_create.c

> index d89a83b38a..775287d0e4 100644

> --- a/nptl/pthread_create.c

> +++ b/nptl/pthread_create.c

> @@ -353,7 +353,7 @@ START_THREAD_DEFN

>  	 have ownership (see CONCURRENCY NOTES above).  */

>        if (__glibc_unlikely (pd->stopped_start))

>  	{

> -	  int oldtype = CANCEL_ASYNC ();

> +	  int oldtype = LIBC_CANCEL_ASYNC ();

>  

>  	  /* Get the lock the parent locked to force synchronization.  */

>  	  lll_lock (pd->lock, LLL_PRIVATE);

> @@ -363,7 +363,7 @@ START_THREAD_DEFN

>  	  /* And give it up right away.  */

>  	  lll_unlock (pd->lock, LLL_PRIVATE);

>  

> -	  CANCEL_RESET (oldtype);

> +	  LIBC_CANCEL_RESET (oldtype);

>  	}

>  

>        LIBC_PROBE (pthread_start, 3, (pthread_t) pd, pd->start_routine, pd->arg);


Ok.

> diff --git a/rt/Makefile b/rt/Makefile

> index c1a0fdeb46..97c9bbd9de 100644

> --- a/rt/Makefile

> +++ b/rt/Makefile

> @@ -59,7 +59,6 @@ include ../Rules

>  CFLAGS-aio_suspend.c += -fexceptions

>  CFLAGS-mq_timedreceive.c += -fexceptions -fasynchronous-unwind-tables

>  CFLAGS-mq_timedsend.c += -fexceptions -fasynchronous-unwind-tables

> -CFLAGS-librt-cancellation.c += -fasynchronous-unwind-tables

>  

>  LDFLAGS-rt.so = -Wl,--enable-new-dtags,-z,nodelete

>  


Ok.

> diff --git a/sysdeps/nptl/Makefile b/sysdeps/nptl/Makefile

> index adcced422b..632cd3686b 100644

> --- a/sysdeps/nptl/Makefile

> +++ b/sysdeps/nptl/Makefile

> @@ -21,8 +21,7 @@ libpthread-sysdep_routines += errno-loc

>  endif

>  

>  ifeq ($(subdir),rt)

> -librt-sysdep_routines += timer_routines librt-cancellation

> -CFLAGS-librt-cancellation.c += -fexceptions -fasynchronous-unwind-tables

> +librt-sysdep_routines += timer_routines

>  

>  tests += tst-mqueue8x

>  CFLAGS-tst-mqueue8x.c += -fexceptions


Ok.

> diff --git a/sysdeps/nptl/librt-cancellation.c b/sysdeps/nptl/librt-cancellation.c

> deleted file mode 100644

> index 1ad0eb11ff..0000000000

> --- a/sysdeps/nptl/librt-cancellation.c

> +++ /dev/null

> @@ -1,24 +0,0 @@

> -/* Copyright (C) 2002-2021 Free Software Foundation, Inc.

> -   This file is part of the GNU C Library.

> -   Contributed by Ulrich Drepper <drepper@redhat.com>, 2002.

> -

> -   The GNU C Library is free software; you can redistribute it and/or

> -   modify it under the terms of the GNU Lesser General Public

> -   License as published by the Free Software Foundation; either

> -   version 2.1 of the License, or (at your option) any later version.

> -

> -   The GNU C Library is distributed in the hope that it will be useful,

> -   but WITHOUT ANY WARRANTY; without even the implied warranty of

> -   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU

> -   Lesser General Public License for more details.

> -

> -   You should have received a copy of the GNU Lesser General Public

> -   License along with the GNU C Library; if not, see

> -   <https://www.gnu.org/licenses/>.  */

> -

> -#include <nptl/pthreadP.h>

> -

> -

> -#define __pthread_enable_asynccancel __librt_enable_asynccancel

> -#define __pthread_disable_asynccancel __librt_disable_asynccancel

> -#include <nptl/cancellation.c>


Ok.

> diff --git a/sysdeps/nptl/lowlevellock-futex.h b/sysdeps/nptl/lowlevellock-futex.h

> index ca96397a4a..66ebfe50f4 100644

> --- a/sysdeps/nptl/lowlevellock-futex.h

> +++ b/sysdeps/nptl/lowlevellock-futex.h

> @@ -121,18 +121,18 @@

>  /* Like lll_futex_wait, but acting as a cancellable entrypoint.  */

>  # define lll_futex_wait_cancel(futexp, val, private) \

>    ({                                                                   \

> -    int __oldtype = CANCEL_ASYNC ();				       \

> +    int __oldtype = LIBC_CANCEL_ASYNC ();			       \

>      long int __err = lll_futex_wait (futexp, val, LLL_SHARED);	       \

> -    CANCEL_RESET (__oldtype);					       \

> +    LIBC_CANCEL_RESET (__oldtype);				       \

>      __err;							       \

>    })

>  

>  /* Like lll_futex_timed_wait, but acting as a cancellable entrypoint.  */

>  # define lll_futex_timed_wait_cancel(futexp, val, timeout, private) \

>    ({									   \

> -    int __oldtype = CANCEL_ASYNC ();				       	   \

> +    int __oldtype = LIBC_CANCEL_ASYNC ();			       	   \

>      long int __err = lll_futex_timed_wait (futexp, val, timeout, private); \

> -    CANCEL_RESET (__oldtype);						   \

> +    LIBC_CANCEL_RESET (__oldtype);					   \

>      __err;								   \

>    })

>  


Ok.

> diff --git a/sysdeps/unix/sysv/linux/socketcall.h b/sysdeps/unix/sysv/linux/socketcall.h

> index 07702fc4f1..3084623216 100644

> --- a/sysdeps/unix/sysv/linux/socketcall.h

> +++ b/sysdeps/unix/sysv/linux/socketcall.h

> @@ -89,11 +89,6 @@

>    })

>  

>  

> -#if IS_IN (libc)

> -# define __pthread_enable_asynccancel  __libc_enable_asynccancel

> -# define __pthread_disable_asynccancel __libc_disable_asynccancel

> -#endif

> -

>  #define SOCKETCALL_CANCEL(name, args...)				\

>    ({									\

>      int oldtype = LIBC_CANCEL_ASYNC ();	


Ok.
				\
> diff --git a/sysdeps/unix/sysv/linux/sysdep-cancel.h b/sysdeps/unix/sysv/linux/sysdep-cancel.h

> index da2f08fde9..c64cfff37c 100644

> --- a/sysdeps/unix/sysv/linux/sysdep-cancel.h

> +++ b/sysdeps/unix/sysv/linux/sysdep-cancel.h

> @@ -24,44 +24,14 @@

>  #include <tls.h>

>  #include <errno.h>

>  

> -/* The two functions are in libc.so and not exported.  */

> -extern int __libc_enable_asynccancel (void) attribute_hidden;

> -extern void __libc_disable_asynccancel (int oldtype) attribute_hidden;

> -

> -/* The two functions are in librt.so and not exported.  */

> -extern int __librt_enable_asynccancel (void) attribute_hidden;

> -extern void __librt_disable_asynccancel (int oldtype) attribute_hidden;

> -

> -/* The two functions are in libpthread.so and not exported.  */

> -extern int __pthread_enable_asynccancel (void) attribute_hidden;

> -extern void __pthread_disable_asynccancel (int oldtype) attribute_hidden;

> -

>  /* Set cancellation mode to asynchronous.  */

> -#define CANCEL_ASYNC() \

> -  __pthread_enable_asynccancel ()

> -/* Reset to previous cancellation mode.  */

> -#define CANCEL_RESET(oldtype) \

> -  __pthread_disable_asynccancel (oldtype)

> -

> -#if IS_IN (libc)

> -/* Same as CANCEL_ASYNC, but for use in libc.so.  */

> -# define LIBC_CANCEL_ASYNC() \

> -  __libc_enable_asynccancel ()

> -/* Same as CANCEL_RESET, but for use in libc.so.  */

> -# define LIBC_CANCEL_RESET(oldtype) \

> -  __libc_disable_asynccancel (oldtype)

> -#elif IS_IN (libpthread)

> -# define LIBC_CANCEL_ASYNC() CANCEL_ASYNC ()

> -# define LIBC_CANCEL_RESET(val) CANCEL_RESET (val)

> -#elif IS_IN (librt)

> -# define LIBC_CANCEL_ASYNC() \

> -  __librt_enable_asynccancel ()

> -# define LIBC_CANCEL_RESET(val) \

> -  __librt_disable_asynccancel (val)

> -#else

> -# define LIBC_CANCEL_ASYNC()	0 /* Just a dummy value.  */

> -# define LIBC_CANCEL_RESET(val)	((void)(val)) /* Nothing, but evaluate it.  */

> -#endif

> +extern int __pthread_enable_asynccancel (void);

> +libc_hidden_proto (__pthread_enable_asynccancel)

> +#define LIBC_CANCEL_ASYNC() __pthread_enable_asynccancel ()

>  

> +/* Reset to previous cancellation mode.  */

> +extern void __pthread_disable_asynccancel (int oldtype);

> +libc_hidden_proto (__pthread_disable_asynccancel)

> +#define LIBC_CANCEL_RESET(oldtype) __pthread_disable_asynccancel (oldtype)

>  

>  #endif

> 


Ok.

Patch

diff --git a/elf/Makefile b/elf/Makefile
index f09988f7d2..4f99af626f 100644
--- a/elf/Makefile
+++ b/elf/Makefile
@@ -528,8 +528,10 @@  $(objpfx)dl-allobjs.os: $(all-rtld-routines:%=$(objpfx)%.os)
 # discovery mechanism is not compatible with the libc implementation
 # when compiled for libc.
 rtld-stubbed-symbols = \
-  __libc_disable_asynccancel \
-  __libc_enable_asynccancel \
+  __GI___pthread_disable_asynccancel \
+  __GI___pthread_enable_asynccancel \
+  __pthread_disable_asynccancel \
+  __pthread_enable_asynccancel \
   calloc \
   free \
   malloc \
diff --git a/manual/llio.texi b/manual/llio.texi
index c0a53e1a6e..cbc4909fd5 100644
--- a/manual/llio.texi
+++ b/manual/llio.texi
@@ -2534,13 +2534,13 @@  aiocb64}, since the LFS transparently replaces the old interface.
 @c     sigemptyset ok
 @c     sigaddset ok
 @c     setjmp ok
-@c     CANCEL_ASYNC -> pthread_enable_asynccancel ok
+@c     LIBC_CANCEL_ASYNC -> __pthread_enable_asynccancel ok
 @c      do_cancel ok
 @c       pthread_unwind ok
 @c        Unwind_ForcedUnwind or longjmp ok [@ascuheap @acsmem?]
 @c     lll_lock @asulock @aculock
 @c     lll_unlock @asulock @aculock
-@c     CANCEL_RESET -> pthread_disable_asynccancel ok
+@c     LIBC_CANCEL_RESET -> __pthread_disable_asynccancel ok
 @c      lll_futex_wait ok
 @c     ->start_routine ok -----
 @c     call_tls_dtors @asulock @ascuheap @aculock @acsmem
diff --git a/nptl/Makefile b/nptl/Makefile
index 884cb69bb4..1337b9e648 100644
--- a/nptl/Makefile
+++ b/nptl/Makefile
@@ -30,6 +30,7 @@  extra-libs-others := $(extra-libs)
 
 routines = \
   alloca_cutoff \
+  cancellation \
   cleanup_compat \
   cleanup_defer_compat \
   cleanup_routine \
@@ -39,7 +40,6 @@  routines = \
   elision-trylock \
   elision-unlock \
   futex-internal \
-  libc-cancellation \
   libc-cleanup \
   libc_multiple_threads \
   libc_pthread_init \
@@ -157,7 +157,6 @@  shared-only-routines = forward
 static-only-routines = pthread_atfork
 
 libpthread-routines = \
-  cancellation \
   cleanup \
   cleanup_defer \
   events \
@@ -239,7 +238,6 @@  CFLAGS-pthread_setcanceltype.c += -fexceptions -fasynchronous-unwind-tables
 # These are internal functions which similar functionality as setcancelstate
 # and setcanceltype.
 CFLAGS-cancellation.c += -fasynchronous-unwind-tables
-CFLAGS-libc-cancellation.c += -fasynchronous-unwind-tables
 
 # Calling pthread_exit() must cause the registered cancel handlers to
 # be executed.  Therefore exceptions have to be thrown through this
diff --git a/nptl/Versions b/nptl/Versions
index ce09c73727..e845cbf804 100644
--- a/nptl/Versions
+++ b/nptl/Versions
@@ -281,6 +281,8 @@  libc {
     __pthread_cleanup_push;
     __pthread_cleanup_upto;
     __pthread_current_priority;
+    __pthread_disable_asynccancel;
+    __pthread_enable_asynccancel;
     __pthread_force_elision;
     __pthread_getattr_default_np;
     __pthread_keys;
diff --git a/nptl/cancellation.c b/nptl/cancellation.c
index 2ee633eabc..c20845adc0 100644
--- a/nptl/cancellation.c
+++ b/nptl/cancellation.c
@@ -28,7 +28,6 @@ 
    AS-safe, with the exception of the actual cancellation, because they
    are called by wrappers around AS-safe functions like write().*/
 int
-attribute_hidden
 __pthread_enable_asynccancel (void)
 {
   struct pthread *self = THREAD_SELF;
@@ -60,11 +59,11 @@  __pthread_enable_asynccancel (void)
 
   return oldval;
 }
+libc_hidden_def (__pthread_enable_asynccancel)
 
 /* See the comment for __pthread_enable_asynccancel regarding
    the AS-safety of this function.  */
 void
-attribute_hidden
 __pthread_disable_asynccancel (int oldtype)
 {
   /* If asynchronous cancellation was enabled before we do not have
@@ -102,3 +101,4 @@  __pthread_disable_asynccancel (int oldtype)
       newval = THREAD_GETMEM (self, cancelhandling);
     }
 }
+libc_hidden_def (__pthread_disable_asynccancel)
diff --git a/nptl/libc-cancellation.c b/nptl/libc-cancellation.c
deleted file mode 100644
index 29f5a5864b..0000000000
--- a/nptl/libc-cancellation.c
+++ /dev/null
@@ -1,24 +0,0 @@ 
-/* Copyright (C) 2002-2021 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-   Contributed by Ulrich Drepper <drepper@redhat.com>, 2002.
-
-   The GNU C Library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU Lesser General Public
-   License as published by the Free Software Foundation; either
-   version 2.1 of the License, or (at your option) any later version.
-
-   The GNU C Library is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   Lesser General Public License for more details.
-
-   You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library; if not, see
-   <https://www.gnu.org/licenses/>.  */
-
-#include "pthreadP.h"
-
-
-#define __pthread_enable_asynccancel __libc_enable_asynccancel
-#define __pthread_disable_asynccancel __libc_disable_asynccancel
-#include <nptl/cancellation.c>
diff --git a/nptl/pthreadP.h b/nptl/pthreadP.h
index ee77928fc7..2d9e42173e 100644
--- a/nptl/pthreadP.h
+++ b/nptl/pthreadP.h
@@ -569,8 +569,6 @@  libc_hidden_proto (__pthread_exit)
 extern int __pthread_join (pthread_t threadid, void **thread_return);
 extern int __pthread_setcanceltype (int type, int *oldtype);
 libc_hidden_proto (__pthread_setcanceltype)
-extern int __pthread_enable_asynccancel (void) attribute_hidden;
-extern void __pthread_disable_asynccancel (int oldtype) attribute_hidden;
 extern void __pthread_testcancel (void);
 libc_hidden_proto (__pthread_testcancel)
 extern int __pthread_clockjoin_ex (pthread_t, void **, clockid_t,
diff --git a/nptl/pthread_create.c b/nptl/pthread_create.c
index d89a83b38a..775287d0e4 100644
--- a/nptl/pthread_create.c
+++ b/nptl/pthread_create.c
@@ -353,7 +353,7 @@  START_THREAD_DEFN
 	 have ownership (see CONCURRENCY NOTES above).  */
       if (__glibc_unlikely (pd->stopped_start))
 	{
-	  int oldtype = CANCEL_ASYNC ();
+	  int oldtype = LIBC_CANCEL_ASYNC ();
 
 	  /* Get the lock the parent locked to force synchronization.  */
 	  lll_lock (pd->lock, LLL_PRIVATE);
@@ -363,7 +363,7 @@  START_THREAD_DEFN
 	  /* And give it up right away.  */
 	  lll_unlock (pd->lock, LLL_PRIVATE);
 
-	  CANCEL_RESET (oldtype);
+	  LIBC_CANCEL_RESET (oldtype);
 	}
 
       LIBC_PROBE (pthread_start, 3, (pthread_t) pd, pd->start_routine, pd->arg);
diff --git a/rt/Makefile b/rt/Makefile
index c1a0fdeb46..97c9bbd9de 100644
--- a/rt/Makefile
+++ b/rt/Makefile
@@ -59,7 +59,6 @@  include ../Rules
 CFLAGS-aio_suspend.c += -fexceptions
 CFLAGS-mq_timedreceive.c += -fexceptions -fasynchronous-unwind-tables
 CFLAGS-mq_timedsend.c += -fexceptions -fasynchronous-unwind-tables
-CFLAGS-librt-cancellation.c += -fasynchronous-unwind-tables
 
 LDFLAGS-rt.so = -Wl,--enable-new-dtags,-z,nodelete
 
diff --git a/sysdeps/nptl/Makefile b/sysdeps/nptl/Makefile
index adcced422b..632cd3686b 100644
--- a/sysdeps/nptl/Makefile
+++ b/sysdeps/nptl/Makefile
@@ -21,8 +21,7 @@  libpthread-sysdep_routines += errno-loc
 endif
 
 ifeq ($(subdir),rt)
-librt-sysdep_routines += timer_routines librt-cancellation
-CFLAGS-librt-cancellation.c += -fexceptions -fasynchronous-unwind-tables
+librt-sysdep_routines += timer_routines
 
 tests += tst-mqueue8x
 CFLAGS-tst-mqueue8x.c += -fexceptions
diff --git a/sysdeps/nptl/librt-cancellation.c b/sysdeps/nptl/librt-cancellation.c
deleted file mode 100644
index 1ad0eb11ff..0000000000
--- a/sysdeps/nptl/librt-cancellation.c
+++ /dev/null
@@ -1,24 +0,0 @@ 
-/* Copyright (C) 2002-2021 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-   Contributed by Ulrich Drepper <drepper@redhat.com>, 2002.
-
-   The GNU C Library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU Lesser General Public
-   License as published by the Free Software Foundation; either
-   version 2.1 of the License, or (at your option) any later version.
-
-   The GNU C Library is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   Lesser General Public License for more details.
-
-   You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library; if not, see
-   <https://www.gnu.org/licenses/>.  */
-
-#include <nptl/pthreadP.h>
-
-
-#define __pthread_enable_asynccancel __librt_enable_asynccancel
-#define __pthread_disable_asynccancel __librt_disable_asynccancel
-#include <nptl/cancellation.c>
diff --git a/sysdeps/nptl/lowlevellock-futex.h b/sysdeps/nptl/lowlevellock-futex.h
index ca96397a4a..66ebfe50f4 100644
--- a/sysdeps/nptl/lowlevellock-futex.h
+++ b/sysdeps/nptl/lowlevellock-futex.h
@@ -121,18 +121,18 @@ 
 /* Like lll_futex_wait, but acting as a cancellable entrypoint.  */
 # define lll_futex_wait_cancel(futexp, val, private) \
   ({                                                                   \
-    int __oldtype = CANCEL_ASYNC ();				       \
+    int __oldtype = LIBC_CANCEL_ASYNC ();			       \
     long int __err = lll_futex_wait (futexp, val, LLL_SHARED);	       \
-    CANCEL_RESET (__oldtype);					       \
+    LIBC_CANCEL_RESET (__oldtype);				       \
     __err;							       \
   })
 
 /* Like lll_futex_timed_wait, but acting as a cancellable entrypoint.  */
 # define lll_futex_timed_wait_cancel(futexp, val, timeout, private) \
   ({									   \
-    int __oldtype = CANCEL_ASYNC ();				       	   \
+    int __oldtype = LIBC_CANCEL_ASYNC ();			       	   \
     long int __err = lll_futex_timed_wait (futexp, val, timeout, private); \
-    CANCEL_RESET (__oldtype);						   \
+    LIBC_CANCEL_RESET (__oldtype);					   \
     __err;								   \
   })
 
diff --git a/sysdeps/unix/sysv/linux/socketcall.h b/sysdeps/unix/sysv/linux/socketcall.h
index 07702fc4f1..3084623216 100644
--- a/sysdeps/unix/sysv/linux/socketcall.h
+++ b/sysdeps/unix/sysv/linux/socketcall.h
@@ -89,11 +89,6 @@ 
   })
 
 
-#if IS_IN (libc)
-# define __pthread_enable_asynccancel  __libc_enable_asynccancel
-# define __pthread_disable_asynccancel __libc_disable_asynccancel
-#endif
-
 #define SOCKETCALL_CANCEL(name, args...)				\
   ({									\
     int oldtype = LIBC_CANCEL_ASYNC ();					\
diff --git a/sysdeps/unix/sysv/linux/sysdep-cancel.h b/sysdeps/unix/sysv/linux/sysdep-cancel.h
index da2f08fde9..c64cfff37c 100644
--- a/sysdeps/unix/sysv/linux/sysdep-cancel.h
+++ b/sysdeps/unix/sysv/linux/sysdep-cancel.h
@@ -24,44 +24,14 @@ 
 #include <tls.h>
 #include <errno.h>
 
-/* The two functions are in libc.so and not exported.  */
-extern int __libc_enable_asynccancel (void) attribute_hidden;
-extern void __libc_disable_asynccancel (int oldtype) attribute_hidden;
-
-/* The two functions are in librt.so and not exported.  */
-extern int __librt_enable_asynccancel (void) attribute_hidden;
-extern void __librt_disable_asynccancel (int oldtype) attribute_hidden;
-
-/* The two functions are in libpthread.so and not exported.  */
-extern int __pthread_enable_asynccancel (void) attribute_hidden;
-extern void __pthread_disable_asynccancel (int oldtype) attribute_hidden;
-
 /* Set cancellation mode to asynchronous.  */
-#define CANCEL_ASYNC() \
-  __pthread_enable_asynccancel ()
-/* Reset to previous cancellation mode.  */
-#define CANCEL_RESET(oldtype) \
-  __pthread_disable_asynccancel (oldtype)
-
-#if IS_IN (libc)
-/* Same as CANCEL_ASYNC, but for use in libc.so.  */
-# define LIBC_CANCEL_ASYNC() \
-  __libc_enable_asynccancel ()
-/* Same as CANCEL_RESET, but for use in libc.so.  */
-# define LIBC_CANCEL_RESET(oldtype) \
-  __libc_disable_asynccancel (oldtype)
-#elif IS_IN (libpthread)
-# define LIBC_CANCEL_ASYNC() CANCEL_ASYNC ()
-# define LIBC_CANCEL_RESET(val) CANCEL_RESET (val)
-#elif IS_IN (librt)
-# define LIBC_CANCEL_ASYNC() \
-  __librt_enable_asynccancel ()
-# define LIBC_CANCEL_RESET(val) \
-  __librt_disable_asynccancel (val)
-#else
-# define LIBC_CANCEL_ASYNC()	0 /* Just a dummy value.  */
-# define LIBC_CANCEL_RESET(val)	((void)(val)) /* Nothing, but evaluate it.  */
-#endif
+extern int __pthread_enable_asynccancel (void);
+libc_hidden_proto (__pthread_enable_asynccancel)
+#define LIBC_CANCEL_ASYNC() __pthread_enable_asynccancel ()
 
+/* Reset to previous cancellation mode.  */
+extern void __pthread_disable_asynccancel (int oldtype);
+libc_hidden_proto (__pthread_disable_asynccancel)
+#define LIBC_CANCEL_RESET(oldtype) __pthread_disable_asynccancel (oldtype)
 
 #endif