linux/include/linux/atomic/atomic-instrumented.h
<<
>>
Prefs
   1// SPDX-License-Identifier: GPL-2.0
   2
   3// Generated by scripts/atomic/gen-atomic-instrumented.sh
   4// DO NOT MODIFY THIS FILE DIRECTLY
   5
   6/*
   7 * This file provides wrappers with KASAN instrumentation for atomic operations.
   8 * To use this functionality an arch's atomic.h file needs to define all
   9 * atomic operations with arch_ prefix (e.g. arch_atomic_read()) and include
  10 * this file at the end. This file provides atomic_read() that forwards to
  11 * arch_atomic_read() for actual atomic operation.
  12 * Note: if an arch atomic operation is implemented by means of other atomic
  13 * operations (e.g. atomic_read()/atomic_cmpxchg() loop), then it needs to use
  14 * arch_ variants (i.e. arch_atomic_read()/arch_atomic_cmpxchg()) to avoid
  15 * double instrumentation.
  16 */
  17#ifndef _LINUX_ATOMIC_INSTRUMENTED_H
  18#define _LINUX_ATOMIC_INSTRUMENTED_H
  19
  20#include <linux/build_bug.h>
  21#include <linux/compiler.h>
  22#include <linux/instrumented.h>
  23
  24static __always_inline int
  25atomic_read(const atomic_t *v)
  26{
  27        instrument_atomic_read(v, sizeof(*v));
  28        return arch_atomic_read(v);
  29}
  30
  31static __always_inline int
  32atomic_read_acquire(const atomic_t *v)
  33{
  34        instrument_atomic_read(v, sizeof(*v));
  35        return arch_atomic_read_acquire(v);
  36}
  37
  38static __always_inline void
  39atomic_set(atomic_t *v, int i)
  40{
  41        instrument_atomic_write(v, sizeof(*v));
  42        arch_atomic_set(v, i);
  43}
  44
  45static __always_inline void
  46atomic_set_release(atomic_t *v, int i)
  47{
  48        instrument_atomic_write(v, sizeof(*v));
  49        arch_atomic_set_release(v, i);
  50}
  51
  52static __always_inline void
  53atomic_add(int i, atomic_t *v)
  54{
  55        instrument_atomic_read_write(v, sizeof(*v));
  56        arch_atomic_add(i, v);
  57}
  58
  59static __always_inline int
  60atomic_add_return(int i, atomic_t *v)
  61{
  62        instrument_atomic_read_write(v, sizeof(*v));
  63        return arch_atomic_add_return(i, v);
  64}
  65
  66static __always_inline int
  67atomic_add_return_acquire(int i, atomic_t *v)
  68{
  69        instrument_atomic_read_write(v, sizeof(*v));
  70        return arch_atomic_add_return_acquire(i, v);
  71}
  72
  73static __always_inline int
  74atomic_add_return_release(int i, atomic_t *v)
  75{
  76        instrument_atomic_read_write(v, sizeof(*v));
  77        return arch_atomic_add_return_release(i, v);
  78}
  79
  80static __always_inline int
  81atomic_add_return_relaxed(int i, atomic_t *v)
  82{
  83        instrument_atomic_read_write(v, sizeof(*v));
  84        return arch_atomic_add_return_relaxed(i, v);
  85}
  86
  87static __always_inline int
  88atomic_fetch_add(int i, atomic_t *v)
  89{
  90        instrument_atomic_read_write(v, sizeof(*v));
  91        return arch_atomic_fetch_add(i, v);
  92}
  93
  94static __always_inline int
  95atomic_fetch_add_acquire(int i, atomic_t *v)
  96{
  97        instrument_atomic_read_write(v, sizeof(*v));
  98        return arch_atomic_fetch_add_acquire(i, v);
  99}
 100
 101static __always_inline int
 102atomic_fetch_add_release(int i, atomic_t *v)
 103{
 104        instrument_atomic_read_write(v, sizeof(*v));
 105        return arch_atomic_fetch_add_release(i, v);
 106}
 107
 108static __always_inline int
 109atomic_fetch_add_relaxed(int i, atomic_t *v)
 110{
 111        instrument_atomic_read_write(v, sizeof(*v));
 112        return arch_atomic_fetch_add_relaxed(i, v);
 113}
 114
 115static __always_inline void
 116atomic_sub(int i, atomic_t *v)
 117{
 118        instrument_atomic_read_write(v, sizeof(*v));
 119        arch_atomic_sub(i, v);
 120}
 121
 122static __always_inline int
 123atomic_sub_return(int i, atomic_t *v)
 124{
 125        instrument_atomic_read_write(v, sizeof(*v));
 126        return arch_atomic_sub_return(i, v);
 127}
 128
 129static __always_inline int
 130atomic_sub_return_acquire(int i, atomic_t *v)
 131{
 132        instrument_atomic_read_write(v, sizeof(*v));
 133        return arch_atomic_sub_return_acquire(i, v);
 134}
 135
 136static __always_inline int
 137atomic_sub_return_release(int i, atomic_t *v)
 138{
 139        instrument_atomic_read_write(v, sizeof(*v));
 140        return arch_atomic_sub_return_release(i, v);
 141}
 142
 143static __always_inline int
 144atomic_sub_return_relaxed(int i, atomic_t *v)
 145{
 146        instrument_atomic_read_write(v, sizeof(*v));
 147        return arch_atomic_sub_return_relaxed(i, v);
 148}
 149
 150static __always_inline int
 151atomic_fetch_sub(int i, atomic_t *v)
 152{
 153        instrument_atomic_read_write(v, sizeof(*v));
 154        return arch_atomic_fetch_sub(i, v);
 155}
 156
 157static __always_inline int
 158atomic_fetch_sub_acquire(int i, atomic_t *v)
 159{
 160        instrument_atomic_read_write(v, sizeof(*v));
 161        return arch_atomic_fetch_sub_acquire(i, v);
 162}
 163
 164static __always_inline int
 165atomic_fetch_sub_release(int i, atomic_t *v)
 166{
 167        instrument_atomic_read_write(v, sizeof(*v));
 168        return arch_atomic_fetch_sub_release(i, v);
 169}
 170
 171static __always_inline int
 172atomic_fetch_sub_relaxed(int i, atomic_t *v)
 173{
 174        instrument_atomic_read_write(v, sizeof(*v));
 175        return arch_atomic_fetch_sub_relaxed(i, v);
 176}
 177
 178static __always_inline void
 179atomic_inc(atomic_t *v)
 180{
 181        instrument_atomic_read_write(v, sizeof(*v));
 182        arch_atomic_inc(v);
 183}
 184
 185static __always_inline int
 186atomic_inc_return(atomic_t *v)
 187{
 188        instrument_atomic_read_write(v, sizeof(*v));
 189        return arch_atomic_inc_return(v);
 190}
 191
 192static __always_inline int
 193atomic_inc_return_acquire(atomic_t *v)
 194{
 195        instrument_atomic_read_write(v, sizeof(*v));
 196        return arch_atomic_inc_return_acquire(v);
 197}
 198
 199static __always_inline int
 200atomic_inc_return_release(atomic_t *v)
 201{
 202        instrument_atomic_read_write(v, sizeof(*v));
 203        return arch_atomic_inc_return_release(v);
 204}
 205
 206static __always_inline int
 207atomic_inc_return_relaxed(atomic_t *v)
 208{
 209        instrument_atomic_read_write(v, sizeof(*v));
 210        return arch_atomic_inc_return_relaxed(v);
 211}
 212
 213static __always_inline int
 214atomic_fetch_inc(atomic_t *v)
 215{
 216        instrument_atomic_read_write(v, sizeof(*v));
 217        return arch_atomic_fetch_inc(v);
 218}
 219
 220static __always_inline int
 221atomic_fetch_inc_acquire(atomic_t *v)
 222{
 223        instrument_atomic_read_write(v, sizeof(*v));
 224        return arch_atomic_fetch_inc_acquire(v);
 225}
 226
 227static __always_inline int
 228atomic_fetch_inc_release(atomic_t *v)
 229{
 230        instrument_atomic_read_write(v, sizeof(*v));
 231        return arch_atomic_fetch_inc_release(v);
 232}
 233
 234static __always_inline int
 235atomic_fetch_inc_relaxed(atomic_t *v)
 236{
 237        instrument_atomic_read_write(v, sizeof(*v));
 238        return arch_atomic_fetch_inc_relaxed(v);
 239}
 240
 241static __always_inline void
 242atomic_dec(atomic_t *v)
 243{
 244        instrument_atomic_read_write(v, sizeof(*v));
 245        arch_atomic_dec(v);
 246}
 247
 248static __always_inline int
 249atomic_dec_return(atomic_t *v)
 250{
 251        instrument_atomic_read_write(v, sizeof(*v));
 252        return arch_atomic_dec_return(v);
 253}
 254
 255static __always_inline int
 256atomic_dec_return_acquire(atomic_t *v)
 257{
 258        instrument_atomic_read_write(v, sizeof(*v));
 259        return arch_atomic_dec_return_acquire(v);
 260}
 261
 262static __always_inline int
 263atomic_dec_return_release(atomic_t *v)
 264{
 265        instrument_atomic_read_write(v, sizeof(*v));
 266        return arch_atomic_dec_return_release(v);
 267}
 268
 269static __always_inline int
 270atomic_dec_return_relaxed(atomic_t *v)
 271{
 272        instrument_atomic_read_write(v, sizeof(*v));
 273        return arch_atomic_dec_return_relaxed(v);
 274}
 275
 276static __always_inline int
 277atomic_fetch_dec(atomic_t *v)
 278{
 279        instrument_atomic_read_write(v, sizeof(*v));
 280        return arch_atomic_fetch_dec(v);
 281}
 282
 283static __always_inline int
 284atomic_fetch_dec_acquire(atomic_t *v)
 285{
 286        instrument_atomic_read_write(v, sizeof(*v));
 287        return arch_atomic_fetch_dec_acquire(v);
 288}
 289
 290static __always_inline int
 291atomic_fetch_dec_release(atomic_t *v)
 292{
 293        instrument_atomic_read_write(v, sizeof(*v));
 294        return arch_atomic_fetch_dec_release(v);
 295}
 296
 297static __always_inline int
 298atomic_fetch_dec_relaxed(atomic_t *v)
 299{
 300        instrument_atomic_read_write(v, sizeof(*v));
 301        return arch_atomic_fetch_dec_relaxed(v);
 302}
 303
 304static __always_inline void
 305atomic_and(int i, atomic_t *v)
 306{
 307        instrument_atomic_read_write(v, sizeof(*v));
 308        arch_atomic_and(i, v);
 309}
 310
 311static __always_inline int
 312atomic_fetch_and(int i, atomic_t *v)
 313{
 314        instrument_atomic_read_write(v, sizeof(*v));
 315        return arch_atomic_fetch_and(i, v);
 316}
 317
 318static __always_inline int
 319atomic_fetch_and_acquire(int i, atomic_t *v)
 320{
 321        instrument_atomic_read_write(v, sizeof(*v));
 322        return arch_atomic_fetch_and_acquire(i, v);
 323}
 324
 325static __always_inline int
 326atomic_fetch_and_release(int i, atomic_t *v)
 327{
 328        instrument_atomic_read_write(v, sizeof(*v));
 329        return arch_atomic_fetch_and_release(i, v);
 330}
 331
 332static __always_inline int
 333atomic_fetch_and_relaxed(int i, atomic_t *v)
 334{
 335        instrument_atomic_read_write(v, sizeof(*v));
 336        return arch_atomic_fetch_and_relaxed(i, v);
 337}
 338
 339static __always_inline void
 340atomic_andnot(int i, atomic_t *v)
 341{
 342        instrument_atomic_read_write(v, sizeof(*v));
 343        arch_atomic_andnot(i, v);
 344}
 345
 346static __always_inline int
 347atomic_fetch_andnot(int i, atomic_t *v)
 348{
 349        instrument_atomic_read_write(v, sizeof(*v));
 350        return arch_atomic_fetch_andnot(i, v);
 351}
 352
 353static __always_inline int
 354atomic_fetch_andnot_acquire(int i, atomic_t *v)
 355{
 356        instrument_atomic_read_write(v, sizeof(*v));
 357        return arch_atomic_fetch_andnot_acquire(i, v);
 358}
 359
 360static __always_inline int
 361atomic_fetch_andnot_release(int i, atomic_t *v)
 362{
 363        instrument_atomic_read_write(v, sizeof(*v));
 364        return arch_atomic_fetch_andnot_release(i, v);
 365}
 366
 367static __always_inline int
 368atomic_fetch_andnot_relaxed(int i, atomic_t *v)
 369{
 370        instrument_atomic_read_write(v, sizeof(*v));
 371        return arch_atomic_fetch_andnot_relaxed(i, v);
 372}
 373
 374static __always_inline void
 375atomic_or(int i, atomic_t *v)
 376{
 377        instrument_atomic_read_write(v, sizeof(*v));
 378        arch_atomic_or(i, v);
 379}
 380
 381static __always_inline int
 382atomic_fetch_or(int i, atomic_t *v)
 383{
 384        instrument_atomic_read_write(v, sizeof(*v));
 385        return arch_atomic_fetch_or(i, v);
 386}
 387
 388static __always_inline int
 389atomic_fetch_or_acquire(int i, atomic_t *v)
 390{
 391        instrument_atomic_read_write(v, sizeof(*v));
 392        return arch_atomic_fetch_or_acquire(i, v);
 393}
 394
 395static __always_inline int
 396atomic_fetch_or_release(int i, atomic_t *v)
 397{
 398        instrument_atomic_read_write(v, sizeof(*v));
 399        return arch_atomic_fetch_or_release(i, v);
 400}
 401
 402static __always_inline int
 403atomic_fetch_or_relaxed(int i, atomic_t *v)
 404{
 405        instrument_atomic_read_write(v, sizeof(*v));
 406        return arch_atomic_fetch_or_relaxed(i, v);
 407}
 408
 409static __always_inline void
 410atomic_xor(int i, atomic_t *v)
 411{
 412        instrument_atomic_read_write(v, sizeof(*v));
 413        arch_atomic_xor(i, v);
 414}
 415
 416static __always_inline int
 417atomic_fetch_xor(int i, atomic_t *v)
 418{
 419        instrument_atomic_read_write(v, sizeof(*v));
 420        return arch_atomic_fetch_xor(i, v);
 421}
 422
 423static __always_inline int
 424atomic_fetch_xor_acquire(int i, atomic_t *v)
 425{
 426        instrument_atomic_read_write(v, sizeof(*v));
 427        return arch_atomic_fetch_xor_acquire(i, v);
 428}
 429
 430static __always_inline int
 431atomic_fetch_xor_release(int i, atomic_t *v)
 432{
 433        instrument_atomic_read_write(v, sizeof(*v));
 434        return arch_atomic_fetch_xor_release(i, v);
 435}
 436
 437static __always_inline int
 438atomic_fetch_xor_relaxed(int i, atomic_t *v)
 439{
 440        instrument_atomic_read_write(v, sizeof(*v));
 441        return arch_atomic_fetch_xor_relaxed(i, v);
 442}
 443
 444static __always_inline int
 445atomic_xchg(atomic_t *v, int i)
 446{
 447        instrument_atomic_read_write(v, sizeof(*v));
 448        return arch_atomic_xchg(v, i);
 449}
 450
 451static __always_inline int
 452atomic_xchg_acquire(atomic_t *v, int i)
 453{
 454        instrument_atomic_read_write(v, sizeof(*v));
 455        return arch_atomic_xchg_acquire(v, i);
 456}
 457
 458static __always_inline int
 459atomic_xchg_release(atomic_t *v, int i)
 460{
 461        instrument_atomic_read_write(v, sizeof(*v));
 462        return arch_atomic_xchg_release(v, i);
 463}
 464
 465static __always_inline int
 466atomic_xchg_relaxed(atomic_t *v, int i)
 467{
 468        instrument_atomic_read_write(v, sizeof(*v));
 469        return arch_atomic_xchg_relaxed(v, i);
 470}
 471
 472static __always_inline int
 473atomic_cmpxchg(atomic_t *v, int old, int new)
 474{
 475        instrument_atomic_read_write(v, sizeof(*v));
 476        return arch_atomic_cmpxchg(v, old, new);
 477}
 478
 479static __always_inline int
 480atomic_cmpxchg_acquire(atomic_t *v, int old, int new)
 481{
 482        instrument_atomic_read_write(v, sizeof(*v));
 483        return arch_atomic_cmpxchg_acquire(v, old, new);
 484}
 485
 486static __always_inline int
 487atomic_cmpxchg_release(atomic_t *v, int old, int new)
 488{
 489        instrument_atomic_read_write(v, sizeof(*v));
 490        return arch_atomic_cmpxchg_release(v, old, new);
 491}
 492
 493static __always_inline int
 494atomic_cmpxchg_relaxed(atomic_t *v, int old, int new)
 495{
 496        instrument_atomic_read_write(v, sizeof(*v));
 497        return arch_atomic_cmpxchg_relaxed(v, old, new);
 498}
 499
 500static __always_inline bool
 501atomic_try_cmpxchg(atomic_t *v, int *old, int new)
 502{
 503        instrument_atomic_read_write(v, sizeof(*v));
 504        instrument_atomic_read_write(old, sizeof(*old));
 505        return arch_atomic_try_cmpxchg(v, old, new);
 506}
 507
 508static __always_inline bool
 509atomic_try_cmpxchg_acquire(atomic_t *v, int *old, int new)
 510{
 511        instrument_atomic_read_write(v, sizeof(*v));
 512        instrument_atomic_read_write(old, sizeof(*old));
 513        return arch_atomic_try_cmpxchg_acquire(v, old, new);
 514}
 515
 516static __always_inline bool
 517atomic_try_cmpxchg_release(atomic_t *v, int *old, int new)
 518{
 519        instrument_atomic_read_write(v, sizeof(*v));
 520        instrument_atomic_read_write(old, sizeof(*old));
 521        return arch_atomic_try_cmpxchg_release(v, old, new);
 522}
 523
 524static __always_inline bool
 525atomic_try_cmpxchg_relaxed(atomic_t *v, int *old, int new)
 526{
 527        instrument_atomic_read_write(v, sizeof(*v));
 528        instrument_atomic_read_write(old, sizeof(*old));
 529        return arch_atomic_try_cmpxchg_relaxed(v, old, new);
 530}
 531
 532static __always_inline bool
 533atomic_sub_and_test(int i, atomic_t *v)
 534{
 535        instrument_atomic_read_write(v, sizeof(*v));
 536        return arch_atomic_sub_and_test(i, v);
 537}
 538
 539static __always_inline bool
 540atomic_dec_and_test(atomic_t *v)
 541{
 542        instrument_atomic_read_write(v, sizeof(*v));
 543        return arch_atomic_dec_and_test(v);
 544}
 545
 546static __always_inline bool
 547atomic_inc_and_test(atomic_t *v)
 548{
 549        instrument_atomic_read_write(v, sizeof(*v));
 550        return arch_atomic_inc_and_test(v);
 551}
 552
 553static __always_inline bool
 554atomic_add_negative(int i, atomic_t *v)
 555{
 556        instrument_atomic_read_write(v, sizeof(*v));
 557        return arch_atomic_add_negative(i, v);
 558}
 559
 560static __always_inline int
 561atomic_fetch_add_unless(atomic_t *v, int a, int u)
 562{
 563        instrument_atomic_read_write(v, sizeof(*v));
 564        return arch_atomic_fetch_add_unless(v, a, u);
 565}
 566
 567static __always_inline bool
 568atomic_add_unless(atomic_t *v, int a, int u)
 569{
 570        instrument_atomic_read_write(v, sizeof(*v));
 571        return arch_atomic_add_unless(v, a, u);
 572}
 573
 574static __always_inline bool
 575atomic_inc_not_zero(atomic_t *v)
 576{
 577        instrument_atomic_read_write(v, sizeof(*v));
 578        return arch_atomic_inc_not_zero(v);
 579}
 580
 581static __always_inline bool
 582atomic_inc_unless_negative(atomic_t *v)
 583{
 584        instrument_atomic_read_write(v, sizeof(*v));
 585        return arch_atomic_inc_unless_negative(v);
 586}
 587
 588static __always_inline bool
 589atomic_dec_unless_positive(atomic_t *v)
 590{
 591        instrument_atomic_read_write(v, sizeof(*v));
 592        return arch_atomic_dec_unless_positive(v);
 593}
 594
 595static __always_inline int
 596atomic_dec_if_positive(atomic_t *v)
 597{
 598        instrument_atomic_read_write(v, sizeof(*v));
 599        return arch_atomic_dec_if_positive(v);
 600}
 601
 602static __always_inline s64
 603atomic64_read(const atomic64_t *v)
 604{
 605        instrument_atomic_read(v, sizeof(*v));
 606        return arch_atomic64_read(v);
 607}
 608
 609static __always_inline s64
 610atomic64_read_acquire(const atomic64_t *v)
 611{
 612        instrument_atomic_read(v, sizeof(*v));
 613        return arch_atomic64_read_acquire(v);
 614}
 615
 616static __always_inline void
 617atomic64_set(atomic64_t *v, s64 i)
 618{
 619        instrument_atomic_write(v, sizeof(*v));
 620        arch_atomic64_set(v, i);
 621}
 622
 623static __always_inline void
 624atomic64_set_release(atomic64_t *v, s64 i)
 625{
 626        instrument_atomic_write(v, sizeof(*v));
 627        arch_atomic64_set_release(v, i);
 628}
 629
 630static __always_inline void
 631atomic64_add(s64 i, atomic64_t *v)
 632{
 633        instrument_atomic_read_write(v, sizeof(*v));
 634        arch_atomic64_add(i, v);
 635}
 636
 637static __always_inline s64
 638atomic64_add_return(s64 i, atomic64_t *v)
 639{
 640        instrument_atomic_read_write(v, sizeof(*v));
 641        return arch_atomic64_add_return(i, v);
 642}
 643
 644static __always_inline s64
 645atomic64_add_return_acquire(s64 i, atomic64_t *v)
 646{
 647        instrument_atomic_read_write(v, sizeof(*v));
 648        return arch_atomic64_add_return_acquire(i, v);
 649}
 650
 651static __always_inline s64
 652atomic64_add_return_release(s64 i, atomic64_t *v)
 653{
 654        instrument_atomic_read_write(v, sizeof(*v));
 655        return arch_atomic64_add_return_release(i, v);
 656}
 657
 658static __always_inline s64
 659atomic64_add_return_relaxed(s64 i, atomic64_t *v)
 660{
 661        instrument_atomic_read_write(v, sizeof(*v));
 662        return arch_atomic64_add_return_relaxed(i, v);
 663}
 664
 665static __always_inline s64
 666atomic64_fetch_add(s64 i, atomic64_t *v)
 667{
 668        instrument_atomic_read_write(v, sizeof(*v));
 669        return arch_atomic64_fetch_add(i, v);
 670}
 671
 672static __always_inline s64
 673atomic64_fetch_add_acquire(s64 i, atomic64_t *v)
 674{
 675        instrument_atomic_read_write(v, sizeof(*v));
 676        return arch_atomic64_fetch_add_acquire(i, v);
 677}
 678
 679static __always_inline s64
 680atomic64_fetch_add_release(s64 i, atomic64_t *v)
 681{
 682        instrument_atomic_read_write(v, sizeof(*v));
 683        return arch_atomic64_fetch_add_release(i, v);
 684}
 685
 686static __always_inline s64
 687atomic64_fetch_add_relaxed(s64 i, atomic64_t *v)
 688{
 689        instrument_atomic_read_write(v, sizeof(*v));
 690        return arch_atomic64_fetch_add_relaxed(i, v);
 691}
 692
 693static __always_inline void
 694atomic64_sub(s64 i, atomic64_t *v)
 695{
 696        instrument_atomic_read_write(v, sizeof(*v));
 697        arch_atomic64_sub(i, v);
 698}
 699
 700static __always_inline s64
 701atomic64_sub_return(s64 i, atomic64_t *v)
 702{
 703        instrument_atomic_read_write(v, sizeof(*v));
 704        return arch_atomic64_sub_return(i, v);
 705}
 706
 707static __always_inline s64
 708atomic64_sub_return_acquire(s64 i, atomic64_t *v)
 709{
 710        instrument_atomic_read_write(v, sizeof(*v));
 711        return arch_atomic64_sub_return_acquire(i, v);
 712}
 713
 714static __always_inline s64
 715atomic64_sub_return_release(s64 i, atomic64_t *v)
 716{
 717        instrument_atomic_read_write(v, sizeof(*v));
 718        return arch_atomic64_sub_return_release(i, v);
 719}
 720
 721static __always_inline s64
 722atomic64_sub_return_relaxed(s64 i, atomic64_t *v)
 723{
 724        instrument_atomic_read_write(v, sizeof(*v));
 725        return arch_atomic64_sub_return_relaxed(i, v);
 726}
 727
 728static __always_inline s64
 729atomic64_fetch_sub(s64 i, atomic64_t *v)
 730{
 731        instrument_atomic_read_write(v, sizeof(*v));
 732        return arch_atomic64_fetch_sub(i, v);
 733}
 734
 735static __always_inline s64
 736atomic64_fetch_sub_acquire(s64 i, atomic64_t *v)
 737{
 738        instrument_atomic_read_write(v, sizeof(*v));
 739        return arch_atomic64_fetch_sub_acquire(i, v);
 740}
 741
 742static __always_inline s64
 743atomic64_fetch_sub_release(s64 i, atomic64_t *v)
 744{
 745        instrument_atomic_read_write(v, sizeof(*v));
 746        return arch_atomic64_fetch_sub_release(i, v);
 747}
 748
 749static __always_inline s64
 750atomic64_fetch_sub_relaxed(s64 i, atomic64_t *v)
 751{
 752        instrument_atomic_read_write(v, sizeof(*v));
 753        return arch_atomic64_fetch_sub_relaxed(i, v);
 754}
 755
 756static __always_inline void
 757atomic64_inc(atomic64_t *v)
 758{
 759        instrument_atomic_read_write(v, sizeof(*v));
 760        arch_atomic64_inc(v);
 761}
 762
 763static __always_inline s64
 764atomic64_inc_return(atomic64_t *v)
 765{
 766        instrument_atomic_read_write(v, sizeof(*v));
 767        return arch_atomic64_inc_return(v);
 768}
 769
 770static __always_inline s64
 771atomic64_inc_return_acquire(atomic64_t *v)
 772{
 773        instrument_atomic_read_write(v, sizeof(*v));
 774        return arch_atomic64_inc_return_acquire(v);
 775}
 776
 777static __always_inline s64
 778atomic64_inc_return_release(atomic64_t *v)
 779{
 780        instrument_atomic_read_write(v, sizeof(*v));
 781        return arch_atomic64_inc_return_release(v);
 782}
 783
 784static __always_inline s64
 785atomic64_inc_return_relaxed(atomic64_t *v)
 786{
 787        instrument_atomic_read_write(v, sizeof(*v));
 788        return arch_atomic64_inc_return_relaxed(v);
 789}
 790
 791static __always_inline s64
 792atomic64_fetch_inc(atomic64_t *v)
 793{
 794        instrument_atomic_read_write(v, sizeof(*v));
 795        return arch_atomic64_fetch_inc(v);
 796}
 797
 798static __always_inline s64
 799atomic64_fetch_inc_acquire(atomic64_t *v)
 800{
 801        instrument_atomic_read_write(v, sizeof(*v));
 802        return arch_atomic64_fetch_inc_acquire(v);
 803}
 804
 805static __always_inline s64
 806atomic64_fetch_inc_release(atomic64_t *v)
 807{
 808        instrument_atomic_read_write(v, sizeof(*v));
 809        return arch_atomic64_fetch_inc_release(v);
 810}
 811
 812static __always_inline s64
 813atomic64_fetch_inc_relaxed(atomic64_t *v)
 814{
 815        instrument_atomic_read_write(v, sizeof(*v));
 816        return arch_atomic64_fetch_inc_relaxed(v);
 817}
 818
 819static __always_inline void
 820atomic64_dec(atomic64_t *v)
 821{
 822        instrument_atomic_read_write(v, sizeof(*v));
 823        arch_atomic64_dec(v);
 824}
 825
 826static __always_inline s64
 827atomic64_dec_return(atomic64_t *v)
 828{
 829        instrument_atomic_read_write(v, sizeof(*v));
 830        return arch_atomic64_dec_return(v);
 831}
 832
 833static __always_inline s64
 834atomic64_dec_return_acquire(atomic64_t *v)
 835{
 836        instrument_atomic_read_write(v, sizeof(*v));
 837        return arch_atomic64_dec_return_acquire(v);
 838}
 839
 840static __always_inline s64
 841atomic64_dec_return_release(atomic64_t *v)
 842{
 843        instrument_atomic_read_write(v, sizeof(*v));
 844        return arch_atomic64_dec_return_release(v);
 845}
 846
 847static __always_inline s64
 848atomic64_dec_return_relaxed(atomic64_t *v)
 849{
 850        instrument_atomic_read_write(v, sizeof(*v));
 851        return arch_atomic64_dec_return_relaxed(v);
 852}
 853
 854static __always_inline s64
 855atomic64_fetch_dec(atomic64_t *v)
 856{
 857        instrument_atomic_read_write(v, sizeof(*v));
 858        return arch_atomic64_fetch_dec(v);
 859}
 860
 861static __always_inline s64
 862atomic64_fetch_dec_acquire(atomic64_t *v)
 863{
 864        instrument_atomic_read_write(v, sizeof(*v));
 865        return arch_atomic64_fetch_dec_acquire(v);
 866}
 867
 868static __always_inline s64
 869atomic64_fetch_dec_release(atomic64_t *v)
 870{
 871        instrument_atomic_read_write(v, sizeof(*v));
 872        return arch_atomic64_fetch_dec_release(v);
 873}
 874
 875static __always_inline s64
 876atomic64_fetch_dec_relaxed(atomic64_t *v)
 877{
 878        instrument_atomic_read_write(v, sizeof(*v));
 879        return arch_atomic64_fetch_dec_relaxed(v);
 880}
 881
 882static __always_inline void
 883atomic64_and(s64 i, atomic64_t *v)
 884{
 885        instrument_atomic_read_write(v, sizeof(*v));
 886        arch_atomic64_and(i, v);
 887}
 888
 889static __always_inline s64
 890atomic64_fetch_and(s64 i, atomic64_t *v)
 891{
 892        instrument_atomic_read_write(v, sizeof(*v));
 893        return arch_atomic64_fetch_and(i, v);
 894}
 895
 896static __always_inline s64
 897atomic64_fetch_and_acquire(s64 i, atomic64_t *v)
 898{
 899        instrument_atomic_read_write(v, sizeof(*v));
 900        return arch_atomic64_fetch_and_acquire(i, v);
 901}
 902
 903static __always_inline s64
 904atomic64_fetch_and_release(s64 i, atomic64_t *v)
 905{
 906        instrument_atomic_read_write(v, sizeof(*v));
 907        return arch_atomic64_fetch_and_release(i, v);
 908}
 909
 910static __always_inline s64
 911atomic64_fetch_and_relaxed(s64 i, atomic64_t *v)
 912{
 913        instrument_atomic_read_write(v, sizeof(*v));
 914        return arch_atomic64_fetch_and_relaxed(i, v);
 915}
 916
 917static __always_inline void
 918atomic64_andnot(s64 i, atomic64_t *v)
 919{
 920        instrument_atomic_read_write(v, sizeof(*v));
 921        arch_atomic64_andnot(i, v);
 922}
 923
 924static __always_inline s64
 925atomic64_fetch_andnot(s64 i, atomic64_t *v)
 926{
 927        instrument_atomic_read_write(v, sizeof(*v));
 928        return arch_atomic64_fetch_andnot(i, v);
 929}
 930
 931static __always_inline s64
 932atomic64_fetch_andnot_acquire(s64 i, atomic64_t *v)
 933{
 934        instrument_atomic_read_write(v, sizeof(*v));
 935        return arch_atomic64_fetch_andnot_acquire(i, v);
 936}
 937
 938static __always_inline s64
 939atomic64_fetch_andnot_release(s64 i, atomic64_t *v)
 940{
 941        instrument_atomic_read_write(v, sizeof(*v));
 942        return arch_atomic64_fetch_andnot_release(i, v);
 943}
 944
 945static __always_inline s64
 946atomic64_fetch_andnot_relaxed(s64 i, atomic64_t *v)
 947{
 948        instrument_atomic_read_write(v, sizeof(*v));
 949        return arch_atomic64_fetch_andnot_relaxed(i, v);
 950}
 951
 952static __always_inline void
 953atomic64_or(s64 i, atomic64_t *v)
 954{
 955        instrument_atomic_read_write(v, sizeof(*v));
 956        arch_atomic64_or(i, v);
 957}
 958
 959static __always_inline s64
 960atomic64_fetch_or(s64 i, atomic64_t *v)
 961{
 962        instrument_atomic_read_write(v, sizeof(*v));
 963        return arch_atomic64_fetch_or(i, v);
 964}
 965
 966static __always_inline s64
 967atomic64_fetch_or_acquire(s64 i, atomic64_t *v)
 968{
 969        instrument_atomic_read_write(v, sizeof(*v));
 970        return arch_atomic64_fetch_or_acquire(i, v);
 971}
 972
 973static __always_inline s64
 974atomic64_fetch_or_release(s64 i, atomic64_t *v)
 975{
 976        instrument_atomic_read_write(v, sizeof(*v));
 977        return arch_atomic64_fetch_or_release(i, v);
 978}
 979
 980static __always_inline s64
 981atomic64_fetch_or_relaxed(s64 i, atomic64_t *v)
 982{
 983        instrument_atomic_read_write(v, sizeof(*v));
 984        return arch_atomic64_fetch_or_relaxed(i, v);
 985}
 986
 987static __always_inline void
 988atomic64_xor(s64 i, atomic64_t *v)
 989{
 990        instrument_atomic_read_write(v, sizeof(*v));
 991        arch_atomic64_xor(i, v);
 992}
 993
 994static __always_inline s64
 995atomic64_fetch_xor(s64 i, atomic64_t *v)
 996{
 997        instrument_atomic_read_write(v, sizeof(*v));
 998        return arch_atomic64_fetch_xor(i, v);
 999}
1000
1001static __always_inline s64
1002atomic64_fetch_xor_acquire(s64 i, atomic64_t *v)
1003{
1004        instrument_atomic_read_write(v, sizeof(*v));
1005        return arch_atomic64_fetch_xor_acquire(i, v);
1006}
1007
1008static __always_inline s64
1009atomic64_fetch_xor_release(s64 i, atomic64_t *v)
1010{
1011        instrument_atomic_read_write(v, sizeof(*v));
1012        return arch_atomic64_fetch_xor_release(i, v);
1013}
1014
1015static __always_inline s64
1016atomic64_fetch_xor_relaxed(s64 i, atomic64_t *v)
1017{
1018        instrument_atomic_read_write(v, sizeof(*v));
1019        return arch_atomic64_fetch_xor_relaxed(i, v);
1020}
1021
1022static __always_inline s64
1023atomic64_xchg(atomic64_t *v, s64 i)
1024{
1025        instrument_atomic_read_write(v, sizeof(*v));
1026        return arch_atomic64_xchg(v, i);
1027}
1028
1029static __always_inline s64
1030atomic64_xchg_acquire(atomic64_t *v, s64 i)
1031{
1032        instrument_atomic_read_write(v, sizeof(*v));
1033        return arch_atomic64_xchg_acquire(v, i);
1034}
1035
1036static __always_inline s64
1037atomic64_xchg_release(atomic64_t *v, s64 i)
1038{
1039        instrument_atomic_read_write(v, sizeof(*v));
1040        return arch_atomic64_xchg_release(v, i);
1041}
1042
1043static __always_inline s64
1044atomic64_xchg_relaxed(atomic64_t *v, s64 i)
1045{
1046        instrument_atomic_read_write(v, sizeof(*v));
1047        return arch_atomic64_xchg_relaxed(v, i);
1048}
1049
1050static __always_inline s64
1051atomic64_cmpxchg(atomic64_t *v, s64 old, s64 new)
1052{
1053        instrument_atomic_read_write(v, sizeof(*v));
1054        return arch_atomic64_cmpxchg(v, old, new);
1055}
1056
1057static __always_inline s64
1058atomic64_cmpxchg_acquire(atomic64_t *v, s64 old, s64 new)
1059{
1060        instrument_atomic_read_write(v, sizeof(*v));
1061        return arch_atomic64_cmpxchg_acquire(v, old, new);
1062}
1063
1064static __always_inline s64
1065atomic64_cmpxchg_release(atomic64_t *v, s64 old, s64 new)
1066{
1067        instrument_atomic_read_write(v, sizeof(*v));
1068        return arch_atomic64_cmpxchg_release(v, old, new);
1069}
1070
1071static __always_inline s64
1072atomic64_cmpxchg_relaxed(atomic64_t *v, s64 old, s64 new)
1073{
1074        instrument_atomic_read_write(v, sizeof(*v));
1075        return arch_atomic64_cmpxchg_relaxed(v, old, new);
1076}
1077
1078static __always_inline bool
1079atomic64_try_cmpxchg(atomic64_t *v, s64 *old, s64 new)
1080{
1081        instrument_atomic_read_write(v, sizeof(*v));
1082        instrument_atomic_read_write(old, sizeof(*old));
1083        return arch_atomic64_try_cmpxchg(v, old, new);
1084}
1085
1086static __always_inline bool
1087atomic64_try_cmpxchg_acquire(atomic64_t *v, s64 *old, s64 new)
1088{
1089        instrument_atomic_read_write(v, sizeof(*v));
1090        instrument_atomic_read_write(old, sizeof(*old));
1091        return arch_atomic64_try_cmpxchg_acquire(v, old, new);
1092}
1093
1094static __always_inline bool
1095atomic64_try_cmpxchg_release(atomic64_t *v, s64 *old, s64 new)
1096{
1097        instrument_atomic_read_write(v, sizeof(*v));
1098        instrument_atomic_read_write(old, sizeof(*old));
1099        return arch_atomic64_try_cmpxchg_release(v, old, new);
1100}
1101
1102static __always_inline bool
1103atomic64_try_cmpxchg_relaxed(atomic64_t *v, s64 *old, s64 new)
1104{
1105        instrument_atomic_read_write(v, sizeof(*v));
1106        instrument_atomic_read_write(old, sizeof(*old));
1107        return arch_atomic64_try_cmpxchg_relaxed(v, old, new);
1108}
1109
1110static __always_inline bool
1111atomic64_sub_and_test(s64 i, atomic64_t *v)
1112{
1113        instrument_atomic_read_write(v, sizeof(*v));
1114        return arch_atomic64_sub_and_test(i, v);
1115}
1116
1117static __always_inline bool
1118atomic64_dec_and_test(atomic64_t *v)
1119{
1120        instrument_atomic_read_write(v, sizeof(*v));
1121        return arch_atomic64_dec_and_test(v);
1122}
1123
1124static __always_inline bool
1125atomic64_inc_and_test(atomic64_t *v)
1126{
1127        instrument_atomic_read_write(v, sizeof(*v));
1128        return arch_atomic64_inc_and_test(v);
1129}
1130
1131static __always_inline bool
1132atomic64_add_negative(s64 i, atomic64_t *v)
1133{
1134        instrument_atomic_read_write(v, sizeof(*v));
1135        return arch_atomic64_add_negative(i, v);
1136}
1137
1138static __always_inline s64
1139atomic64_fetch_add_unless(atomic64_t *v, s64 a, s64 u)
1140{
1141        instrument_atomic_read_write(v, sizeof(*v));
1142        return arch_atomic64_fetch_add_unless(v, a, u);
1143}
1144
1145static __always_inline bool
1146atomic64_add_unless(atomic64_t *v, s64 a, s64 u)
1147{
1148        instrument_atomic_read_write(v, sizeof(*v));
1149        return arch_atomic64_add_unless(v, a, u);
1150}
1151
1152static __always_inline bool
1153atomic64_inc_not_zero(atomic64_t *v)
1154{
1155        instrument_atomic_read_write(v, sizeof(*v));
1156        return arch_atomic64_inc_not_zero(v);
1157}
1158
1159static __always_inline bool
1160atomic64_inc_unless_negative(atomic64_t *v)
1161{
1162        instrument_atomic_read_write(v, sizeof(*v));
1163        return arch_atomic64_inc_unless_negative(v);
1164}
1165
1166static __always_inline bool
1167atomic64_dec_unless_positive(atomic64_t *v)
1168{
1169        instrument_atomic_read_write(v, sizeof(*v));
1170        return arch_atomic64_dec_unless_positive(v);
1171}
1172
1173static __always_inline s64
1174atomic64_dec_if_positive(atomic64_t *v)
1175{
1176        instrument_atomic_read_write(v, sizeof(*v));
1177        return arch_atomic64_dec_if_positive(v);
1178}
1179
1180static __always_inline long
1181atomic_long_read(const atomic_long_t *v)
1182{
1183        instrument_atomic_read(v, sizeof(*v));
1184        return arch_atomic_long_read(v);
1185}
1186
1187static __always_inline long
1188atomic_long_read_acquire(const atomic_long_t *v)
1189{
1190        instrument_atomic_read(v, sizeof(*v));
1191        return arch_atomic_long_read_acquire(v);
1192}
1193
1194static __always_inline void
1195atomic_long_set(atomic_long_t *v, long i)
1196{
1197        instrument_atomic_write(v, sizeof(*v));
1198        arch_atomic_long_set(v, i);
1199}
1200
1201static __always_inline void
1202atomic_long_set_release(atomic_long_t *v, long i)
1203{
1204        instrument_atomic_write(v, sizeof(*v));
1205        arch_atomic_long_set_release(v, i);
1206}
1207
1208static __always_inline void
1209atomic_long_add(long i, atomic_long_t *v)
1210{
1211        instrument_atomic_read_write(v, sizeof(*v));
1212        arch_atomic_long_add(i, v);
1213}
1214
1215static __always_inline long
1216atomic_long_add_return(long i, atomic_long_t *v)
1217{
1218        instrument_atomic_read_write(v, sizeof(*v));
1219        return arch_atomic_long_add_return(i, v);
1220}
1221
1222static __always_inline long
1223atomic_long_add_return_acquire(long i, atomic_long_t *v)
1224{
1225        instrument_atomic_read_write(v, sizeof(*v));
1226        return arch_atomic_long_add_return_acquire(i, v);
1227}
1228
1229static __always_inline long
1230atomic_long_add_return_release(long i, atomic_long_t *v)
1231{
1232        instrument_atomic_read_write(v, sizeof(*v));
1233        return arch_atomic_long_add_return_release(i, v);
1234}
1235
1236static __always_inline long
1237atomic_long_add_return_relaxed(long i, atomic_long_t *v)
1238{
1239        instrument_atomic_read_write(v, sizeof(*v));
1240        return arch_atomic_long_add_return_relaxed(i, v);
1241}
1242
1243static __always_inline long
1244atomic_long_fetch_add(long i, atomic_long_t *v)
1245{
1246        instrument_atomic_read_write(v, sizeof(*v));
1247        return arch_atomic_long_fetch_add(i, v);
1248}
1249
1250static __always_inline long
1251atomic_long_fetch_add_acquire(long i, atomic_long_t *v)
1252{
1253        instrument_atomic_read_write(v, sizeof(*v));
1254        return arch_atomic_long_fetch_add_acquire(i, v);
1255}
1256
1257static __always_inline long
1258atomic_long_fetch_add_release(long i, atomic_long_t *v)
1259{
1260        instrument_atomic_read_write(v, sizeof(*v));
1261        return arch_atomic_long_fetch_add_release(i, v);
1262}
1263
1264static __always_inline long
1265atomic_long_fetch_add_relaxed(long i, atomic_long_t *v)
1266{
1267        instrument_atomic_read_write(v, sizeof(*v));
1268        return arch_atomic_long_fetch_add_relaxed(i, v);
1269}
1270
1271static __always_inline void
1272atomic_long_sub(long i, atomic_long_t *v)
1273{
1274        instrument_atomic_read_write(v, sizeof(*v));
1275        arch_atomic_long_sub(i, v);
1276}
1277
1278static __always_inline long
1279atomic_long_sub_return(long i, atomic_long_t *v)
1280{
1281        instrument_atomic_read_write(v, sizeof(*v));
1282        return arch_atomic_long_sub_return(i, v);
1283}
1284
1285static __always_inline long
1286atomic_long_sub_return_acquire(long i, atomic_long_t *v)
1287{
1288        instrument_atomic_read_write(v, sizeof(*v));
1289        return arch_atomic_long_sub_return_acquire(i, v);
1290}
1291
1292static __always_inline long
1293atomic_long_sub_return_release(long i, atomic_long_t *v)
1294{
1295        instrument_atomic_read_write(v, sizeof(*v));
1296        return arch_atomic_long_sub_return_release(i, v);
1297}
1298
1299static __always_inline long
1300atomic_long_sub_return_relaxed(long i, atomic_long_t *v)
1301{
1302        instrument_atomic_read_write(v, sizeof(*v));
1303        return arch_atomic_long_sub_return_relaxed(i, v);
1304}
1305
1306static __always_inline long
1307atomic_long_fetch_sub(long i, atomic_long_t *v)
1308{
1309        instrument_atomic_read_write(v, sizeof(*v));
1310        return arch_atomic_long_fetch_sub(i, v);
1311}
1312
1313static __always_inline long
1314atomic_long_fetch_sub_acquire(long i, atomic_long_t *v)
1315{
1316        instrument_atomic_read_write(v, sizeof(*v));
1317        return arch_atomic_long_fetch_sub_acquire(i, v);
1318}
1319
1320static __always_inline long
1321atomic_long_fetch_sub_release(long i, atomic_long_t *v)
1322{
1323        instrument_atomic_read_write(v, sizeof(*v));
1324        return arch_atomic_long_fetch_sub_release(i, v);
1325}
1326
1327static __always_inline long
1328atomic_long_fetch_sub_relaxed(long i, atomic_long_t *v)
1329{
1330        instrument_atomic_read_write(v, sizeof(*v));
1331        return arch_atomic_long_fetch_sub_relaxed(i, v);
1332}
1333
1334static __always_inline void
1335atomic_long_inc(atomic_long_t *v)
1336{
1337        instrument_atomic_read_write(v, sizeof(*v));
1338        arch_atomic_long_inc(v);
1339}
1340
1341static __always_inline long
1342atomic_long_inc_return(atomic_long_t *v)
1343{
1344        instrument_atomic_read_write(v, sizeof(*v));
1345        return arch_atomic_long_inc_return(v);
1346}
1347
1348static __always_inline long
1349atomic_long_inc_return_acquire(atomic_long_t *v)
1350{
1351        instrument_atomic_read_write(v, sizeof(*v));
1352        return arch_atomic_long_inc_return_acquire(v);
1353}
1354
1355static __always_inline long
1356atomic_long_inc_return_release(atomic_long_t *v)
1357{
1358        instrument_atomic_read_write(v, sizeof(*v));
1359        return arch_atomic_long_inc_return_release(v);
1360}
1361
1362static __always_inline long
1363atomic_long_inc_return_relaxed(atomic_long_t *v)
1364{
1365        instrument_atomic_read_write(v, sizeof(*v));
1366        return arch_atomic_long_inc_return_relaxed(v);
1367}
1368
1369static __always_inline long
1370atomic_long_fetch_inc(atomic_long_t *v)
1371{
1372        instrument_atomic_read_write(v, sizeof(*v));
1373        return arch_atomic_long_fetch_inc(v);
1374}
1375
1376static __always_inline long
1377atomic_long_fetch_inc_acquire(atomic_long_t *v)
1378{
1379        instrument_atomic_read_write(v, sizeof(*v));
1380        return arch_atomic_long_fetch_inc_acquire(v);
1381}
1382
1383static __always_inline long
1384atomic_long_fetch_inc_release(atomic_long_t *v)
1385{
1386        instrument_atomic_read_write(v, sizeof(*v));
1387        return arch_atomic_long_fetch_inc_release(v);
1388}
1389
1390static __always_inline long
1391atomic_long_fetch_inc_relaxed(atomic_long_t *v)
1392{
1393        instrument_atomic_read_write(v, sizeof(*v));
1394        return arch_atomic_long_fetch_inc_relaxed(v);
1395}
1396
1397static __always_inline void
1398atomic_long_dec(atomic_long_t *v)
1399{
1400        instrument_atomic_read_write(v, sizeof(*v));
1401        arch_atomic_long_dec(v);
1402}
1403
1404static __always_inline long
1405atomic_long_dec_return(atomic_long_t *v)
1406{
1407        instrument_atomic_read_write(v, sizeof(*v));
1408        return arch_atomic_long_dec_return(v);
1409}
1410
1411static __always_inline long
1412atomic_long_dec_return_acquire(atomic_long_t *v)
1413{
1414        instrument_atomic_read_write(v, sizeof(*v));
1415        return arch_atomic_long_dec_return_acquire(v);
1416}
1417
1418static __always_inline long
1419atomic_long_dec_return_release(atomic_long_t *v)
1420{
1421        instrument_atomic_read_write(v, sizeof(*v));
1422        return arch_atomic_long_dec_return_release(v);
1423}
1424
1425static __always_inline long
1426atomic_long_dec_return_relaxed(atomic_long_t *v)
1427{
1428        instrument_atomic_read_write(v, sizeof(*v));
1429        return arch_atomic_long_dec_return_relaxed(v);
1430}
1431
1432static __always_inline long
1433atomic_long_fetch_dec(atomic_long_t *v)
1434{
1435        instrument_atomic_read_write(v, sizeof(*v));
1436        return arch_atomic_long_fetch_dec(v);
1437}
1438
1439static __always_inline long
1440atomic_long_fetch_dec_acquire(atomic_long_t *v)
1441{
1442        instrument_atomic_read_write(v, sizeof(*v));
1443        return arch_atomic_long_fetch_dec_acquire(v);
1444}
1445
1446static __always_inline long
1447atomic_long_fetch_dec_release(atomic_long_t *v)
1448{
1449        instrument_atomic_read_write(v, sizeof(*v));
1450        return arch_atomic_long_fetch_dec_release(v);
1451}
1452
1453static __always_inline long
1454atomic_long_fetch_dec_relaxed(atomic_long_t *v)
1455{
1456        instrument_atomic_read_write(v, sizeof(*v));
1457        return arch_atomic_long_fetch_dec_relaxed(v);
1458}
1459
1460static __always_inline void
1461atomic_long_and(long i, atomic_long_t *v)
1462{
1463        instrument_atomic_read_write(v, sizeof(*v));
1464        arch_atomic_long_and(i, v);
1465}
1466
1467static __always_inline long
1468atomic_long_fetch_and(long i, atomic_long_t *v)
1469{
1470        instrument_atomic_read_write(v, sizeof(*v));
1471        return arch_atomic_long_fetch_and(i, v);
1472}
1473
1474static __always_inline long
1475atomic_long_fetch_and_acquire(long i, atomic_long_t *v)
1476{
1477        instrument_atomic_read_write(v, sizeof(*v));
1478        return arch_atomic_long_fetch_and_acquire(i, v);
1479}
1480
1481static __always_inline long
1482atomic_long_fetch_and_release(long i, atomic_long_t *v)
1483{
1484        instrument_atomic_read_write(v, sizeof(*v));
1485        return arch_atomic_long_fetch_and_release(i, v);
1486}
1487
1488static __always_inline long
1489atomic_long_fetch_and_relaxed(long i, atomic_long_t *v)
1490{
1491        instrument_atomic_read_write(v, sizeof(*v));
1492        return arch_atomic_long_fetch_and_relaxed(i, v);
1493}
1494
1495static __always_inline void
1496atomic_long_andnot(long i, atomic_long_t *v)
1497{
1498        instrument_atomic_read_write(v, sizeof(*v));
1499        arch_atomic_long_andnot(i, v);
1500}
1501
1502static __always_inline long
1503atomic_long_fetch_andnot(long i, atomic_long_t *v)
1504{
1505        instrument_atomic_read_write(v, sizeof(*v));
1506        return arch_atomic_long_fetch_andnot(i, v);
1507}
1508
1509static __always_inline long
1510atomic_long_fetch_andnot_acquire(long i, atomic_long_t *v)
1511{
1512        instrument_atomic_read_write(v, sizeof(*v));
1513        return arch_atomic_long_fetch_andnot_acquire(i, v);
1514}
1515
1516static __always_inline long
1517atomic_long_fetch_andnot_release(long i, atomic_long_t *v)
1518{
1519        instrument_atomic_read_write(v, sizeof(*v));
1520        return arch_atomic_long_fetch_andnot_release(i, v);
1521}
1522
1523static __always_inline long
1524atomic_long_fetch_andnot_relaxed(long i, atomic_long_t *v)
1525{
1526        instrument_atomic_read_write(v, sizeof(*v));
1527        return arch_atomic_long_fetch_andnot_relaxed(i, v);
1528}
1529
1530static __always_inline void
1531atomic_long_or(long i, atomic_long_t *v)
1532{
1533        instrument_atomic_read_write(v, sizeof(*v));
1534        arch_atomic_long_or(i, v);
1535}
1536
1537static __always_inline long
1538atomic_long_fetch_or(long i, atomic_long_t *v)
1539{
1540        instrument_atomic_read_write(v, sizeof(*v));
1541        return arch_atomic_long_fetch_or(i, v);
1542}
1543
1544static __always_inline long
1545atomic_long_fetch_or_acquire(long i, atomic_long_t *v)
1546{
1547        instrument_atomic_read_write(v, sizeof(*v));
1548        return arch_atomic_long_fetch_or_acquire(i, v);
1549}
1550
1551static __always_inline long
1552atomic_long_fetch_or_release(long i, atomic_long_t *v)
1553{
1554        instrument_atomic_read_write(v, sizeof(*v));
1555        return arch_atomic_long_fetch_or_release(i, v);
1556}
1557
1558static __always_inline long
1559atomic_long_fetch_or_relaxed(long i, atomic_long_t *v)
1560{
1561        instrument_atomic_read_write(v, sizeof(*v));
1562        return arch_atomic_long_fetch_or_relaxed(i, v);
1563}
1564
1565static __always_inline void
1566atomic_long_xor(long i, atomic_long_t *v)
1567{
1568        instrument_atomic_read_write(v, sizeof(*v));
1569        arch_atomic_long_xor(i, v);
1570}
1571
1572static __always_inline long
1573atomic_long_fetch_xor(long i, atomic_long_t *v)
1574{
1575        instrument_atomic_read_write(v, sizeof(*v));
1576        return arch_atomic_long_fetch_xor(i, v);
1577}
1578
1579static __always_inline long
1580atomic_long_fetch_xor_acquire(long i, atomic_long_t *v)
1581{
1582        instrument_atomic_read_write(v, sizeof(*v));
1583        return arch_atomic_long_fetch_xor_acquire(i, v);
1584}
1585
1586static __always_inline long
1587atomic_long_fetch_xor_release(long i, atomic_long_t *v)
1588{
1589        instrument_atomic_read_write(v, sizeof(*v));
1590        return arch_atomic_long_fetch_xor_release(i, v);
1591}
1592
1593static __always_inline long
1594atomic_long_fetch_xor_relaxed(long i, atomic_long_t *v)
1595{
1596        instrument_atomic_read_write(v, sizeof(*v));
1597        return arch_atomic_long_fetch_xor_relaxed(i, v);
1598}
1599
1600static __always_inline long
1601atomic_long_xchg(atomic_long_t *v, long i)
1602{
1603        instrument_atomic_read_write(v, sizeof(*v));
1604        return arch_atomic_long_xchg(v, i);
1605}
1606
1607static __always_inline long
1608atomic_long_xchg_acquire(atomic_long_t *v, long i)
1609{
1610        instrument_atomic_read_write(v, sizeof(*v));
1611        return arch_atomic_long_xchg_acquire(v, i);
1612}
1613
1614static __always_inline long
1615atomic_long_xchg_release(atomic_long_t *v, long i)
1616{
1617        instrument_atomic_read_write(v, sizeof(*v));
1618        return arch_atomic_long_xchg_release(v, i);
1619}
1620
1621static __always_inline long
1622atomic_long_xchg_relaxed(atomic_long_t *v, long i)
1623{
1624        instrument_atomic_read_write(v, sizeof(*v));
1625        return arch_atomic_long_xchg_relaxed(v, i);
1626}
1627
1628static __always_inline long
1629atomic_long_cmpxchg(atomic_long_t *v, long old, long new)
1630{
1631        instrument_atomic_read_write(v, sizeof(*v));
1632        return arch_atomic_long_cmpxchg(v, old, new);
1633}
1634
1635static __always_inline long
1636atomic_long_cmpxchg_acquire(atomic_long_t *v, long old, long new)
1637{
1638        instrument_atomic_read_write(v, sizeof(*v));
1639        return arch_atomic_long_cmpxchg_acquire(v, old, new);
1640}
1641
1642static __always_inline long
1643atomic_long_cmpxchg_release(atomic_long_t *v, long old, long new)
1644{
1645        instrument_atomic_read_write(v, sizeof(*v));
1646        return arch_atomic_long_cmpxchg_release(v, old, new);
1647}
1648
1649static __always_inline long
1650atomic_long_cmpxchg_relaxed(atomic_long_t *v, long old, long new)
1651{
1652        instrument_atomic_read_write(v, sizeof(*v));
1653        return arch_atomic_long_cmpxchg_relaxed(v, old, new);
1654}
1655
1656static __always_inline bool
1657atomic_long_try_cmpxchg(atomic_long_t *v, long *old, long new)
1658{
1659        instrument_atomic_read_write(v, sizeof(*v));
1660        instrument_atomic_read_write(old, sizeof(*old));
1661        return arch_atomic_long_try_cmpxchg(v, old, new);
1662}
1663
1664static __always_inline bool
1665atomic_long_try_cmpxchg_acquire(atomic_long_t *v, long *old, long new)
1666{
1667        instrument_atomic_read_write(v, sizeof(*v));
1668        instrument_atomic_read_write(old, sizeof(*old));
1669        return arch_atomic_long_try_cmpxchg_acquire(v, old, new);
1670}
1671
1672static __always_inline bool
1673atomic_long_try_cmpxchg_release(atomic_long_t *v, long *old, long new)
1674{
1675        instrument_atomic_read_write(v, sizeof(*v));
1676        instrument_atomic_read_write(old, sizeof(*old));
1677        return arch_atomic_long_try_cmpxchg_release(v, old, new);
1678}
1679
1680static __always_inline bool
1681atomic_long_try_cmpxchg_relaxed(atomic_long_t *v, long *old, long new)
1682{
1683        instrument_atomic_read_write(v, sizeof(*v));
1684        instrument_atomic_read_write(old, sizeof(*old));
1685        return arch_atomic_long_try_cmpxchg_relaxed(v, old, new);
1686}
1687
1688static __always_inline bool
1689atomic_long_sub_and_test(long i, atomic_long_t *v)
1690{
1691        instrument_atomic_read_write(v, sizeof(*v));
1692        return arch_atomic_long_sub_and_test(i, v);
1693}
1694
1695static __always_inline bool
1696atomic_long_dec_and_test(atomic_long_t *v)
1697{
1698        instrument_atomic_read_write(v, sizeof(*v));
1699        return arch_atomic_long_dec_and_test(v);
1700}
1701
1702static __always_inline bool
1703atomic_long_inc_and_test(atomic_long_t *v)
1704{
1705        instrument_atomic_read_write(v, sizeof(*v));
1706        return arch_atomic_long_inc_and_test(v);
1707}
1708
1709static __always_inline bool
1710atomic_long_add_negative(long i, atomic_long_t *v)
1711{
1712        instrument_atomic_read_write(v, sizeof(*v));
1713        return arch_atomic_long_add_negative(i, v);
1714}
1715
1716static __always_inline long
1717atomic_long_fetch_add_unless(atomic_long_t *v, long a, long u)
1718{
1719        instrument_atomic_read_write(v, sizeof(*v));
1720        return arch_atomic_long_fetch_add_unless(v, a, u);
1721}
1722
1723static __always_inline bool
1724atomic_long_add_unless(atomic_long_t *v, long a, long u)
1725{
1726        instrument_atomic_read_write(v, sizeof(*v));
1727        return arch_atomic_long_add_unless(v, a, u);
1728}
1729
1730static __always_inline bool
1731atomic_long_inc_not_zero(atomic_long_t *v)
1732{
1733        instrument_atomic_read_write(v, sizeof(*v));
1734        return arch_atomic_long_inc_not_zero(v);
1735}
1736
1737static __always_inline bool
1738atomic_long_inc_unless_negative(atomic_long_t *v)
1739{
1740        instrument_atomic_read_write(v, sizeof(*v));
1741        return arch_atomic_long_inc_unless_negative(v);
1742}
1743
1744static __always_inline bool
1745atomic_long_dec_unless_positive(atomic_long_t *v)
1746{
1747        instrument_atomic_read_write(v, sizeof(*v));
1748        return arch_atomic_long_dec_unless_positive(v);
1749}
1750
1751static __always_inline long
1752atomic_long_dec_if_positive(atomic_long_t *v)
1753{
1754        instrument_atomic_read_write(v, sizeof(*v));
1755        return arch_atomic_long_dec_if_positive(v);
1756}
1757
1758#define xchg(ptr, ...) \
1759({ \
1760        typeof(ptr) __ai_ptr = (ptr); \
1761        instrument_atomic_write(__ai_ptr, sizeof(*__ai_ptr)); \
1762        arch_xchg(__ai_ptr, __VA_ARGS__); \
1763})
1764
1765#define xchg_acquire(ptr, ...) \
1766({ \
1767        typeof(ptr) __ai_ptr = (ptr); \
1768        instrument_atomic_write(__ai_ptr, sizeof(*__ai_ptr)); \
1769        arch_xchg_acquire(__ai_ptr, __VA_ARGS__); \
1770})
1771
1772#define xchg_release(ptr, ...) \
1773({ \
1774        typeof(ptr) __ai_ptr = (ptr); \
1775        instrument_atomic_write(__ai_ptr, sizeof(*__ai_ptr)); \
1776        arch_xchg_release(__ai_ptr, __VA_ARGS__); \
1777})
1778
1779#define xchg_relaxed(ptr, ...) \
1780({ \
1781        typeof(ptr) __ai_ptr = (ptr); \
1782        instrument_atomic_write(__ai_ptr, sizeof(*__ai_ptr)); \
1783        arch_xchg_relaxed(__ai_ptr, __VA_ARGS__); \
1784})
1785
1786#define cmpxchg(ptr, ...) \
1787({ \
1788        typeof(ptr) __ai_ptr = (ptr); \
1789        instrument_atomic_write(__ai_ptr, sizeof(*__ai_ptr)); \
1790        arch_cmpxchg(__ai_ptr, __VA_ARGS__); \
1791})
1792
1793#define cmpxchg_acquire(ptr, ...) \
1794({ \
1795        typeof(ptr) __ai_ptr = (ptr); \
1796        instrument_atomic_write(__ai_ptr, sizeof(*__ai_ptr)); \
1797        arch_cmpxchg_acquire(__ai_ptr, __VA_ARGS__); \
1798})
1799
1800#define cmpxchg_release(ptr, ...) \
1801({ \
1802        typeof(ptr) __ai_ptr = (ptr); \
1803        instrument_atomic_write(__ai_ptr, sizeof(*__ai_ptr)); \
1804        arch_cmpxchg_release(__ai_ptr, __VA_ARGS__); \
1805})
1806
1807#define cmpxchg_relaxed(ptr, ...) \
1808({ \
1809        typeof(ptr) __ai_ptr = (ptr); \
1810        instrument_atomic_write(__ai_ptr, sizeof(*__ai_ptr)); \
1811        arch_cmpxchg_relaxed(__ai_ptr, __VA_ARGS__); \
1812})
1813
1814#define cmpxchg64(ptr, ...) \
1815({ \
1816        typeof(ptr) __ai_ptr = (ptr); \
1817        instrument_atomic_write(__ai_ptr, sizeof(*__ai_ptr)); \
1818        arch_cmpxchg64(__ai_ptr, __VA_ARGS__); \
1819})
1820
1821#define cmpxchg64_acquire(ptr, ...) \
1822({ \
1823        typeof(ptr) __ai_ptr = (ptr); \
1824        instrument_atomic_write(__ai_ptr, sizeof(*__ai_ptr)); \
1825        arch_cmpxchg64_acquire(__ai_ptr, __VA_ARGS__); \
1826})
1827
1828#define cmpxchg64_release(ptr, ...) \
1829({ \
1830        typeof(ptr) __ai_ptr = (ptr); \
1831        instrument_atomic_write(__ai_ptr, sizeof(*__ai_ptr)); \
1832        arch_cmpxchg64_release(__ai_ptr, __VA_ARGS__); \
1833})
1834
1835#define cmpxchg64_relaxed(ptr, ...) \
1836({ \
1837        typeof(ptr) __ai_ptr = (ptr); \
1838        instrument_atomic_write(__ai_ptr, sizeof(*__ai_ptr)); \
1839        arch_cmpxchg64_relaxed(__ai_ptr, __VA_ARGS__); \
1840})
1841
1842#define try_cmpxchg(ptr, oldp, ...) \
1843({ \
1844        typeof(ptr) __ai_ptr = (ptr); \
1845        typeof(oldp) __ai_oldp = (oldp); \
1846        instrument_atomic_write(__ai_ptr, sizeof(*__ai_ptr)); \
1847        instrument_atomic_write(__ai_oldp, sizeof(*__ai_oldp)); \
1848        arch_try_cmpxchg(__ai_ptr, __ai_oldp, __VA_ARGS__); \
1849})
1850
1851#define try_cmpxchg_acquire(ptr, oldp, ...) \
1852({ \
1853        typeof(ptr) __ai_ptr = (ptr); \
1854        typeof(oldp) __ai_oldp = (oldp); \
1855        instrument_atomic_write(__ai_ptr, sizeof(*__ai_ptr)); \
1856        instrument_atomic_write(__ai_oldp, sizeof(*__ai_oldp)); \
1857        arch_try_cmpxchg_acquire(__ai_ptr, __ai_oldp, __VA_ARGS__); \
1858})
1859
1860#define try_cmpxchg_release(ptr, oldp, ...) \
1861({ \
1862        typeof(ptr) __ai_ptr = (ptr); \
1863        typeof(oldp) __ai_oldp = (oldp); \
1864        instrument_atomic_write(__ai_ptr, sizeof(*__ai_ptr)); \
1865        instrument_atomic_write(__ai_oldp, sizeof(*__ai_oldp)); \
1866        arch_try_cmpxchg_release(__ai_ptr, __ai_oldp, __VA_ARGS__); \
1867})
1868
1869#define try_cmpxchg_relaxed(ptr, oldp, ...) \
1870({ \
1871        typeof(ptr) __ai_ptr = (ptr); \
1872        typeof(oldp) __ai_oldp = (oldp); \
1873        instrument_atomic_write(__ai_ptr, sizeof(*__ai_ptr)); \
1874        instrument_atomic_write(__ai_oldp, sizeof(*__ai_oldp)); \
1875        arch_try_cmpxchg_relaxed(__ai_ptr, __ai_oldp, __VA_ARGS__); \
1876})
1877
1878#define cmpxchg_local(ptr, ...) \
1879({ \
1880        typeof(ptr) __ai_ptr = (ptr); \
1881        instrument_atomic_write(__ai_ptr, sizeof(*__ai_ptr)); \
1882        arch_cmpxchg_local(__ai_ptr, __VA_ARGS__); \
1883})
1884
1885#define cmpxchg64_local(ptr, ...) \
1886({ \
1887        typeof(ptr) __ai_ptr = (ptr); \
1888        instrument_atomic_write(__ai_ptr, sizeof(*__ai_ptr)); \
1889        arch_cmpxchg64_local(__ai_ptr, __VA_ARGS__); \
1890})
1891
1892#define sync_cmpxchg(ptr, ...) \
1893({ \
1894        typeof(ptr) __ai_ptr = (ptr); \
1895        instrument_atomic_write(__ai_ptr, sizeof(*__ai_ptr)); \
1896        arch_sync_cmpxchg(__ai_ptr, __VA_ARGS__); \
1897})
1898
1899#define cmpxchg_double(ptr, ...) \
1900({ \
1901        typeof(ptr) __ai_ptr = (ptr); \
1902        instrument_atomic_write(__ai_ptr, 2 * sizeof(*__ai_ptr)); \
1903        arch_cmpxchg_double(__ai_ptr, __VA_ARGS__); \
1904})
1905
1906
1907#define cmpxchg_double_local(ptr, ...) \
1908({ \
1909        typeof(ptr) __ai_ptr = (ptr); \
1910        instrument_atomic_write(__ai_ptr, 2 * sizeof(*__ai_ptr)); \
1911        arch_cmpxchg_double_local(__ai_ptr, __VA_ARGS__); \
1912})
1913
1914#endif /* _LINUX_ATOMIC_INSTRUMENTED_H */
1915// 2a9553f0a9d5619f19151092df5cabbbf16ce835
1916