diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2010-05-27 10:48:46 -0700 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2010-05-27 10:48:46 -0700 |
commit | cc106eb35ed4abea675bce0d8fe40a46ff0b4a72 (patch) | |
tree | 7d18624a769680049f2933ce48a02c8e08e5937c /arch/s390/include/asm | |
parent | 4e455c6782bd6bf6a0135c1e1c9f018ec191979e (diff) | |
parent | 3bfe68580a9d2a25465fc004986acd7991d700d1 (diff) |
Merge branch 'for-linus' of git://git390.marist.edu/pub/scm/linux-2.6
* 'for-linus' of git://git390.marist.edu/pub/scm/linux-2.6:
[S390] fill out file list in s390 MAINTAINERS entry
[S390] Add support for LZO-compressed kernels.
[S390] cmm: get rid of CMM_PROC config option
[S390] cmm: remove superfluous EXPORT_SYMBOLs plus cleanups
[S390] dasd: unit check handling during internal cio I/O
[S390] cio: unit check handling during internal I/O
[S390] ccwgroup: add locking around drvdata access
[S390] cio: remove stsch
[S390] spp: remove KVM_AWARE_CMF config option
[S390] kprobes: forbid probing of stnsm/stosm/epsw
[S390] spp: fix compilation for CONFIG_32BIT
[S390] atomic: implement atomic64_dec_if_positive
[S390] cmm: fix crash on module unload
Diffstat (limited to 'arch/s390/include/asm')
-rw-r--r-- | arch/s390/include/asm/atomic.h | 19 | ||||
-rw-r--r-- | arch/s390/include/asm/ccwdev.h | 10 |
2 files changed, 29 insertions, 0 deletions
diff --git a/arch/s390/include/asm/atomic.h b/arch/s390/include/asm/atomic.h index 451bfbb9db3..76daea11718 100644 --- a/arch/s390/include/asm/atomic.h +++ b/arch/s390/include/asm/atomic.h @@ -15,6 +15,7 @@ #include <linux/compiler.h> #include <linux/types.h> +#include <asm/system.h> #define ATOMIC_INIT(i) { (i) } @@ -274,6 +275,7 @@ static inline void atomic64_clear_mask(unsigned long long mask, atomic64_t *v) static inline int atomic64_add_unless(atomic64_t *v, long long a, long long u) { long long c, old; + c = atomic64_read(v); for (;;) { if (unlikely(c == u)) @@ -286,6 +288,23 @@ static inline int atomic64_add_unless(atomic64_t *v, long long a, long long u) return c != u; } +static inline long long atomic64_dec_if_positive(atomic64_t *v) +{ + long long c, old, dec; + + c = atomic64_read(v); + for (;;) { + dec = c - 1; + if (unlikely(dec < 0)) + break; + old = atomic64_cmpxchg((v), c, dec); + if (likely(old == c)) + break; + c = old; + } + return dec; +} + #define atomic64_add(_i, _v) atomic64_add_return(_i, _v) #define atomic64_add_negative(_i, _v) (atomic64_add_return(_i, _v) < 0) #define atomic64_inc(_v) atomic64_add_return(1, _v) diff --git a/arch/s390/include/asm/ccwdev.h b/arch/s390/include/asm/ccwdev.h index f4bd346a52d..1c0030f9b89 100644 --- a/arch/s390/include/asm/ccwdev.h +++ b/arch/s390/include/asm/ccwdev.h @@ -91,6 +91,14 @@ struct ccw_device { void (*handler) (struct ccw_device *, unsigned long, struct irb *); }; +/* + * Possible CIO actions triggered by the unit check handler. + */ +enum uc_todo { + UC_TODO_RETRY, + UC_TODO_RETRY_ON_NEW_PATH, + UC_TODO_STOP +}; /** * struct ccw driver - device driver for channel attached devices @@ -107,6 +115,7 @@ struct ccw_device { * @freeze: callback for freezing during hibernation snapshotting * @thaw: undo work done in @freeze * @restore: callback for restoring after hibernation + * @uc_handler: callback for unit check handler * @driver: embedded device driver structure * @name: device driver name */ @@ -124,6 +133,7 @@ struct ccw_driver { int (*freeze)(struct ccw_device *); int (*thaw) (struct ccw_device *); int (*restore)(struct ccw_device *); + enum uc_todo (*uc_handler) (struct ccw_device *, struct irb *); struct device_driver driver; char *name; }; |