locking changes for v4.11
Subsystems (58)
Linus,
Please pull the latest locking-core-for-linus git tree from:
git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git locking-core-for-linus
# HEAD: bc88c10d7e6900916f5e1ba3829d66a9de92b633 locking/spinlock/debug: Remove spinlock lockup detection code
The main changes in this cycle were:
- Implement wraparound-safe refcount_t and kref_t types based on generic atomic primitives (Peter Zijlstra)
- Improve and fix the ww_mutex code (Nicolai Hähnle)
- Add self-tests to the ww_mutex code (Chris Wilson)
- Optimize percpu-rwsems with the 'rcuwait' mechanism (Davidlohr Bueso)
- Micro-optimize the current-task logic all around the core kernel (Davidlohr Bueso)
- Tidy up after recent optimizations: remove stale code and APIs, clean up the code (Waiman Long)
- ... plus misc fixes, updates and cleanups.
Thanks,
Ingo
------------------>
Andy Shevchenko (1):
locking/jump_labels: Update bug_at() boot message
Byungchul Park (1):
lockdep: Fix incorrect condition to print bug msgs for MAX_LOCKDEP_CHAIN_HLOCKS
Chris Wilson (8):
locking/ww_mutex: Fix compilation of __WW_MUTEX_INITIALIZER locking/ww_mutex: Add ww_mutex to locktorture test locking/ww_mutex: Begin kselftests for ww_mutex locking/ww_mutex: Add kselftests for ww_mutex AA deadlock detection locking/ww_mutex: Add kselftests for ww_mutex ABBA deadlock detection locking/ww_mutex: Add kselftests for resolving ww_mutex cyclic deadlocks locking/ww_mutex: Add kselftests for ww_mutex stress locking/ww_mutex: Add ww_mutex to tools/testing/selftests
Davidlohr Bueso (8):
kernel/exit: Compute 'current' directly drivers/tty: Compute 'current' directly kernel/locking: Compute 'current' directly sched/core: Remove set_task_state() sched/wait, RCU: Introduce rcuwait machinery locking/percpu-rwsem: Replace waitqueue with rcuwait sched/wait, rcuwait: Fix typo in comment sched/wake_q: Clarify queue reinit comment
Ingo Molnar (1):
locking/ww_mutex: Turn off __must_check for now
Kees Cook (1):
lkdtm: Convert to refcount_t testing
Luis R. Rodriguez (1):
jump_labels: Move header guard #endif down where it belongs
Nicolai Hähnle (10):
locking/ww_mutex: Extract stamp comparison to __ww_mutex_stamp_after() locking/ww_mutex: Set use_ww_ctx even when locking without a context locking/ww_mutex: Remove the __ww_mutex_lock*() inline wrappers
locking/ww_mutex: Add waiters in stamp order
locking/ww_mutex: Notify waiters that have to back off while adding tasks to wait list locking/ww_mutex: Optimize ww-mutexes by waking at most one waiter for backoff when acquiring the lock locking/ww_mutex: Re-check ww->ctx in the inner optimistic spin loop locking/ww_mutex: Optimize ww-mutexes by yielding to other waiters from optimistic spin locking/mutex: Initialize mutex_waiter::ww_ctx with poison when debugging locking/ww_mutex/Documentation: Update the design document
Pan Xinhui (1):
locking/pvqspinlock: Don't wait if vCPU is preempted
Peter Zijlstra (11):
locking/mutex: Fix mutex handoff locking/mutex: Improve inlining locking/atomic, kref: Add KREF_INIT() locking/atomic, kref: Add kref_read() locking/atomic, kref: Kill kref_sub() locking/atomic, kref: Use kref_get_unless_zero() more locking/atomic, kref: Avoid more abuse locking/atomic, kref: Implement kref_put_lock() locking/mutex: Fix lockdep_assert_held() fail
refcount_t: Introduce a special purpose refcount type
kref: Implement 'struct kref' using refcount_t
Steven Rostedt (VMware) (1):
locking/rtmutex: Flip unlikely() branch to likely() in __rt_mutex_slowlock()
Waiman Long (5):
locking/spinlocks: Remove the unused spin_lock_bh_nested() API locking/spinlocks/x86, paravirt: Remove paravirt_ticketlocks_enabled locking/rwsem: Remove unnecessary atomic_long_t casts locking/rwsem: Reinit wake_q after use locking/spinlock/debug: Remove spinlock lockup detection code
Documentation/locking/ww-mutex-design.txt | 12 +- arch/um/drivers/random.c | 2 +- arch/x86/include/asm/spinlock.h | 3 - arch/x86/kernel/jump_label.c | 3 +- arch/x86/kernel/kvm.c | 14 - arch/x86/kernel/paravirt-spinlocks.c | 3 - arch/x86/xen/spinlock.c | 19 - drivers/block/drbd/drbd_bitmap.c | 2 +- drivers/block/drbd/drbd_main.c | 7 +- drivers/block/drbd/drbd_req.c | 31 +- drivers/block/rbd.c | 8 +- drivers/block/virtio_blk.c | 2 +- drivers/gpu/drm/drm_gem_cma_helper.c | 2 +- drivers/gpu/drm/drm_info.c | 2 +- drivers/gpu/drm/drm_mode_object.c | 4 +- drivers/gpu/drm/etnaviv/etnaviv_gem.c | 2 +- drivers/gpu/drm/i915/i915_gem_object.h | 2 +- drivers/gpu/drm/msm/msm_gem.c | 2 +- drivers/gpu/drm/nouveau/nouveau_fence.c | 2 +- drivers/gpu/drm/omapdrm/omap_gem.c | 2 +- drivers/gpu/drm/ttm/ttm_bo.c | 63 +- drivers/gpu/drm/ttm/ttm_execbuf_util.c | 4 +- drivers/gpu/drm/ttm/ttm_object.c | 2 +- drivers/infiniband/hw/cxgb3/iwch_cm.h | 6 +- drivers/infiniband/hw/cxgb3/iwch_qp.c | 2 +- drivers/infiniband/hw/cxgb4/iw_cxgb4.h | 6 +- drivers/infiniband/hw/cxgb4/qp.c | 2 +- drivers/infiniband/hw/usnic/usnic_ib_sysfs.c | 6 +- drivers/infiniband/hw/usnic/usnic_ib_verbs.c | 4 +- drivers/md/dm-bufio.c | 2 +- drivers/md/dm-crypt.c | 4 +- drivers/md/persistent-data/dm-block-manager.c | 4 +- drivers/misc/genwqe/card_dev.c | 2 +- drivers/misc/lkdtm.h | 8 +- drivers/misc/lkdtm_bugs.c | 87 ++- drivers/misc/lkdtm_core.c | 8 +- drivers/misc/mei/debugfs.c | 2 +- drivers/pci/hotplug/pnv_php.c | 2 +- drivers/pci/slot.c | 2 +- drivers/scsi/bnx2fc/bnx2fc_io.c | 8 +- drivers/scsi/cxgbi/libcxgbi.h | 4 +- drivers/scsi/lpfc/lpfc_debugfs.c | 2 +- drivers/scsi/lpfc/lpfc_els.c | 2 +- drivers/scsi/lpfc/lpfc_hbadisc.c | 40 +- drivers/scsi/lpfc/lpfc_init.c | 3 +- drivers/scsi/qla2xxx/tcm_qla2xxx.c | 4 +- drivers/staging/android/ion/ion.c | 2 +- drivers/staging/comedi/comedi_buf.c | 2 +- .../staging/lustre/lnet/libcfs/linux/linux-debug.c | 2 +- drivers/target/target_core_pr.c | 10 +- drivers/target/tcm_fc/tfc_sess.c | 2 +- drivers/tty/tty_ldsem.c | 18 +- drivers/usb/gadget/function/f_fs.c | 2 +- drivers/usb/mon/mon_main.c | 2 +- fs/exofs/sys.c | 2 +- fs/fuse/fuse_i.h | 2 +- fs/ocfs2/cluster/netdebug.c | 2 +- fs/ocfs2/cluster/tcp.c | 2 +- fs/ocfs2/dlm/dlmdebug.c | 12 +- fs/ocfs2/dlm/dlmdomain.c | 2 +- fs/ocfs2/dlm/dlmmaster.c | 8 +- fs/ocfs2/dlm/dlmunlock.c | 2 +- include/asm-generic/rwsem.h | 13 +- include/drm/drm_framebuffer.h | 2 +- include/drm/ttm/ttm_bo_api.h | 15 +- include/drm/ttm/ttm_bo_driver.h | 4 +- include/linux/jump_label.h | 4 +- include/linux/kref.h | 78 +-- include/linux/mutex.h | 5 +- include/linux/percpu-rwsem.h | 8 +- include/linux/poison.h | 1 + include/linux/rcuwait.h | 63 ++ include/linux/refcount.h | 294 ++++++++++ include/linux/sched.h | 37 +- include/linux/spinlock.h | 8 - include/linux/spinlock_api_smp.h | 2 - include/linux/spinlock_api_up.h | 1 - include/linux/sunrpc/cache.h | 2 +- include/linux/ww_mutex.h | 32 +- include/net/bluetooth/hci_core.h | 4 +- init/version.c | 4 +- kernel/exit.c | 52 +- kernel/fork.c | 6 +- kernel/locking/Makefile | 1 + kernel/locking/lockdep.c | 2 +- kernel/locking/locktorture.c | 73 +++ kernel/locking/mutex-debug.h | 17 - kernel/locking/mutex.c | 516 ++++++++++------ kernel/locking/mutex.h | 4 - kernel/locking/percpu-rwsem.c | 7 +- kernel/locking/qspinlock_paravirt.h | 2 +- kernel/locking/rtmutex.c | 2 +- kernel/locking/rwsem-spinlock.c | 18 +- kernel/locking/rwsem-xadd.c | 14 +- kernel/locking/semaphore.c | 7 +- kernel/locking/spinlock.c | 8 - kernel/locking/spinlock_debug.c | 86 +-- kernel/locking/test-ww_mutex.c | 646 +++++++++++++++++++++ kernel/pid.c | 4 +- lib/Kconfig.debug | 25 + net/bluetooth/6lowpan.c | 2 +- net/bluetooth/a2mp.c | 4 +- net/bluetooth/amp.c | 4 +- net/bluetooth/l2cap_core.c | 4 +- net/ceph/messenger.c | 4 +- net/ceph/osd_client.c | 10 +- net/sunrpc/cache.c | 2 +- net/sunrpc/svc_xprt.c | 6 +- net/sunrpc/svcauth.c | 15 +- net/sunrpc/xprtrdma/svc_rdma_transport.c | 4 +- security/apparmor/include/apparmor.h | 6 - security/apparmor/include/policy.h | 4 +- tools/testing/selftests/locking/ww_mutex.sh | 10 + .../selftests/rcutorture/configs/lock/CFLIST | 1 + .../selftests/rcutorture/configs/lock/LOCK07 | 6 + .../selftests/rcutorture/configs/lock/LOCK07.boot | 1 + 116 files changed, 1864 insertions(+), 761 deletions(-) create mode 100644 include/linux/rcuwait.h create mode 100644 include/linux/refcount.h create mode 100644 kernel/locking/test-ww_mutex.c create mode 100644 tools/testing/selftests/locking/ww_mutex.sh create mode 100644 tools/testing/selftests/rcutorture/configs/lock/LOCK07 create mode 100644 tools/testing/selftests/rcutorture/configs/lock/LOCK07.boot
Documentation/locking/ww-mutex-design.txt +8 -4
@@ -309,11 +309,15 @@ Implementation Details normal mutex locks, which are far more common. As such there is only a small increase in code size if wait/wound mutexes are not used. + We maintain the following invariants for the wait list: + (1) Waiters with an acquire context are sorted by stamp order; waiters + without an acquire context are interspersed in FIFO order. + (2) Among waiters with contexts, only the first one can have other locks + acquired already (ctx->acquired > 0). Note that this waiter may come + after other waiters without contexts in the list. + In general, not much contention is expected. The locks are typically used to - serialize access to resources for devices. The only way to make wakeups - smarter would be at the cost of adding a field to struct mutex_waiter. This - would add overhead to all cases where normal mutexes are used, and - ww_mutexes are generally less performance sensitive. + serialize access to resources for devices. Lockdep: Special care has been taken to warn for as many cases of api abuse
arch/um/drivers/random.c +1 -1
@@ -76,7 +76,7 @@ static ssize_t rng_dev_read (struct file *filp, char __user *buf, size_t size,add_sigio_fd (random_fd);add_wait_queue (&host_read_wait, &wait); -set_task_state (current,TASK_INTERRUPTIBLE ); +set_current_state (TASK_INTERRUPTIBLE );schedule ();remove_wait_queue (&host_read_wait, &wait);
arch/x86/include/asm/spinlock.h +0 -3
@@ -23,9 +23,6 @@/* How long a lock should spin before we consider blocking */ #define SPIN_THRESHOLD (1 << 15) -extern struct static_key paravirt_ticketlocks_enabled; -static __always_inline bool static_key_false(struct static_key *key); -#include <asm/qspinlock.h> /*
arch/x86/kernel/jump_label.c +1 -2
@@ -32,8 +32,7 @@ static void bug_at(unsigned char *ip, int line)* Something went wrong. Crash the box, as something could be * corrupting the kernel. */ -pr_warning ("Unexpected op at %pS [%p] (%02x %02x %02x %02x %02x) %s:%d\n" , - ip, ip, ip[0 ], ip[1 ], ip[2 ], ip[3 ], ip[4 ], __FILE__, line); +pr_crit ("jump_label: Fatal kernel bug, unexpected op at %pS [%p] (%5ph) %d\n" , ip, ip, ip, line);BUG (); }
arch/x86/kernel/kvm.c +0 -14
@@ -620,18 +620,4 @@ void __init kvm_spinlock_init(void) } } -static __init int kvm_spinlock_init_jump (void ) -{ -if (!kvm_para_available ()) -return 0 ; -if (!kvm_para_has_feature (KVM_FEATURE_PV_UNHALT )) -return 0 ; - -static_key_slow_inc (¶virt_ticketlocks_enabled); -printk (KERN_INFO "KVM setup paravirtual spinlock\n" ); - -return 0 ; -} -early_initcall (kvm_spinlock_init_jump); -#endif /* CONFIG_PARAVIRT_SPINLOCKS */
arch/x86/kernel/paravirt-spinlocks.c +0 -3
@@ -42,6 +42,3 @@ struct pv_lock_ops pv_lock_ops = {#endif /* SMP */ };EXPORT_SYMBOL (pv_lock_ops); - -struct static_key paravirt_ticketlocks_enabled =STATIC_KEY_INIT_FALSE ; -EXPORT_SYMBOL (paravirt_ticketlocks_enabled);
arch/x86/xen/spinlock.c +0 -19
@@ -141,25 +141,6 @@ void __init xen_init_spinlocks(void) pv_lock_ops.vcpu_is_preempted =PV_CALLEE_SAVE (xen_vcpu_stolen); } -/* -* While the jump_label init code needs to happend _after_ the jump labels are -* enabled and before SMP is started. Hence we use pre-SMP initcall level -* init. We cannot do it in xen_init_spinlocks as that is done before -* jump labels are activated. -*/ -static __init int xen_init_spinlocks_jump (void ) -{ -if (!xen_pvspin) -return 0 ; - -if (!xen_domain ()) -return 0 ; - -static_key_slow_inc (¶virt_ticketlocks_enabled); -return 0 ; -} -early_initcall (xen_init_spinlocks_jump); -static __init int xen_parse_nopvspin (char *arg) { xen_pvspin = false;
drivers/block/drbd/drbd_bitmap.c +1 -1
@@ -1070,7 +1070,7 @@ static int bm_rw(struct drbd_device *device, const unsigned int flags, unsigned .done = 0, .flags = flags, .error = 0, - .kref = { ATOMIC_INIT(2) }, + .kref = KREF_INIT(2), };if (!get_ldev_if_state (device,D_ATTACHING )) {/* put is in drbd_bm_aio_ctx_destroy() */
drivers/block/drbd/drbd_main.c +4 -3
@@ -2948,7 +2948,6 @@ void drbd_delete_device(struct drbd_device *device)struct drbd_resource *resource = device->resource;struct drbd_connection *connection;struct drbd_peer_device *peer_device; -int refs =3 ;/* move to free_peer_device() */ for_each_peer_device (peer_device, device)
@@ -2956,13 +2955,15 @@ void drbd_delete_device(struct drbd_device *device)drbd_debugfs_device_cleanup (device);for_each_connection (connection, resource) {idr_remove (&connection->peer_devices, device->vnr); - refs++; +kref_put (&device->kref, drbd_destroy_device); }idr_remove (&resource->devices, device->vnr); +kref_put (&device->kref, drbd_destroy_device);idr_remove (&drbd_devices,device_to_minor (device)); +kref_put (&device->kref, drbd_destroy_device);del_gendisk (device->vdisk);synchronize_rcu (); -kref_sub (&device->kref, refs, drbd_destroy_device); +kref_put (&device->kref, drbd_destroy_device); }static int __init drbd_init (void )
drivers/block/drbd/drbd_req.c +10 -21
@@ -421,7 +421,6 @@ static void mod_rq_state(struct drbd_request *req, struct bio_and_error *m,struct drbd_peer_device *peer_device =first_peer_device (device);unsigned s = req->rq_state;int c_put =0 ; -int k_put =0 ;if (drbd_suspended (device) && !((s | clear) &RQ_COMPLETION_SUSP )) set |=RQ_COMPLETION_SUSP ;
@@ -437,6 +436,8 @@ static void mod_rq_state(struct drbd_request *req, struct bio_and_error *m,/* intent: get references */ +kref_get (&req->kref); +if (!(s &RQ_LOCAL_PENDING ) && (set &RQ_LOCAL_PENDING ))atomic_inc (&req->completion_ref);
@@ -473,15 +474,12 @@ static void mod_rq_state(struct drbd_request *req, struct bio_and_error *m,if (!(s &RQ_LOCAL_ABORTED ) && (set &RQ_LOCAL_ABORTED )) {D_ASSERT (device, req->rq_state &RQ_LOCAL_PENDING ); -/* local completion may still come in later, -* we need to keep the req object around. */ -kref_get (&req->kref); ++c_put; }if ((s &RQ_LOCAL_PENDING ) && (clear &RQ_LOCAL_PENDING )) {if (req->rq_state &RQ_LOCAL_ABORTED ) - ++k_put; +kref_put (&req->kref, drbd_req_destroy);else ++c_put;list_del_init (&req->req_pending_local);
@@ -503,7 +501,7 @@ static void mod_rq_state(struct drbd_request *req, struct bio_and_error *m,if (s &RQ_NET_SENT )atomic_sub (req->i.size >>9 , &device->ap_in_flight);if (s &RQ_EXP_BARR_ACK ) - ++k_put; +kref_put (&req->kref, drbd_req_destroy); req->net_done_jif = jiffies;/* in ahead/behind mode, or just in case,
@@ -516,25 +514,16 @@ static void mod_rq_state(struct drbd_request *req, struct bio_and_error *m,/* potentially complete and destroy */ -if (k_put || c_put) { -/* Completion does it's own kref_put. If we are going to -* kref_sub below, we need req to be still around then. */ -int at_least = k_put + !!c_put; -int refcount =atomic_read (&req->kref.refcount); -if (refcount < at_least) -drbd_err (device, -"mod_rq_state: Logic BUG: %x -> %x: refcount = %d, should be >= %d\n" , - s, req->rq_state, refcount, at_least); - } -/* If we made progress, retry conflicting peer requests, if any. */ if (req->i.waiting)wake_up (&device->misc_wait); -if (c_put) - k_put +=drbd_req_put_completion_ref (req, m, c_put); -if (k_put) -kref_sub (&req->kref, k_put, drbd_req_destroy); +if (c_put) { +if (drbd_req_put_completion_ref (req, m, c_put)) +kref_put (&req->kref, drbd_req_destroy); + }else { +kref_put (&req->kref, drbd_req_destroy); + } }static void drbd_report_io_error (struct drbd_device *device,struct drbd_request *req)
drivers/block/rbd.c +4 -4
@@ -1535,7 +1535,7 @@ static bool obj_request_overlaps_parent(struct rbd_obj_request *obj_request)static void rbd_obj_request_get (struct rbd_obj_request *obj_request) {dout ("%s: obj %p (was %d)\n" , __func__, obj_request, -atomic_read (&obj_request->kref.refcount)); +kref_read (&obj_request->kref));kref_get (&obj_request->kref); }
@@ -1544,14 +1544,14 @@ static void rbd_obj_request_put(struct rbd_obj_request *obj_request) {rbd_assert (obj_request !=NULL );dout ("%s: obj %p (was %d)\n" , __func__, obj_request, -atomic_read (&obj_request->kref.refcount)); +kref_read (&obj_request->kref));kref_put (&obj_request->kref, rbd_obj_request_destroy); }static void rbd_img_request_get (struct rbd_img_request *img_request) {dout ("%s: img %p (was %d)\n" , __func__, img_request, -atomic_read (&img_request->kref.refcount)); +kref_read (&img_request->kref));kref_get (&img_request->kref); }
@@ -1562,7 +1562,7 @@ static void rbd_img_request_put(struct rbd_img_request *img_request) {rbd_assert (img_request !=NULL );dout ("%s: img %p (was %d)\n" , __func__, img_request, -atomic_read (&img_request->kref.refcount)); +kref_read (&img_request->kref));if (img_request_child_test (img_request))kref_put (&img_request->kref, rbd_parent_request_destroy);else
drivers/block/virtio_blk.c +1 -1
@@ -767,7 +767,7 @@ static void virtblk_remove(struct virtio_device *vdev)/* Stop all the virtqueues. */ vdev->config->reset (vdev); - refc =atomic_read (&disk_to_dev (vblk->disk)->kobj.kref.refcount); + refc =kref_read (&disk_to_dev (vblk->disk)->kobj.kref);put_disk (vblk->disk); vdev->config->del_vqs (vdev);kfree (vblk->vqs);
drivers/gpu/drm/drm_gem_cma_helper.c +1 -1
@@ -376,7 +376,7 @@ void drm_gem_cma_describe(struct drm_gem_cma_object *cma_obj, off =drm_vma_node_start (&obj->vma_node);seq_printf (m,"%2d (%2d) %08llx %pad %p %zu" , - obj->name, obj->refcount.refcount.counter, + obj->name,kref_read (&obj->refcount), off, &cma_obj->paddr, cma_obj->vaddr, obj->size);seq_printf (m,"\n" );
drivers/gpu/drm/drm_info.c +1 -1
@@ -118,7 +118,7 @@ static int drm_gem_one_name_info(int id, void *ptr, void *data)seq_printf (m,"%6d %8zd %7d %8d\n" , obj->name, obj->size, obj->handle_count, -atomic_read (&obj->refcount.refcount)); +kref_read (&obj->refcount));return 0 ; }
drivers/gpu/drm/drm_mode_object.c +2 -2
@@ -159,7 +159,7 @@ EXPORT_SYMBOL(drm_mode_object_find);void drm_mode_object_unreference (struct drm_mode_object *obj) {if (obj->free_cb) { -DRM_DEBUG ("OBJ ID: %d (%d)\n" , obj->id,atomic_read (&obj->refcount.refcount)); +DRM_DEBUG ("OBJ ID: %d (%d)\n" , obj->id,kref_read (&obj->refcount));kref_put (&obj->refcount, obj->free_cb); } }
@@ -176,7 +176,7 @@ EXPORT_SYMBOL(drm_mode_object_unreference);void drm_mode_object_reference (struct drm_mode_object *obj) {if (obj->free_cb) { -DRM_DEBUG ("OBJ ID: %d (%d)\n" , obj->id,atomic_read (&obj->refcount.refcount)); +DRM_DEBUG ("OBJ ID: %d (%d)\n" , obj->id,kref_read (&obj->refcount));kref_get (&obj->refcount); } }
drivers/gpu/drm/etnaviv/etnaviv_gem.c +1 -1
@@ -486,7 +486,7 @@ static void etnaviv_gem_describe(struct drm_gem_object *obj, struct seq_file *m)seq_printf (m,"%08x: %c %2d (%2d) %08lx %p %zd\n" , etnaviv_obj->flags,is_active (etnaviv_obj) ?'A' :'I' , - obj->name, obj->refcount.refcount.counter, + obj->name,kref_read (&obj->refcount), off, etnaviv_obj->vaddr, obj->size);rcu_read_lock ();
drivers/gpu/drm/i915/i915_gem_object.h +1 -1
@@ -256,7 +256,7 @@ extern void drm_gem_object_unreference_unlocked(struct drm_gem_object *);static inline bool i915_gem_object_is_dead (const struct drm_i915_gem_object *obj) { -return atomic_read (&obj->base.refcount.refcount) ==0 ; +return kref_read (&obj->base.refcount) ==0 ; } static inline bool
drivers/gpu/drm/msm/msm_gem.c +1 -1
@@ -640,7 +640,7 @@ void msm_gem_describe(struct drm_gem_object *obj, struct seq_file *m)seq_printf (m,"%08x: %c %2d (%2d) %08llx %p\t" , msm_obj->flags,is_active (msm_obj) ?'A' :'I' , - obj->name, obj->refcount.refcount.counter, + obj->name,kref_read (&obj->refcount), off, msm_obj->vaddr);for (id =0 ; id < priv->num_aspaces; id++)
drivers/gpu/drm/nouveau/nouveau_fence.c +1 -1
@@ -527,7 +527,7 @@ static bool nouveau_fence_no_signaling(struct dma_fence *f)* caller should have a reference on the fence, * else fence could get freed here */ -WARN_ON (atomic_read (&fence->base.refcount.refcount) <=1 ); +WARN_ON (kref_read (&fence->base.refcount) <=1 );/* * This needs uevents to work correctly, but dma_fence_add_callback relies on
drivers/gpu/drm/omapdrm/omap_gem.c +1 -1
@@ -1033,7 +1033,7 @@ void omap_gem_describe(struct drm_gem_object *obj, struct seq_file *m) off =drm_vma_node_start (&obj->vma_node);seq_printf (m,"%08x: %2d (%2d) %08llx %pad (%2d) %p %4d" , - omap_obj->flags, obj->name, obj->refcount.refcount.counter, + omap_obj->flags, obj->name,kref_read (&obj->refcount), off, &omap_obj->paddr, omap_obj->paddr_cnt, omap_obj->vaddr, omap_obj->roll);
drivers/gpu/drm/ttm/ttm_bo.c +18 -45
167 lines not on this page · raw message
drivers/gpu/drm/ttm/ttm_execbuf_util.c +1 -3
@@ -48,9 +48,7 @@ static void ttm_eu_del_from_lru_locked(struct list_head *list)list_for_each_entry (entry, list, head) {struct ttm_buffer_object *bo = entry->bo; -unsigned put_count =ttm_bo_del_from_lru (bo); - -ttm_bo_list_ref_sub (bo, put_count, true); +ttm_bo_del_from_lru (bo); } }
drivers/gpu/drm/ttm/ttm_object.c +1 -1
@@ -304,7 +304,7 @@ bool ttm_ref_object_exists(struct ttm_object_file *tfile,* Verify that the ref->obj pointer was actually valid! */ rmb (); -if (unlikely (atomic_read (&ref->kref.refcount) ==0 )) +if (unlikely (kref_read (&ref->kref) ==0 )) goto out_false;rcu_read_unlock ();
drivers/infiniband/hw/cxgb3/iwch_cm.h +3 -3
@@ -55,14 +55,14 @@#define put_ep (ep) { \ PDBG("put_ep (via %s:%u) ep %p refcnt %d\n", __func__, __LINE__, \ - ep, atomic_read(&((ep)->kref.refcount))); \ - WARN_ON(atomic_read(&((ep)->kref.refcount)) < 1); \ + ep, kref_read(&((ep)->kref))); \ + WARN_ON(kref_read(&((ep)->kref)) < 1); \ kref_put(&((ep)->kref), __free_ep); \ }#define get_ep (ep) { \ PDBG("get_ep (via %s:%u) ep %p, refcnt %d\n", __func__, __LINE__, \ - ep, atomic_read(&((ep)->kref.refcount))); \ + ep, kref_read(&((ep)->kref))); \ kref_get(&((ep)->kref)); \ }
drivers/infiniband/hw/cxgb3/iwch_qp.c +1 -1
@@ -961,7 +961,7 @@ int iwch_modify_qp(struct iwch_dev *rhp, struct iwch_qp *qhp,case IWCH_QP_STATE_RTS :switch (attrs->next_state) {case IWCH_QP_STATE_CLOSING : -BUG_ON (atomic_read (&qhp->ep->com.kref.refcount) <2 ); +BUG_ON (kref_read (&qhp->ep->com.kref) <2 ); qhp->attr.state =IWCH_QP_STATE_CLOSING ;if (!internal) { abort=0 ;
drivers/infiniband/hw/cxgb4/iw_cxgb4.h +3 -3
@@ -654,14 +654,14 @@ enum c4iw_mmid_state {#define c4iw_put_ep (ep) { \ PDBG("put_ep (via %s:%u) ep %p refcnt %d\n", __func__, __LINE__, \ - ep, atomic_read(&((ep)->kref.refcount))); \ - WARN_ON(atomic_read(&((ep)->kref.refcount)) < 1); \ + ep, kref_read(&((ep)->kref))); \ + WARN_ON(kref_read(&((ep)->kref)) < 1); \ kref_put(&((ep)->kref), _c4iw_free_ep); \ }#define c4iw_get_ep (ep) { \ PDBG("get_ep (via %s:%u) ep %p, refcnt %d\n", __func__, __LINE__, \ - ep, atomic_read(&((ep)->kref.refcount))); \ + ep, kref_read(&((ep)->kref))); \ kref_get(&((ep)->kref)); \ }void _c4iw_free_ep (struct kref *kref);
drivers/infiniband/hw/cxgb4/qp.c +1 -1
@@ -1503,7 +1503,7 @@ int c4iw_modify_qp(struct c4iw_dev *rhp, struct c4iw_qp *qhp,case C4IW_QP_STATE_RTS :switch (attrs->next_state) {case C4IW_QP_STATE_CLOSING : -BUG_ON (atomic_read (&qhp->ep->com.kref.refcount) <2 ); +BUG_ON (kref_read (&qhp->ep->com.kref) <2 );t4_set_wq_in_error (&qhp->wq);set_state (qhp,C4IW_QP_STATE_CLOSING ); ep = qhp->ep;
drivers/infiniband/hw/usnic/usnic_ib_sysfs.c +3 -3
@@ -80,7 +80,7 @@ usnic_ib_show_config(struct device *device, struct device_attribute *attr, left =PAGE_SIZE ;mutex_lock (&us_ibdev->usdev_lock); -if (atomic_read (&us_ibdev->vf_cnt.refcount) >0 ) { +if (kref_read (&us_ibdev->vf_cnt) >0 ) {char *busname;/*
@@ -99,7 +99,7 @@ usnic_ib_show_config(struct device *device, struct device_attribute *attr,PCI_FUNC (us_ibdev->pdev->devfn),netdev_name (us_ibdev->netdev), us_ibdev->ufdev->mac, - atomic_read(&us_ibdev->vf_cnt.refcount)); + kref_read(&us_ibdev->vf_cnt));UPDATE_PTR_LEFT (n, ptr, left); for (res_type = USNIC_VNIC_RES_TYPE_EOL;
@@ -147,7 +147,7 @@ usnic_ib_show_max_vf(struct device *device, struct device_attribute *attr, us_ibdev = container_of(device, struct usnic_ib_dev, ib_dev.dev);return scnprintf (buf,PAGE_SIZE ,"%u\n" , -atomic_read (&us_ibdev->vf_cnt.refcount)); +kref_read (&us_ibdev->vf_cnt)); } static ssize_t
drivers/infiniband/hw/usnic/usnic_ib_verbs.c +2 -2
@@ -291,11 +291,11 @@ int usnic_ib_query_device(struct ib_device *ibdev, qp_per_vf =max (us_ibdev->vf_res_cnt[USNIC_VNIC_RES_TYPE_WQ ], us_ibdev->vf_res_cnt[USNIC_VNIC_RES_TYPE_RQ ]); props->max_qp = qp_per_vf * -atomic_read (&us_ibdev->vf_cnt.refcount); +kref_read (&us_ibdev->vf_cnt); props->device_cap_flags =IB_DEVICE_PORT_ACTIVE_EVENT |IB_DEVICE_SYS_IMAGE_GUID |IB_DEVICE_BLOCK_MULTICAST_LOOPBACK ; props->max_cq = us_ibdev->vf_res_cnt[USNIC_VNIC_RES_TYPE_CQ ] * -atomic_read (&us_ibdev->vf_cnt.refcount); +kref_read (&us_ibdev->vf_cnt); props->max_pd =USNIC_UIOM_MAX_PD_CNT ; props->max_mr =USNIC_UIOM_MAX_MR_CNT ; props->local_ca_ack_delay =0 ;
drivers/md/dm-bufio.c +1 -1
@@ -794,7 +794,7 @@ static void __wait_for_free_buffer(struct dm_bufio_client *c)DECLARE_WAITQUEUE (wait, current);add_wait_queue (&c->free_buffer_wait, &wait); -set_task_state (current,TASK_UNINTERRUPTIBLE ); +set_current_state (TASK_UNINTERRUPTIBLE );dm_bufio_unlock (c);io_schedule ();
drivers/md/dm-crypt.c +2 -2
@@ -1210,14 +1210,14 @@ static int dmcrypt_write(void *data)spin_unlock_irq (&cc->write_thread_wait.lock);if (unlikely (kthread_should_stop ())) { -set_task_state (current,TASK_RUNNING ); +set_current_state (TASK_RUNNING );remove_wait_queue (&cc->write_thread_wait, &wait);break ; }schedule (); -set_task_state (current,TASK_RUNNING ); +set_current_state (TASK_RUNNING );spin_lock_irq (&cc->write_thread_wait.lock);__remove_wait_queue (&cc->write_thread_wait, &wait); goto continue_locked;
drivers/md/persistent-data/dm-block-manager.c +2 -2
@@ -120,7 +120,7 @@ static int __check_holder(struct block_lock *lock)static void __wait (struct waiter *w) {for (;;) { -set_task_state (current,TASK_UNINTERRUPTIBLE ); +set_current_state (TASK_UNINTERRUPTIBLE );if (!w->task)break ;
@@ -128,7 +128,7 @@ static void __wait(struct waiter *w)schedule (); } -set_task_state (current,TASK_RUNNING ); +set_current_state (TASK_RUNNING ); }static void __wake_waiter (struct waiter *w)
drivers/misc/genwqe/card_dev.c +1 -1
@@ -1396,7 +1396,7 @@ int genwqe_device_remove(struct genwqe_dev *cd)* application which will decrease this reference from * 1/unused to 0/illegal and not from 2/used 1/empty. */ - rc =atomic_read (&cd->cdev_genwqe.kobj.kref.refcount); + rc =kref_read (&cd->cdev_genwqe.kobj.kref);if (rc !=1 ) {dev_err (&pci_dev->dev,"[%s] err: cdev_genwqe...refcount=%d\n" , __func__, rc);
drivers/misc/lkdtm.h +6 -2
@@ -19,8 +19,12 @@ void lkdtm_SOFTLOCKUP(void);void lkdtm_HARDLOCKUP (void );void lkdtm_SPINLOCKUP (void );void lkdtm_HUNG_TASK (void ); -void lkdtm_ATOMIC_UNDERFLOW (void ); -void lkdtm_ATOMIC_OVERFLOW (void ); +void lkdtm_REFCOUNT_SATURATE_INC (void ); +void lkdtm_REFCOUNT_SATURATE_ADD (void ); +void lkdtm_REFCOUNT_ZERO_DEC (void ); +void lkdtm_REFCOUNT_ZERO_INC (void ); +void lkdtm_REFCOUNT_ZERO_SUB (void ); +void lkdtm_REFCOUNT_ZERO_ADD (void );void lkdtm_CORRUPT_LIST_ADD (void );void lkdtm_CORRUPT_LIST_DEL (void );
drivers/misc/lkdtm_bugs.c +73 -14
107 lines not on this page · raw message
drivers/misc/lkdtm_core.c +6 -2
@@ -220,8 +220,12 @@ struct crashtype crashtypes[] = {CRASHTYPE (WRITE_RO ),CRASHTYPE (WRITE_RO_AFTER_INIT ),CRASHTYPE (WRITE_KERN ), -CRASHTYPE (ATOMIC_UNDERFLOW ), -CRASHTYPE (ATOMIC_OVERFLOW ), +CRASHTYPE (REFCOUNT_SATURATE_INC ), +CRASHTYPE (REFCOUNT_SATURATE_ADD ), +CRASHTYPE (REFCOUNT_ZERO_DEC ), +CRASHTYPE (REFCOUNT_ZERO_INC ), +CRASHTYPE (REFCOUNT_ZERO_SUB ), +CRASHTYPE (REFCOUNT_ZERO_ADD ),CRASHTYPE (USERCOPY_HEAP_SIZE_TO ),CRASHTYPE (USERCOPY_HEAP_SIZE_FROM ), CRASHTYPE(USERCOPY_HEAP_FLAG_TO),
drivers/misc/mei/debugfs.c +1 -1
@@ -67,7 +67,7 @@ static ssize_t mei_dbgfs_read_meclients(struct file *fp, char __user *ubuf, me_cl->props.max_number_of_connections, me_cl->props.max_msg_length, me_cl->props.single_recv_buf, - atomic_read(&me_cl->refcnt.refcount)); + kref_read(&me_cl->refcnt));mei_me_cl_put (me_cl); }
drivers/pci/hotplug/pnv_php.c +1 -1
@@ -155,7 +155,7 @@ static void pnv_php_detach_device_nodes(struct device_node *parent)pnv_php_detach_device_nodes (dn);of_node_put (dn); - refcount =atomic_read (&dn->kobj.kref.refcount); + refcount =kref_read (&dn->kobj.kref);if (refcount !=1 )pr_warn ("Invalid refcount %d on <%s>\n" , refcount,of_node_full_name (dn));
drivers/pci/slot.c +1 -1
@@ -345,7 +345,7 @@ EXPORT_SYMBOL_GPL(pci_create_slot);void pci_destroy_slot (struct pci_slot *slot) {dev_dbg (&slot->bus->dev,"dev %02x, dec refcount to %d\n" , - slot->number,atomic_read (&slot->kobj.kref.refcount) -1 ); + slot->number,kref_read (&slot->kobj.kref) -1 );mutex_lock (&pci_slot_mutex);kobject_put (&slot->kobj);
drivers/scsi/bnx2fc/bnx2fc_io.c +4 -4
@@ -74,7 +74,7 @@ static void bnx2fc_cmd_timeout(struct work_struct *work) &io_req->req_flags)) {/* Handle internally generated ABTS timeout */ BNX2FC_IO_DBG (io_req,"ABTS timed out refcnt = %d\n" , - io_req->refcount.refcount.counter); +kref_read (&io_req->refcount));if (!(test_and_set_bit (BNX2FC_FLAG_ABTS_DONE , &io_req->req_flags))) {/*
@@ -1141,7 +1141,7 @@ int bnx2fc_eh_abort(struct scsi_cmnd *sc_cmd)return SUCCESS ; }BNX2FC_IO_DBG (io_req,"eh_abort - refcnt = %d\n" , - io_req->refcount.refcount.counter); +kref_read (&io_req->refcount));/* Hold IO request across abort processing */ kref_get (&io_req->refcount);
@@ -1299,7 +1299,7 @@ void bnx2fc_process_cleanup_compl(struct bnx2fc_cmd *io_req, {BNX2FC_IO_DBG (io_req,"Entered process_cleanup_compl " "refcnt = %d, cmd_type = %d\n" , - io_req->refcount.refcount.counter, io_req->cmd_type); +kref_read (&io_req->refcount), io_req->cmd_type);bnx2fc_scsi_done (io_req,DID_ERROR );kref_put (&io_req->refcount, bnx2fc_cmd_release);if (io_req->wait_for_comp)
@@ -1318,7 +1318,7 @@ void bnx2fc_process_abts_compl(struct bnx2fc_cmd *io_req,BNX2FC_IO_DBG (io_req,"Entered process_abts_compl xid = 0x%x" "refcnt = %d, cmd_type = %d\n" , io_req->xid, - io_req->refcount.refcount.counter, io_req->cmd_type); +kref_read (&io_req->refcount), io_req->cmd_type);if (test_and_set_bit (BNX2FC_FLAG_ABTS_DONE , &io_req->req_flags)) {
drivers/scsi/cxgbi/libcxgbi.h +2 -2
@@ -301,7 +301,7 @@ static inline void __cxgbi_sock_put(const char *fn, struct cxgbi_sock *csk) {log_debug (1 <<CXGBI_DBG_SOCK ,"%s, put csk 0x%p, ref %u-1.\n" , - fn, csk,atomic_read (&csk->refcnt.refcount)); + fn, csk,kref_read (&csk->refcnt));kref_put (&csk->refcnt, cxgbi_sock_free); }#define cxgbi_sock_put (csk) __cxgbi_sock_put(__func__, csk)
@@ -310,7 +310,7 @@ static inline void __cxgbi_sock_get(const char *fn, struct cxgbi_sock *csk) {log_debug (1 <<CXGBI_DBG_SOCK ,"%s, get csk 0x%p, ref %u+1.\n" , - fn, csk,atomic_read (&csk->refcnt.refcount)); + fn, csk,kref_read (&csk->refcnt));kref_get (&csk->refcnt); }#define cxgbi_sock_get (csk) __cxgbi_sock_get(__func__, csk)
drivers/scsi/lpfc/lpfc_debugfs.c +1 -1
@@ -607,7 +607,7 @@ lpfc_debugfs_nodelist_data(struct lpfc_vport *vport, char *buf, int size) len +=snprintf (buf+len, size-len,"usgmap:%x " , ndlp->nlp_usg_map); len +=snprintf (buf+len, size-len,"refcnt:%x" , -atomic_read (&ndlp->kref.refcount)); +kref_read (&ndlp->kref)); len +=snprintf (buf+len, size-len,"\n" ); }spin_unlock_irq (shost->host_lock);
drivers/scsi/lpfc/lpfc_els.c +1 -1
@@ -3688,7 +3688,7 @@ lpfc_mbx_cmpl_dflt_rpi(struct lpfc_hba *phba, LPFC_MBOXQ_t *pmb)lpfc_printf_vlog (ndlp->vport,KERN_INFO ,LOG_NODE ,"0006 rpi%x DID:%x flg:%x %d map:%x %p\n" , ndlp->nlp_rpi, ndlp->nlp_DID, ndlp->nlp_flag, -atomic_read (&ndlp->kref.refcount), +kref_read (&ndlp->kref), ndlp->nlp_usg_map, ndlp);if (NLP_CHK_NODE_ACT (ndlp)) {lpfc_nlp_put (ndlp);
drivers/scsi/lpfc/lpfc_hbadisc.c +20 -20
@@ -3440,7 +3440,7 @@ lpfc_mbx_cmpl_reg_login(struct lpfc_hba *phba, LPFC_MBOXQ_t *pmb)lpfc_printf_vlog (vport,KERN_INFO ,LOG_SLI ,"0002 rpi:%x DID:%x flg:%x %d map:%x %p\n" , ndlp->nlp_rpi, ndlp->nlp_DID, ndlp->nlp_flag, -atomic_read (&ndlp->kref.refcount), +kref_read (&ndlp->kref), ndlp->nlp_usg_map, ndlp);if (ndlp->nlp_flag &NLP_REG_LOGIN_SEND ) ndlp->nlp_flag &= ~NLP_REG_LOGIN_SEND ;
@@ -3861,7 +3861,7 @@ lpfc_mbx_cmpl_ns_reg_login(struct lpfc_hba *phba, LPFC_MBOXQ_t *pmb)lpfc_printf_vlog (vport,KERN_INFO ,LOG_SLI ,"0003 rpi:%x DID:%x flg:%x %d map%x %p\n" , ndlp->nlp_rpi, ndlp->nlp_DID, ndlp->nlp_flag, -atomic_read (&ndlp->kref.refcount), +kref_read (&ndlp->kref), ndlp->nlp_usg_map, ndlp);if (vport->port_state <LPFC_VPORT_READY ) {
@@ -4238,7 +4238,7 @@ lpfc_enable_node(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp,"0277 lpfc_enable_node: ndlp:x%p " "usgmap:x%x refcnt:%d\n" , (void *)ndlp, ndlp->nlp_usg_map, - atomic_read(&ndlp->kref.refcount)); + kref_read(&ndlp->kref));return NULL ; }/* The ndlp should not already be in active mode */
@@ -4248,7 +4248,7 @@ lpfc_enable_node(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp,"0278 lpfc_enable_node: ndlp:x%p " "usgmap:x%x refcnt:%d\n" , (void *)ndlp, ndlp->nlp_usg_map, - atomic_read(&ndlp->kref.refcount)); + kref_read(&ndlp->kref));return NULL ; }
@@ -4272,7 +4272,7 @@ lpfc_enable_node(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp,"0008 rpi:%x DID:%x flg:%x refcnt:%d " "map:%x %p\n" , ndlp->nlp_rpi, ndlp->nlp_DID, ndlp->nlp_flag, -atomic_read (&ndlp->kref.refcount), +kref_read (&ndlp->kref), ndlp->nlp_usg_map, ndlp); }
@@ -4546,7 +4546,7 @@ lpfc_unreg_rpi(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp) (bf_get (lpfc_sli_intf_if_type, &phba->sli4_hba.sli_intf) ==LPFC_SLI_INTF_IF_TYPE_2 ) && - (atomic_read(&ndlp->kref.refcount) > 0)) { + (kref_read(&ndlp->kref) > 0)) { mbox->context1 = lpfc_nlp_get(ndlp); mbox->mbox_cmpl = lpfc_sli4_unreg_rpi_cmpl_clr;
@@ -4695,14 +4695,14 @@ lpfc_cleanup_node(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp)"0280 lpfc_cleanup_node: ndlp:x%p " "usgmap:x%x refcnt:%d\n" , (void *)ndlp, ndlp->nlp_usg_map, - atomic_read(&ndlp->kref.refcount)); + kref_read(&ndlp->kref));lpfc_dequeue_node (vport, ndlp); }else {lpfc_printf_vlog (vport,KERN_WARNING ,LOG_NODE ,"0281 lpfc_cleanup_node: ndlp:x%p " "usgmap:x%x refcnt:%d\n" , (void *)ndlp, ndlp->nlp_usg_map, -atomic_read (&ndlp->kref.refcount)); +kref_read (&ndlp->kref));lpfc_disable_node (vport, ndlp); }
@@ -4791,7 +4791,7 @@ lpfc_nlp_remove(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp)lpfc_printf_vlog (vport,KERN_INFO ,LOG_NODE ,"0005 rpi:%x DID:%x flg:%x %d map:%x %p\n" , ndlp->nlp_rpi, ndlp->nlp_DID, ndlp->nlp_flag, -atomic_read (&ndlp->kref.refcount), +kref_read (&ndlp->kref), ndlp->nlp_usg_map, ndlp);if ((mbox =mempool_alloc (phba->mbox_mem_pool,GFP_KERNEL )) !=NULL ) {
@@ -5557,7 +5557,7 @@ lpfc_mbx_cmpl_fdmi_reg_login(struct lpfc_hba *phba, LPFC_MBOXQ_t *pmb)lpfc_printf_vlog (vport,KERN_INFO ,LOG_SLI ,"0004 rpi:%x DID:%x flg:%x %d map:%x %p\n" , ndlp->nlp_rpi, ndlp->nlp_DID, ndlp->nlp_flag, -atomic_read (&ndlp->kref.refcount), +kref_read (&ndlp->kref), ndlp->nlp_usg_map, ndlp);/* * Start issuing Fabric-Device Management Interface (FDMI) command to
@@ -5728,7 +5728,7 @@ lpfc_nlp_init(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp,"0007 rpi:%x DID:%x flg:%x refcnt:%d " "map:%x %p\n" , ndlp->nlp_rpi, ndlp->nlp_DID, ndlp->nlp_flag, -atomic_read (&ndlp->kref.refcount), +kref_read (&ndlp->kref), ndlp->nlp_usg_map, ndlp); ndlp->active_rrqs_xri_bitmap =
@@ -5767,7 +5767,7 @@ lpfc_nlp_release(struct kref *kref)"0279 lpfc_nlp_release: ndlp:x%p did %x " "usgmap:x%x refcnt:%d rpi:%x\n" , (void *)ndlp, ndlp->nlp_DID, ndlp->nlp_usg_map, - atomic_read(&ndlp->kref.refcount), ndlp->nlp_rpi); + kref_read(&ndlp->kref), ndlp->nlp_rpi);/* remove ndlp from action. */ lpfc_nlp_remove (ndlp->vport, ndlp);
@@ -5804,7 +5804,7 @@ lpfc_nlp_get(struct lpfc_nodelist *ndlp)lpfc_debugfs_disc_trc (ndlp->vport,LPFC_DISC_TRC_NODE ,"node get: did:x%x flg:x%x refcnt:x%x" , ndlp->nlp_DID, ndlp->nlp_flag, -atomic_read (&ndlp->kref.refcount)); +kref_read (&ndlp->kref));/* The check of ndlp usage to prevent incrementing the * ndlp reference count that is in the process of being * released.
@@ -5817,7 +5817,7 @@ lpfc_nlp_get(struct lpfc_nodelist *ndlp)"0276 lpfc_nlp_get: ndlp:x%p " "usgmap:x%x refcnt:%d\n" , (void *)ndlp, ndlp->nlp_usg_map, - atomic_read(&ndlp->kref.refcount)); + kref_read(&ndlp->kref));return NULL ; }else kref_get (&ndlp->kref);
@@ -5844,7 +5844,7 @@ lpfc_nlp_put(struct lpfc_nodelist *ndlp)lpfc_debugfs_disc_trc (ndlp->vport,LPFC_DISC_TRC_NODE ,"node put: did:x%x flg:x%x refcnt:x%x" , ndlp->nlp_DID, ndlp->nlp_flag, -atomic_read (&ndlp->kref.refcount)); +kref_read (&ndlp->kref)); phba = ndlp->phba;spin_lock_irqsave (&phba->ndlp_lock, flags);/* Check the ndlp memory free acknowledge flag to avoid the
@@ -5857,7 +5857,7 @@ lpfc_nlp_put(struct lpfc_nodelist *ndlp)"0274 lpfc_nlp_put: ndlp:x%p " "usgmap:x%x refcnt:%d\n" , (void *)ndlp, ndlp->nlp_usg_map, - atomic_read(&ndlp->kref.refcount)); + kref_read(&ndlp->kref));return 1 ; }/* Check the ndlp inactivate log flag to avoid the possible
@@ -5870,7 +5870,7 @@ lpfc_nlp_put(struct lpfc_nodelist *ndlp)"0275 lpfc_nlp_put: ndlp:x%p " "usgmap:x%x refcnt:%d\n" , (void *)ndlp, ndlp->nlp_usg_map, - atomic_read(&ndlp->kref.refcount)); + kref_read(&ndlp->kref));return 1 ; }/* For last put, mark the ndlp usage flags to make sure no
@@ -5878,7 +5878,7 @@ lpfc_nlp_put(struct lpfc_nodelist *ndlp)* in between the process when the final kref_put has been * invoked on this ndlp. */ -if (atomic_read (&ndlp->kref.refcount) ==1 ) { +if (kref_read (&ndlp->kref) ==1 ) {/* Indicate ndlp is put to inactive state. */ NLP_SET_IACT_REQ (ndlp);/* Acknowledge ndlp memory free has been seen. */
@@ -5906,8 +5906,8 @@ lpfc_nlp_not_used(struct lpfc_nodelist *ndlp)lpfc_debugfs_disc_trc (ndlp->vport,LPFC_DISC_TRC_NODE ,"node not used: did:x%x flg:x%x refcnt:x%x" , ndlp->nlp_DID, ndlp->nlp_flag, -atomic_read (&ndlp->kref.refcount)); -if (atomic_read (&ndlp->kref.refcount) ==1 ) +kref_read (&ndlp->kref)); +if (kref_read (&ndlp->kref) ==1 )if (lpfc_nlp_put (ndlp))return 1 ;return 0 ;
drivers/scsi/lpfc/lpfc_init.c +1 -2
@@ -2660,8 +2660,7 @@ lpfc_cleanup(struct lpfc_vport *vport)"usgmap:x%x refcnt:%d\n" , ndlp->nlp_DID, (void *)ndlp, ndlp->nlp_usg_map, -atomic_read ( - &ndlp->kref.refcount)); + kref_read(&ndlp->kref)); }break ; }
drivers/scsi/qla2xxx/tcm_qla2xxx.c +2 -2
@@ -371,7 +371,7 @@ static int tcm_qla2xxx_write_pending(struct se_cmd *se_cmd)*/ pr_debug ("write_pending aborted cmd[%p] refcount %d " "transport_state %x, t_state %x, se_cmd_flags %x\n" , - cmd,cmd->se_cmd.cmd_kref.refcount.counter, + cmd,kref_read (&cmd->se_cmd.cmd_kref), cmd->se_cmd.transport_state, cmd->se_cmd.t_state, cmd->se_cmd.se_cmd_flags);
@@ -584,7 +584,7 @@ static int tcm_qla2xxx_queue_data_in(struct se_cmd *se_cmd)*/ pr_debug ("queue_data_in aborted cmd[%p] refcount %d " "transport_state %x, t_state %x, se_cmd_flags %x\n" , - cmd,cmd->se_cmd.cmd_kref.refcount.counter, + cmd,kref_read (&cmd->se_cmd.cmd_kref), cmd->se_cmd.transport_state, cmd->se_cmd.t_state, cmd->se_cmd.se_cmd_flags);
drivers/staging/android/ion/ion.c +1 -1
@@ -1300,7 +1300,7 @@ static int ion_debug_heap_show(struct seq_file *s, void *unused)seq_printf (s,"%16s %16u %16zu %d %d\n" , buffer->task_comm, buffer->pid, buffer->size, buffer->kmap_cnt, -atomic_read (&buffer->ref.refcount)); +kref_read (&buffer->ref)); total_orphaned_size += buffer->size; } }
drivers/staging/comedi/comedi_buf.c +1 -1
@@ -188,7 +188,7 @@ bool comedi_buf_is_mmapped(struct comedi_subdevice *s) {struct comedi_buf_map *bm = s->async->buf_map; -return bm && (atomic_read (&bm->refcount.refcount) >1 ); +return bm && (kref_read (&bm->refcount) >1 ); } int comedi_buf_alloc(struct comedi_device *dev, struct comedi_subdevice *s,
drivers/staging/lustre/lnet/libcfs/linux/linux-debug.c +1 -1
@@ -107,7 +107,7 @@ void __noreturn lbug_with_loc(struct libcfs_debug_msg_data *msgdata)libcfs_debug_dumplog ();if (libcfs_panic_on_lbug)panic ("LBUG" ); -set_task_state (current,TASK_UNINTERRUPTIBLE ); +set_current_state (TASK_UNINTERRUPTIBLE );while (1 )schedule (); }
drivers/target/target_core_pr.c +5 -5
@@ -788,7 +788,7 @@ static struct t10_pr_registration *__core_scsi3_alloc_registration(* __core_scsi3_add_registration() */ dest_lun =rcu_dereference_check (deve_tmp->se_lun, -atomic_read (&deve_tmp->pr_kref.refcount) !=0 ); +kref_read (&deve_tmp->pr_kref) !=0 ); pr_reg_atp = __core_scsi3_do_alloc_registration(dev, nacl_tmp, dest_lun, deve_tmp,
@@ -1463,7 +1463,7 @@ static int core_scsi3_lunacl_depend_item(struct se_dev_entry *se_deve)* For nacl->dynamic_node_acl=1 */ lun_acl =rcu_dereference_check (se_deve->se_lun_acl, -atomic_read (&se_deve->pr_kref.refcount) !=0 ); +kref_read (&se_deve->pr_kref) !=0 );if (!lun_acl)return 0 ;
@@ -1478,7 +1478,7 @@ static void core_scsi3_lunacl_undepend_item(struct se_dev_entry *se_deve)* For nacl->dynamic_node_acl=1 */ lun_acl =rcu_dereference_check (se_deve->se_lun_acl, -atomic_read (&se_deve->pr_kref.refcount) !=0 ); +kref_read (&se_deve->pr_kref) !=0 );if (!lun_acl) {kref_put (&se_deve->pr_kref, target_pr_kref_release);return ;
@@ -1759,7 +1759,7 @@ core_scsi3_decode_spec_i_port(* 2nd loop which will never fail. */ dest_lun =rcu_dereference_check (dest_se_deve->se_lun, -atomic_read (&dest_se_deve->pr_kref.refcount) !=0 ); +kref_read (&dest_se_deve->pr_kref) !=0 ); dest_pr_reg = __core_scsi3_alloc_registration(cmd->se_dev, dest_node_acl, dest_lun, dest_se_deve,
@@ -3466,7 +3466,7 @@ core_scsi3_emulate_pro_register_and_move(struct se_cmd *cmd, u64 res_key, iport_ptr);if (!dest_pr_reg) {struct se_lun *dest_lun =rcu_dereference_check (dest_se_deve->se_lun, -atomic_read (&dest_se_deve->pr_kref.refcount) !=0 ); +kref_read (&dest_se_deve->pr_kref) !=0 );spin_unlock (&dev->dev_reservation_lock); if (core_scsi3_alloc_registration(cmd->se_dev, dest_node_acl,
drivers/target/tcm_fc/tfc_sess.c +1 -1
@@ -454,7 +454,7 @@ static void ft_sess_free(struct kref *kref)void ft_sess_put (struct ft_sess *sess) { -int sess_held =atomic_read (&sess->kref.refcount); +int sess_held =kref_read (&sess->kref);BUG_ON (!sess_held);kref_put (&sess->kref, ft_sess_free);
drivers/tty/tty_ldsem.c +8 -10
@@ -200,7 +200,6 @@ static struct ld_semaphore __sched * down_read_failed(struct ld_semaphore *sem, long count, long timeout) { struct ldsem_waiter waiter; -struct task_struct *tsk = current;long adjust = -LDSEM_ACTIVE_BIAS +LDSEM_WAIT_BIAS ;/* set up my own style of waitqueue */
@@ -221,8 +220,8 @@ down_read_failed(struct ld_semaphore *sem, long count, long timeout)list_add_tail (&waiter.list, &sem->read_wait); sem->wait_readers++; - waiter.task = tsk; -get_task_struct (tsk); + waiter.task = current; +get_task_struct (current);/* if there are no active locks, wake the new lock owner(s) */ if ((count &LDSEM_ACTIVE_MASK ) ==0 )
@@ -232,7 +231,7 @@ down_read_failed(struct ld_semaphore *sem, long count, long timeout)/* wait to be given the lock */ for (;;) { -set_task_state (tsk,TASK_UNINTERRUPTIBLE ); +set_current_state (TASK_UNINTERRUPTIBLE );if (!waiter.task)break ;
@@ -241,7 +240,7 @@ down_read_failed(struct ld_semaphore *sem, long count, long timeout) timeout =schedule_timeout (timeout); } -__set_task_state (tsk,TASK_RUNNING ); +__set_current_state (TASK_RUNNING );if (!timeout) {/* lock timed out but check if this task was just
@@ -268,7 +267,6 @@ static struct ld_semaphore __sched * down_write_failed(struct ld_semaphore *sem, long count, long timeout) { struct ldsem_waiter waiter; -struct task_struct *tsk = current;long adjust = -LDSEM_ACTIVE_BIAS ;int locked =0 ;
@@ -289,16 +287,16 @@ down_write_failed(struct ld_semaphore *sem, long count, long timeout)list_add_tail (&waiter.list, &sem->write_wait); - waiter.task = tsk; + waiter.task = current; -set_task_state (tsk,TASK_UNINTERRUPTIBLE ); +set_current_state (TASK_UNINTERRUPTIBLE );for (;;) {if (!timeout)break ;raw_spin_unlock_irq (&sem->wait_lock); timeout =schedule_timeout (timeout);raw_spin_lock_irq (&sem->wait_lock); -set_task_state (tsk,TASK_UNINTERRUPTIBLE ); +set_current_state (TASK_UNINTERRUPTIBLE ); locked =writer_trylock (sem);if (locked)break ;
@@ -309,7 +307,7 @@ down_write_failed(struct ld_semaphore *sem, long count, long timeout)list_del (&waiter.list);raw_spin_unlock_irq (&sem->wait_lock); -__set_task_state (tsk,TASK_RUNNING ); +__set_current_state (TASK_RUNNING );/* lock wait may have timed out */ if (!locked)
drivers/usb/gadget/function/f_fs.c +1 -1
@@ -3687,7 +3687,7 @@ static void ffs_closed(struct ffs_data *ffs) goto done;if (opts->no_configfs || !opts->func_inst.group.cg_item.ci_parent - || !atomic_read (&opts->func_inst.group.cg_item.ci_kref.refcount)) + || !kref_read (&opts->func_inst.group.cg_item.ci_kref)) goto done; ci = opts->func_inst.group.cg_item.ci_parent->ci_parent;
drivers/usb/mon/mon_main.c +1 -1
@@ -409,7 +409,7 @@ static void __exit mon_exit(void) printk(KERN_ERR TAG": Outstanding opens (%d) on usb%d, leaking...\n" , mbus->nreaders, mbus->u_bus->busnum); -atomic_set (&mbus->ref.refcount,2 );/* Force leak */ +kref_get (&mbus->ref);/* Force leak */ }mon_dissolve (mbus, mbus->u_bus);
fs/exofs/sys.c +1 -1
@@ -122,7 +122,7 @@ void exofs_sysfs_dbg_print(void)list_for_each_entry_safe (k_name, k_tmp, &exofs_kset->list, entry) {printk (KERN_INFO "%s: name %s ref %d\n" , __func__,kobject_name (k_name), - (int )atomic_read (&k_name->kref.refcount)); + (int )kref_read (&k_name->kref)); }#endif }
fs/fuse/fuse_i.h +1 -1
@@ -256,7 +256,7 @@ struct fuse_io_priv {#define FUSE_IO_PRIV_SYNC (f) \ { \ - .refcnt = { ATOMIC_INIT(1) }, \ + .refcnt = KREF_INIT(1), \ .async = 0, \ .file = f, \ }
fs/ocfs2/cluster/netdebug.c +1 -1
@@ -349,7 +349,7 @@ static void sc_show_sock_container(struct seq_file *seq," func key: 0x%08x\n" " func type: %u\n" , sc, -atomic_read (&sc->sc_kref.refcount), +kref_read (&sc->sc_kref), &saddr, inet ?ntohs (sport) :0 , &daddr, inet ?ntohs (dport) :0 , sc->sc_node->nd_name,
fs/ocfs2/cluster/tcp.c +1 -1
@@ -97,7 +97,7 @@typeof (sc) __sc = (sc); \mlog (ML_SOCKET ,"[sc %p refs %d sock %p node %u page %p " \"pg_off %zu] " fmt, __sc, \ -atomic_read (&__sc->sc_kref.refcount), __sc->sc_sock, \ +kref_read (&__sc->sc_kref), __sc->sc_sock, \ __sc->sc_node->nd_num, __sc->sc_page, __sc->sc_page_off , \ ##args); \ }while (0 )
fs/ocfs2/dlm/dlmdebug.c +6 -6
@@ -81,7 +81,7 @@ static void __dlm_print_lock(struct dlm_lock *lock) lock->ml.type, lock->ml.convert_type, lock->ml.node,dlm_get_lock_cookie_node (be64_to_cpu (lock->ml.cookie)),dlm_get_lock_cookie_seq (be64_to_cpu (lock->ml.cookie)), -atomic_read (&lock->lock_refs.refcount), +kref_read (&lock->lock_refs), (list_empty (&lock->ast_list) ?'y' :'n' ), (lock->ast_pending ?'y' :'n' ), (list_empty(&lock->bast_list) ? 'y' : 'n'),
@@ -106,7 +106,7 @@ void __dlm_print_one_lock_resource(struct dlm_lock_resource *res)printk ("lockres: %s, owner=%u, state=%u\n" , buf, res->owner, res->state);printk (" last used: %lu, refcnt: %u, on purge list: %s\n" , - res->last_used,atomic_read (&res->refs.refcount), + res->last_used,kref_read (&res->refs),list_empty (&res->purge) ?"no" :"yes" ); printk(" on dirty list: %s, on reco list: %s, " "migrating pending: %s\n",
@@ -298,7 +298,7 @@ static int dump_mle(struct dlm_master_list_entry *mle, char *buf, int len) mle_type, mle->master, mle->new_master, !list_empty (&mle->hb_events), !!mle->inuse, - atomic_read(&mle->mle_refs.refcount)); + kref_read(&mle->mle_refs)); out +=snprintf (buf + out, len - out,"Maybe=" ); out += stringify_nodemap(mle->maybe_map, O2NM_MAX_NODES,
@@ -494,7 +494,7 @@ static int dump_lock(struct dlm_lock *lock, int list_type, char *buf, int len) lock->ast_pending, lock->bast_pending, lock->convert_pending, lock->lock_pending, lock->cancel_pending, lock->unlock_pending, - atomic_read(&lock->lock_refs.refcount)); + kref_read(&lock->lock_refs));spin_unlock (&lock->spinlock);return out;
@@ -521,7 +521,7 @@ static int dump_lockres(struct dlm_lock_resource *res, char *buf, int len) !list_empty (&res->recovering), res->inflight_locks, res->migration_pending,atomic_read (&res->asts_reserved), - atomic_read(&res->refs.refcount)); + kref_read(&res->refs));/* refmap */ out +=snprintf (buf + out, len - out,"RMAP:" );
@@ -777,7 +777,7 @@ static int debug_state_print(struct dlm_ctxt *dlm, char *buf, int len)/* Purge Count: xxx Refs: xxx */ out +=snprintf (buf + out, len - out,"Purge Count: %d Refs: %d\n" , dlm->purge_count, -atomic_read (&dlm->dlm_refs.refcount)); +kref_read (&dlm->dlm_refs));/* Dead Node: xxx */ out += snprintf(buf + out, len - out,
fs/ocfs2/dlm/dlmdomain.c +1 -1
@@ -2072,7 +2072,7 @@ static struct dlm_ctxt *dlm_alloc_ctxt(const char *domain,INIT_LIST_HEAD (&dlm->dlm_eviction_callbacks);mlog (0 ,"context init: refcount %u\n" , -atomic_read (&dlm->dlm_refs.refcount)); +kref_read (&dlm->dlm_refs)); leave:if (ret <0 && dlm) {
fs/ocfs2/dlm/dlmmaster.c +4 -4
@@ -233,7 +233,7 @@ static void __dlm_put_mle(struct dlm_master_list_entry *mle)assert_spin_locked (&dlm->spinlock);assert_spin_locked (&dlm->master_lock); -if (!atomic_read (&mle->mle_refs.refcount)) { +if (!kref_read (&mle->mle_refs)) {/* this may or may not crash, but who cares. * it's a BUG. */ mlog (ML_ERROR ,"bad mle: %p\n" , mle);
@@ -1124,9 +1124,9 @@ static int dlm_wait_for_lock_mastery(struct dlm_ctxt *dlm,unsigned long timeo =msecs_to_jiffies (DLM_MASTERY_TIMEOUT_MS );/* -if (atomic_read(&mle->mle_refs.refcount) < 2) +if (kref_read(&mle->mle_refs) < 2) mlog(ML_ERROR, "mle (%p) refs=%d, name=%.*s\n", mle, -atomic_read(&mle->mle_refs.refcount), +kref_read(&mle->mle_refs), res->lockname.len, res->lockname.name); */ atomic_set (&mle->woken,0 );
@@ -1979,7 +1979,7 @@ int dlm_assert_master_handler(struct o2net_msg *msg, u32 len, void *data,* on this mle. */ spin_lock (&dlm->master_lock); - rr =atomic_read (&mle->mle_refs.refcount); + rr =kref_read (&mle->mle_refs);if (mle->inuse >0 ) {if (extra_ref && rr <3 ) err =1 ;
fs/ocfs2/dlm/dlmunlock.c +1 -1
@@ -251,7 +251,7 @@ static enum dlm_status dlmunlock_common(struct dlm_ctxt *dlm,mlog (0 ,"lock %u:%llu should be gone now! refs=%d\n" ,dlm_get_lock_cookie_node (be64_to_cpu (lock->ml.cookie)),dlm_get_lock_cookie_seq (be64_to_cpu (lock->ml.cookie)), -atomic_read (&lock->lock_refs.refcount)-1 ); +kref_read (&lock->lock_refs)-1 );dlm_lock_put (lock); }if (actions &DLM_UNLOCK_CALL_AST )
include/asm-generic/rwsem.h +6 -7
@@ -33,7 +33,7 @@*/ static inline void __down_read (struct rw_semaphore *sem) { -if (unlikely (atomic_long_inc_return_acquire ((atomic_long_t *)&sem->count) <=0 )) +if (unlikely (atomic_long_inc_return_acquire (&sem->count) <=0 ))rwsem_down_read_failed (sem); }
@@ -58,7 +58,7 @@ static inline void __down_write(struct rw_semaphore *sem)long tmp; tmp =atomic_long_add_return_acquire (RWSEM_ACTIVE_WRITE_BIAS , - (atomic_long_t *)&sem->count); + &sem->count);if (unlikely (tmp !=RWSEM_ACTIVE_WRITE_BIAS ))rwsem_down_write_failed (sem); }
@@ -68,7 +68,7 @@ static inline int __down_write_killable(struct rw_semaphore *sem)long tmp; tmp =atomic_long_add_return_acquire (RWSEM_ACTIVE_WRITE_BIAS , - (atomic_long_t *)&sem->count); + &sem->count);if (unlikely (tmp !=RWSEM_ACTIVE_WRITE_BIAS ))if (IS_ERR (rwsem_down_write_failed_killable (sem)))return -EINTR ;
@@ -91,7 +91,7 @@ static inline void __up_read(struct rw_semaphore *sem) {long tmp; - tmp =atomic_long_dec_return_release ((atomic_long_t *)&sem->count); + tmp =atomic_long_dec_return_release (&sem->count);if (unlikely (tmp <-1 && (tmp &RWSEM_ACTIVE_MASK ) ==0 ))rwsem_wake (sem); }
@@ -102,7 +102,7 @@ static inline void __up_read(struct rw_semaphore *sem)static inline void __up_write (struct rw_semaphore *sem) {if (unlikely (atomic_long_sub_return_release (RWSEM_ACTIVE_WRITE_BIAS , - (atomic_long_t *)&sem->count) <0 )) + &sem->count) <0 ))rwsem_wake (sem); }
@@ -120,8 +120,7 @@ static inline void __downgrade_write(struct rw_semaphore *sem)* read-locked region is ok to be re-ordered into the * write side. As such, rely on RELEASE semantics. */ - tmp =atomic_long_add_return_release (-RWSEM_WAITING_BIAS , - (atomic_long_t *)&sem->count); + tmp =atomic_long_add_return_release (-RWSEM_WAITING_BIAS , &sem->count);if (tmp <0 )rwsem_downgrade_wake (sem); }
include/drm/drm_framebuffer.h +1 -1
@@ -247,7 +247,7 @@ static inline void drm_framebuffer_unreference(struct drm_framebuffer *fb)*/ static inline uint32_t drm_framebuffer_read_refcount (struct drm_framebuffer *fb) { -return atomic_read (&fb->base.refcount.refcount); +return kref_read (&fb->base.refcount); }/**
include/drm/ttm/ttm_bo_api.h +1 -14
@@ -332,19 +332,6 @@ extern int ttm_bo_validate(struct ttm_buffer_object *bo,*/ extern void ttm_bo_unref (struct ttm_buffer_object **bo); - -/** -* ttm_bo_list_ref_sub -* -* @bo: The buffer object. -* @count: The number of references with which to decrease @bo::list_kref; -* @never_free: The refcount should not reach zero with this operation. -* -* Release @count lru list references to this buffer object. -*/ -extern void ttm_bo_list_ref_sub (struct ttm_buffer_object *bo,int count, -bool never_free); -/** * ttm_bo_add_to_lru *
@@ -367,7 +354,7 @@ extern void ttm_bo_add_to_lru(struct ttm_buffer_object *bo);* and is usually called just immediately after the bo has been reserved to * avoid recursive reservation from lru lists. */ -extern int ttm_bo_del_from_lru (struct ttm_buffer_object *bo); +extern void ttm_bo_del_from_lru (struct ttm_buffer_object *bo);/** * ttm_bo_move_to_lru_tail
include/drm/ttm/ttm_bo_driver.h +2 -2
@@ -878,7 +878,7 @@ static inline int ttm_bo_reserve(struct ttm_buffer_object *bo, {int ret; -WARN_ON (!atomic_read (&bo->kref.refcount)); +WARN_ON (!kref_read (&bo->kref)); ret =__ttm_bo_reserve (bo, interruptible, no_wait, ticket);if (likely (ret ==0 ))
@@ -903,7 +903,7 @@ static inline int ttm_bo_reserve_slowpath(struct ttm_buffer_object *bo, {int ret =0 ; -WARN_ON (!atomic_read (&bo->kref.refcount)); +WARN_ON (!kref_read (&bo->kref));if (interruptible) ret = ww_mutex_lock_slow_interruptible(&bo->resv->lock,
include/linux/jump_label.h +2 -2
@@ -402,6 +402,6 @@ extern bool ____wrong_branch_error(void);#define static_branch_enable (x) static_key_enable(&(x)->key)#define static_branch_disable (x) static_key_disable(&(x)->key) -#endif /* _LINUX_JUMP_LABEL_H */ -#endif /* __ASSEMBLY__ */ + +#endif /* _LINUX_JUMP_LABEL_H */
include/linux/kref.h +32 -46
134 lines not on this page · raw message
include/linux/mutex.h +4 -1
@@ -20,6 +20,8 @@#include <linux/osq_lock.h> #include <linux/debug_locks.h> +struct ww_acquire_ctx ; +/* * Simple, straightforward mutexes with strict semantics: *
@@ -65,7 +67,7 @@ struct mutex {static inline struct task_struct *__mutex_owner (struct mutex *lock) { -return (struct task_struct *)(atomic_long_read (&lock->owner) & ~0x03 ); +return (struct task_struct *)(atomic_long_read (&lock->owner) & ~0x07 ); }/*
@@ -75,6 +77,7 @@ static inline struct task_struct *__mutex_owner(struct mutex *lock)struct mutex_waiter {struct list_head list;struct task_struct *task; +struct ww_acquire_ctx *ww_ctx;#ifdef CONFIG_DEBUG_MUTEXES void *magic;#endif
include/linux/percpu-rwsem.h +4 -4
@@ -4,15 +4,15 @@#include <linux/atomic.h> #include <linux/rwsem.h> #include <linux/percpu.h> -#include <linux/wait.h> +#include <linux/rcuwait.h> #include <linux/rcu_sync.h> #include <linux/lockdep.h> struct percpu_rw_semaphore {struct rcu_sync rss;unsigned int __percpu *read_count; -struct rw_semaphore rw_sem; -wait_queue_head_t writer; +struct rw_semaphore rw_sem;/* slowpath */ +struct rcuwait writer;/* blocked writer */ int readers_block; };
@@ -22,7 +22,7 @@ static struct percpu_rw_semaphore name = { \ .rss = __RCU_SYNC_INITIALIZER(name.rss, RCU_SCHED_SYNC), \ .read_count = &__percpu_rwsem_rc_##name, \ .rw_sem = __RWSEM_INITIALIZER(name.rw_sem), \ - .writer = __WAIT_QUEUE_HEAD_INITIALIZER(name.writer), \ + .writer = __RCUWAIT_INITIALIZER(name.writer), \ }extern int __percpu_down_read (struct percpu_rw_semaphore *,int );
include/linux/poison.h +1 -0
@@ -80,6 +80,7 @@/********** kernel/mutexes **********/ #define MUTEX_DEBUG_INIT 0x11#define MUTEX_DEBUG_FREE 0x22 +#define MUTEX_POISON_WW_CTX ((void *) 0x500 + POISON_POINTER_DELTA)/********** lib/flex_array.c **********/ #define FLEX_ARRAY_FREE 0x6c/* for use-after-free poisoning */
include/linux/rcuwait.h new file +63 -0
63 lines not on this page · raw message
include/linux/refcount.h new file +294 -0
294 lines not on this page · raw message
include/linux/sched.h +9 -28
@@ -227,7 +227,7 @@ extern void proc_sched_set_task(struct task_struct *p);extern char ___assert_task_state[1 -2 *!!(sizeof (TASK_STATE_TO_CHAR_STR )-1 !=ilog2 (TASK_STATE_MAX )+1 )]; -/* Convenience macros for the sake of set_task_state */ +/* Convenience macros for the sake of set_current_state */ #define TASK_KILLABLE (TASK_WAKEKILL | TASK_UNINTERRUPTIBLE)#define TASK_STOPPED (TASK_WAKEKILL | __TASK_STOPPED)#define TASK_TRACED (TASK_WAKEKILL | __TASK_TRACED)
@@ -254,17 +254,6 @@ extern char ___assert_task_state[1 - 2*!!(#ifdef CONFIG_DEBUG_ATOMIC_SLEEP -#define __set_task_state (tsk, state_value) \ - do { \ - (tsk)->task_state_change = _THIS_IP_; \ - (tsk)->state = (state_value); \ - } while (0) -#define set_task_state (tsk, state_value) \ - do { \ - (tsk)->task_state_change = _THIS_IP_; \ - smp_store_mb((tsk)->state, (state_value)); \ - } while (0) -#define __set_current_state (state_value) \ do { \ current->task_state_change = _THIS_IP_; \
@@ -277,20 +266,6 @@ extern char ___assert_task_state[1 - 2*!!( } while (0)#else - -/* -* @tsk had better be current, or you get to keep the pieces. -* -* The only reason is that computing current can be more expensive than -* using a pointer that's already available. -* -* Therefore, see set_current_state(). -*/ -#define __set_task_state (tsk, state_value) \ - do { (tsk)->state = (state_value); } while (0) -#define set_task_state (tsk, state_value) \ - smp_store_mb((tsk)->state, (state_value)) -/* * set_current_state() includes a barrier so that the write of current->state * is correctly serialised wrt the caller's subsequent test of whether to
@@ -1025,8 +1000,8 @@ enum cpu_idle_type {* * The DEFINE_WAKE_Q macro declares and initializes the list head. * wake_up_q() does NOT reinitialize the list; it's expected to be -* called near the end of a function, where the fact that the queue is -* not used again will be easy to see by inspection. +* called near the end of a function. Otherwise, the list can be +* re-initialized for later re-use by wake_q_init(). * * Note that this can cause spurious wakeups. schedule() callers * must ensure the call is done inside a loop, confirming that the
@@ -1046,6 +1021,12 @@ struct wake_q_head {#define DEFINE_WAKE_Q (name) \ struct wake_q_head name = { WAKE_Q_TAIL, &name.first } +static inline void wake_q_init (struct wake_q_head *head) +{ + head->first =WAKE_Q_TAIL ; + head->lastp = &head->first; +} +extern void wake_q_add (struct wake_q_head *head,struct task_struct *task);extern void wake_up_q (struct wake_q_head *head);
include/linux/spinlock.h +0 -8
@@ -180,8 +180,6 @@ static inline void do_raw_spin_unlock(raw_spinlock_t *lock) __releases(lock)#ifdef CONFIG_DEBUG_LOCK_ALLOC # define raw_spin_lock_nested (lock, subclass) \ _raw_spin_lock_nested(lock, subclass) -# define raw_spin_lock_bh_nested (lock, subclass) \ - _raw_spin_lock_bh_nested(lock, subclass)# define raw_spin_lock_nest_lock (lock, nest_lock) \ do { \
@@ -197,7 +195,6 @@ static inline void do_raw_spin_unlock(raw_spinlock_t *lock) __releases(lock)# define raw_spin_lock_nested (lock, subclass) \ _raw_spin_lock(((void)(subclass), (lock)))# define raw_spin_lock_nest_lock (lock, nest_lock) _raw_spin_lock(lock) -# define raw_spin_lock_bh_nested (lock, subclass) _raw_spin_lock_bh(lock)#endif #if defined(CONFIG_SMP ) || defined(CONFIG_DEBUG_SPINLOCK )
@@ -317,11 +314,6 @@ do { \raw_spin_lock_nested (spinlock_check (lock), subclass); \ } while (0) -#define spin_lock_bh_nested (lock, subclass) \ -do { \ - raw_spin_lock_bh_nested(spinlock_check(lock), subclass);\ -} while (0) -#define spin_lock_nest_lock (lock, nest_lock) \ do { \ raw_spin_lock_nest_lock(spinlock_check(lock), nest_lock); \
include/linux/spinlock_api_smp.h +0 -2
@@ -22,8 +22,6 @@ int in_lock_functions(unsigned long addr); void __lockfunc _raw_spin_lock(raw_spinlock_t *lock) __acquires(lock); void __lockfunc _raw_spin_lock_nested(raw_spinlock_t *lock, int subclass) __acquires(lock); -void __lockfunc _raw_spin_lock_bh_nested(raw_spinlock_t *lock, int subclass) - __acquires(lock); void __lockfunc _raw_spin_lock_nest_lock(raw_spinlock_t *lock, struct lockdep_map *map) __acquires(lock);
include/linux/spinlock_api_up.h +0 -1
@@ -57,7 +57,6 @@#define _raw_spin_lock (lock) __LOCK(lock)#define _raw_spin_lock_nested (lock, subclass) __LOCK(lock) -#define _raw_spin_lock_bh_nested (lock, subclass) __LOCK(lock)#define _raw_read_lock (lock) __LOCK(lock)#define _raw_write_lock (lock) __LOCK(lock)#define _raw_spin_lock_bh (lock) __LOCK_BH(lock)
include/linux/sunrpc/cache.h +1 -1
@@ -198,7 +198,7 @@ static inline struct cache_head *cache_get(struct cache_head *h)static inline void cache_put (struct cache_head *h,struct cache_detail *cd) { -if (atomic_read (&h->ref.refcount) <=2 && +if (kref_read (&h->ref) <=2 && h->expiry_time < cd->nextcheck) cd->nextcheck = h->expiry_time;kref_put (&h->ref, cd->cache_put);
include/linux/ww_mutex.h +7 -25
@@ -51,10 +51,10 @@ struct ww_mutex { };#ifdef CONFIG_DEBUG_LOCK_ALLOC -# define __WW_CLASS_MUTEX_INITIALIZER (lockname, ww_class) \ - , .ww_class = &ww_class +# define __WW_CLASS_MUTEX_INITIALIZER (lockname, class) \ + , .ww_class = class#else -# define __WW_CLASS_MUTEX_INITIALIZER (lockname, ww_class) +# define __WW_CLASS_MUTEX_INITIALIZER (lockname, class)#endif #define __WW_CLASS_INITIALIZER (ww_class) \
@@ -63,7 +63,7 @@ struct ww_mutex { , .mutex_name = #ww_class "_mutex" }#define __WW_MUTEX_INITIALIZER (lockname, class) \ - { .base = { \__MUTEX_INITIALIZER(lockname) } \ + { .base = __MUTEX_INITIALIZER(lockname.base) \ __WW_CLASS_MUTEX_INITIALIZER(lockname, class) }#define DEFINE_WW_CLASS (classname) \
@@ -186,11 +186,6 @@ static inline void ww_acquire_fini(struct ww_acquire_ctx *ctx)#endif } -extern int __must_check __ww_mutex_lock (struct ww_mutex *lock, -struct ww_acquire_ctx *ctx); -extern int __must_check __ww_mutex_lock_interruptible (struct ww_mutex *lock, -struct ww_acquire_ctx *ctx); -/** * ww_mutex_lock - acquire the w/w mutex * @lock: the mutex to be acquired
@@ -220,14 +215,7 @@ extern int __must_check __ww_mutex_lock_interruptible(struct ww_mutex *lock,* * A mutex acquired with this function must be released with ww_mutex_unlock. */ -static inline int ww_mutex_lock (struct ww_mutex *lock,struct ww_acquire_ctx *ctx) -{ -if (ctx) -return __ww_mutex_lock (lock, ctx); - -mutex_lock (&lock->base); -return 0 ; -} +extern int /* __must_check */ ww_mutex_lock (struct ww_mutex *lock,struct ww_acquire_ctx *ctx);/** * ww_mutex_lock_interruptible - acquire the w/w mutex, interruptible
@@ -259,14 +247,8 @@ static inline int ww_mutex_lock(struct ww_mutex *lock, struct ww_acquire_ctx *ct* * A mutex acquired with this function must be released with ww_mutex_unlock. */ -static inline int __must_check ww_mutex_lock_interruptible (struct ww_mutex *lock, -struct ww_acquire_ctx *ctx) -{ -if (ctx) -return __ww_mutex_lock_interruptible (lock, ctx); -else -return mutex_lock_interruptible (&lock->base); -} +extern int __must_check ww_mutex_lock_interruptible (struct ww_mutex *lock, +struct ww_acquire_ctx *ctx);/** * ww_mutex_lock_slow - slowpath acquiring of the w/w mutex
include/net/bluetooth/hci_core.h +2 -2
@@ -987,7 +987,7 @@ static inline void hci_conn_drop(struct hci_conn *conn)static inline void hci_dev_put (struct hci_dev *d) {BT_DBG ("%s orig refcnt %d" , d->name, -atomic_read (&d->dev.kobj.kref.refcount)); +kref_read (&d->dev.kobj.kref));put_device (&d->dev); }
@@ -995,7 +995,7 @@ static inline void hci_dev_put(struct hci_dev *d)static inline struct hci_dev *hci_dev_hold (struct hci_dev *d) {BT_DBG ("%s orig refcnt %d" , d->name, -atomic_read (&d->dev.kobj.kref.refcount)); +kref_read (&d->dev.kobj.kref));get_device (&d->dev);return d;
init/version.c +1 -3
@@ -23,9 +23,7 @@ int version_string(LINUX_VERSION_CODE);#endif struct uts_namespace init_uts_ns = { - .kref = { - .refcount =ATOMIC_INIT (2 ), - }, + .kref =KREF_INIT (2 ), .name = { .sysname =UTS_SYSNAME , .nodename =UTS_NODENAME ,
kernel/exit.c +41 -11
101 lines not on this page · raw message
kernel/fork.c +4 -2
@@ -432,11 +432,13 @@ void __init fork_init(void)int i;#ifndef CONFIG_ARCH_TASK_STRUCT_ALLOCATOR #ifndef ARCH_MIN_TASKALIGN -#define ARCH_MIN_TASKALIGN L1_CACHE_BYTES +#define ARCH_MIN_TASKALIGN 0#endif +int align =min_t (int,L1_CACHE_BYTES ,ARCH_MIN_TASKALIGN ); +/* create a slab on which task_structs can be allocated */ task_struct_cachep =kmem_cache_create ("task_struct" , - arch_task_struct_size,ARCH_MIN_TASKALIGN , + arch_task_struct_size, align,SLAB_PANIC |SLAB_NOTRACK |SLAB_ACCOUNT ,NULL );#endif
kernel/locking/Makefile +1 -0
@@ -28,3 +28,4 @@ obj-$(CONFIG_RWSEM_GENERIC_SPINLOCK) += rwsem-spinlock.o obj-$(CONFIG_RWSEM_XCHGADD_ALGORITHM) += rwsem-xadd.o obj-$(CONFIG_QUEUED_RWLOCKS) += qrwlock.o obj-$(CONFIG_LOCK_TORTURE_TEST) += locktorture.o +obj-$(CONFIG_WW_MUTEX_SELFTEST) += test-ww_mutex.o
kernel/locking/lockdep.c +1 -1
@@ -2203,7 +2203,7 @@ static inline int lookup_chain_cache(struct task_struct *curr,* Important for check_no_collision(). */ if (unlikely (nr_chain_hlocks >MAX_LOCKDEP_CHAIN_HLOCKS )) { -if (debug_locks_off_graph_unlock ()) +if (!debug_locks_off_graph_unlock ())return 0 ;print_lockdep_off ("BUG: MAX_LOCKDEP_CHAIN_HLOCKS too low!" );
kernel/locking/locktorture.c +73 -0
85 lines not on this page · raw message
kernel/locking/mutex-debug.h +0 -17
@@ -26,20 +26,3 @@ extern void mutex_remove_waiter(struct mutex *lock, struct mutex_waiter *waiter,extern void debug_mutex_unlock (struct mutex *lock);extern void debug_mutex_init (struct mutex *lock,const char *name,struct lock_class_key *key); - -#define spin_lock_mutex (lock, flags) \ - do { \ - struct mutex *l = container_of(lock, struct mutex, wait_lock); \ - \ - DEBUG_LOCKS_WARN_ON(in_interrupt()); \ - local_irq_save(flags); \ - arch_spin_lock(&(lock)->rlock.raw_lock);\ - DEBUG_LOCKS_WARN_ON(l->magic != l); \ - } while (0) - -#define spin_unlock_mutex (lock, flags) \ - do { \ - arch_spin_unlock(&(lock)->rlock.raw_lock); \ - local_irq_restore(flags); \ - preempt_check_resched(); \ - } while (0)
kernel/locking/mutex.c +332 -184
599 lines not on this page · raw message
kernel/locking/spinlock_debug.c +5 -81
86 lines not on this page · raw message
kernel/locking/test-ww_mutex.c new file +646 -0
646 lines not on this page · raw message
net/sunrpc/xprtrdma/svc_rdma_transport.c +2 -2
Lines of this file are not shown. View the raw message.
tools/testing/selftests/locking/ww_mutex.sh new file +10 -0
Lines of this file are not shown. View the raw message.
tools/testing/selftests/rcutorture/configs/lock/CFLIST +1 -0
Lines of this file are not shown. View the raw message.
tools/testing/selftests/rcutorture/configs/lock/LOCK07 new file +6 -0
Lines of this file are not shown. View the raw message.
tools/testing/selftests/rcutorture/configs/lock/LOCK07.boot new file +1 -0
Lines of this file are not shown. View the raw message.
The rest of this diff is not shown. View the raw message.
Part of the diff is not shown here. View the raw message.
Quoted 7 lines · Ingo Molnar
Linus,
Please pull the latest locking-core-for-linus git tree from:
git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.gitlocking-core-for-linus# HEAD:
bc88c10d7e6900916f5e1ba3829d66a9de92b633locking/spinlock/debug: Remove spinlock lockup detection code
Hm, Peter just reminded me that I forgot to apply a fix that squashes a boot time warning on some x86 CPUs.
I've pushed a new version with that single commit (95cb64c1fe6) appended, the updated diffstat and shortlog is below:
git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git locking-core-for-linus
# HEAD: 95cb64c1fe61e70685a95f6260c8e9cd219fe08c fork: Fix task_struct alignment
... sorry about this!
Thanks,
Ingo
------------------>
Andy Shevchenko (1):
locking/jump_labels: Update bug_at() boot message
Byungchul Park (1):
lockdep: Fix incorrect condition to print bug msgs for MAX_LOCKDEP_CHAIN_HLOCKS
Chris Wilson (8):
locking/ww_mutex: Fix compilation of __WW_MUTEX_INITIALIZER locking/ww_mutex: Add ww_mutex to locktorture test locking/ww_mutex: Begin kselftests for ww_mutex locking/ww_mutex: Add kselftests for ww_mutex AA deadlock detection locking/ww_mutex: Add kselftests for ww_mutex ABBA deadlock detection locking/ww_mutex: Add kselftests for resolving ww_mutex cyclic deadlocks locking/ww_mutex: Add kselftests for ww_mutex stress locking/ww_mutex: Add ww_mutex to tools/testing/selftests
Davidlohr Bueso (8):
kernel/exit: Compute 'current' directly drivers/tty: Compute 'current' directly kernel/locking: Compute 'current' directly sched/core: Remove set_task_state() sched/wait, RCU: Introduce rcuwait machinery locking/percpu-rwsem: Replace waitqueue with rcuwait sched/wait, rcuwait: Fix typo in comment sched/wake_q: Clarify queue reinit comment
Ingo Molnar (1):
locking/ww_mutex: Turn off __must_check for now
Kees Cook (1):
lkdtm: Convert to refcount_t testing
Luis R. Rodriguez (1):
jump_labels: Move header guard #endif down where it belongs
Nicolai Hähnle (10):
locking/ww_mutex: Extract stamp comparison to __ww_mutex_stamp_after() locking/ww_mutex: Set use_ww_ctx even when locking without a context locking/ww_mutex: Remove the __ww_mutex_lock*() inline wrappers
locking/ww_mutex: Add waiters in stamp order
locking/ww_mutex: Notify waiters that have to back off while adding tasks to wait list locking/ww_mutex: Optimize ww-mutexes by waking at most one waiter for backoff when acquiring the lock locking/ww_mutex: Re-check ww->ctx in the inner optimistic spin loop locking/ww_mutex: Optimize ww-mutexes by yielding to other waiters from optimistic spin locking/mutex: Initialize mutex_waiter::ww_ctx with poison when debugging locking/ww_mutex/Documentation: Update the design document
Pan Xinhui (1):
locking/pvqspinlock: Don't wait if vCPU is preempted
Peter Zijlstra (12):
locking/mutex: Fix mutex handoff locking/mutex: Improve inlining locking/atomic, kref: Add KREF_INIT() locking/atomic, kref: Add kref_read() locking/atomic, kref: Kill kref_sub() locking/atomic, kref: Use kref_get_unless_zero() more locking/atomic, kref: Avoid more abuse locking/atomic, kref: Implement kref_put_lock() locking/mutex: Fix lockdep_assert_held() fail
refcount_t: Introduce a special purpose refcount type
kref: Implement 'struct kref' using refcount_t
fork: Fix task_struct alignment
Steven Rostedt (VMware) (1):
locking/rtmutex: Flip unlikely() branch to likely() in __rt_mutex_slowlock()
Waiman Long (5):
locking/spinlocks: Remove the unused spin_lock_bh_nested() API locking/spinlocks/x86, paravirt: Remove paravirt_ticketlocks_enabled locking/rwsem: Remove unnecessary atomic_long_t casts locking/rwsem: Reinit wake_q after use locking/spinlock/debug: Remove spinlock lockup detection code
Documentation/locking/ww-mutex-design.txt | 12 +- arch/um/drivers/random.c | 2 +- arch/x86/include/asm/spinlock.h | 3 - arch/x86/kernel/jump_label.c | 3 +- arch/x86/kernel/kvm.c | 14 - arch/x86/kernel/paravirt-spinlocks.c | 3 - arch/x86/xen/spinlock.c | 19 - drivers/block/drbd/drbd_bitmap.c | 2 +- drivers/block/drbd/drbd_main.c | 7 +- drivers/block/drbd/drbd_req.c | 31 +- drivers/block/rbd.c | 8 +- drivers/block/virtio_blk.c | 2 +- drivers/gpu/drm/drm_gem_cma_helper.c | 2 +- drivers/gpu/drm/drm_info.c | 2 +- drivers/gpu/drm/drm_mode_object.c | 4 +- drivers/gpu/drm/etnaviv/etnaviv_gem.c | 2 +- drivers/gpu/drm/i915/i915_gem_object.h | 2 +- drivers/gpu/drm/msm/msm_gem.c | 2 +- drivers/gpu/drm/nouveau/nouveau_fence.c | 2 +- drivers/gpu/drm/omapdrm/omap_gem.c | 2 +- drivers/gpu/drm/ttm/ttm_bo.c | 63 +- drivers/gpu/drm/ttm/ttm_execbuf_util.c | 4 +- drivers/gpu/drm/ttm/ttm_object.c | 2 +- drivers/infiniband/hw/cxgb3/iwch_cm.h | 6 +- drivers/infiniband/hw/cxgb3/iwch_qp.c | 2 +- drivers/infiniband/hw/cxgb4/iw_cxgb4.h | 6 +- drivers/infiniband/hw/cxgb4/qp.c | 2 +- drivers/infiniband/hw/usnic/usnic_ib_sysfs.c | 6 +- drivers/infiniband/hw/usnic/usnic_ib_verbs.c | 4 +- drivers/md/dm-bufio.c | 2 +- drivers/md/dm-crypt.c | 4 +- drivers/md/persistent-data/dm-block-manager.c | 4 +- drivers/misc/genwqe/card_dev.c | 2 +- drivers/misc/lkdtm.h | 8 +- drivers/misc/lkdtm_bugs.c | 87 ++- drivers/misc/lkdtm_core.c | 8 +- drivers/misc/mei/debugfs.c | 2 +- drivers/pci/hotplug/pnv_php.c | 2 +- drivers/pci/slot.c | 2 +- drivers/scsi/bnx2fc/bnx2fc_io.c | 8 +- drivers/scsi/cxgbi/libcxgbi.h | 4 +- drivers/scsi/lpfc/lpfc_debugfs.c | 2 +- drivers/scsi/lpfc/lpfc_els.c | 2 +- drivers/scsi/lpfc/lpfc_hbadisc.c | 40 +- drivers/scsi/lpfc/lpfc_init.c | 3 +- drivers/scsi/qla2xxx/tcm_qla2xxx.c | 4 +- drivers/staging/android/ion/ion.c | 2 +- drivers/staging/comedi/comedi_buf.c | 2 +- .../staging/lustre/lnet/libcfs/linux/linux-debug.c | 2 +- drivers/target/target_core_pr.c | 10 +- drivers/target/tcm_fc/tfc_sess.c | 2 +- drivers/tty/tty_ldsem.c | 18 +- drivers/usb/gadget/function/f_fs.c | 2 +- drivers/usb/mon/mon_main.c | 2 +- fs/exofs/sys.c | 2 +- fs/fuse/fuse_i.h | 2 +- fs/ocfs2/cluster/netdebug.c | 2 +- fs/ocfs2/cluster/tcp.c | 2 +- fs/ocfs2/dlm/dlmdebug.c | 12 +- fs/ocfs2/dlm/dlmdomain.c | 2 +- fs/ocfs2/dlm/dlmmaster.c | 8 +- fs/ocfs2/dlm/dlmunlock.c | 2 +- include/asm-generic/rwsem.h | 13 +- include/drm/drm_framebuffer.h | 2 +- include/drm/ttm/ttm_bo_api.h | 15 +- include/drm/ttm/ttm_bo_driver.h | 4 +- include/linux/jump_label.h | 4 +- include/linux/kref.h | 78 +-- include/linux/mutex.h | 5 +- include/linux/percpu-rwsem.h | 8 +- include/linux/poison.h | 1 + include/linux/rcuwait.h | 63 ++ include/linux/refcount.h | 294 ++++++++++ include/linux/sched.h | 37 +- include/linux/spinlock.h | 8 - include/linux/spinlock_api_smp.h | 2 - include/linux/spinlock_api_up.h | 1 - include/linux/sunrpc/cache.h | 2 +- include/linux/ww_mutex.h | 32 +- include/net/bluetooth/hci_core.h | 4 +- init/version.c | 4 +- kernel/exit.c | 52 +- kernel/fork.c | 6 +- kernel/locking/Makefile | 1 + kernel/locking/lockdep.c | 2 +- kernel/locking/locktorture.c | 73 +++ kernel/locking/mutex-debug.h | 17 - kernel/locking/mutex.c | 516 ++++++++++------ kernel/locking/mutex.h | 4 - kernel/locking/percpu-rwsem.c | 7 +- kernel/locking/qspinlock_paravirt.h | 2 +- kernel/locking/rtmutex.c | 2 +- kernel/locking/rwsem-spinlock.c | 18 +- kernel/locking/rwsem-xadd.c | 14 +- kernel/locking/semaphore.c | 7 +- kernel/locking/spinlock.c | 8 - kernel/locking/spinlock_debug.c | 86 +-- kernel/locking/test-ww_mutex.c | 646 +++++++++++++++++++++ kernel/pid.c | 4 +- lib/Kconfig.debug | 25 + net/bluetooth/6lowpan.c | 2 +- net/bluetooth/a2mp.c | 4 +- net/bluetooth/amp.c | 4 +- net/bluetooth/l2cap_core.c | 4 +- net/ceph/messenger.c | 4 +- net/ceph/osd_client.c | 10 +- net/sunrpc/cache.c | 2 +- net/sunrpc/svc_xprt.c | 6 +- net/sunrpc/svcauth.c | 15 +- net/sunrpc/xprtrdma/svc_rdma_transport.c | 4 +- security/apparmor/include/apparmor.h | 6 - security/apparmor/include/policy.h | 4 +- tools/testing/selftests/locking/ww_mutex.sh | 10 + .../selftests/rcutorture/configs/lock/CFLIST | 1 + .../selftests/rcutorture/configs/lock/LOCK07 | 6 + .../selftests/rcutorture/configs/lock/LOCK07.boot | 1 + 116 files changed, 1864 insertions(+), 761 deletions(-) create mode 100644 include/linux/rcuwait.h create mode 100644 include/linux/refcount.h create mode 100644 kernel/locking/test-ww_mutex.c create mode 100644 tools/testing/selftests/locking/ww_mutex.sh create mode 100644 tools/testing/selftests/rcutorture/configs/lock/LOCK07 create mode 100644 tools/testing/selftests/rcutorture/configs/lock/LOCK07.boot
[ ... ]
Quoted 3 lines · Ingo Molnar
- Implement wraparound-safe
refcount_tandkref_ttypes based on generic atomic primitives (Peter Zijlstra)
Ugh. This apparently never got the uninlining fixes?
I've pulled it, but I still don't like the inlining. Particularly with CONFIG_DEBUG_REFCOUNT it generates obnnoxious code, but even without the debugging there's just no point in it.
Being inlined also means that architectures cannot optimize it, which is sad. If you have a LL/SC model for atomics, then using atomic_cmpxchg_relaxed() for the refcounting is just too stupid for words.
So I continue to think this code should
(a) be in lib/refcount.c, with just the declarations in the header
file (oh, keep the "set" and "read" functions inline by all means)
(b) be marked __weak, so that architectures like ARM/PPC can decide
to do their own improved implementations.
But as mentioned, it's in my tree as-is now and going through the build test.
Linus
Quoted 6 lines · Linus Torvalds
Quoted 3 lines · Ingo Molnar
- Implement wraparound-safe
refcount_tandkref_ttypes based on generic atomic primitives (Peter Zijlstra)Ugh. This apparently never got the uninlining fixes?
Yeah, will fix it ASAP!
Quoted 9 lines
I've pulled it, but I still don't like the inlining. Particularly with
CONFIG_DEBUG_REFCOUNTit generates obnnoxious code, but even without the debugging there's just no point in it.Being inlined also means that architectures cannot optimize it, which is sad. If you have a LL/SC model for atomics, then using
atomic_cmpxchg_relaxed()for the refcounting is just too stupid for words.
Quoted 7 lines
So I continue to think this code should
(a) be in
lib/refcount.c, with just the declarations in the header
file (oh, keep the "set" and "read" functions inline by all means)(b) be marked
__weak, so that architectures like ARM/PPC can decide
to do their own improved implementations.
Yeah, agreed, will do.
Quoted 1 line
But as mentioned, it's in my tree as-is now and going through the build test.
Thanks!
Ingo