Commit 6a13a857 authored by Linus Torvalds's avatar Linus Torvalds

Merge branch 'for-linus' of git://git390.osdl.marist.edu/pub/scm/linux-2.6

* 'for-linus' of git://git390.osdl.marist.edu/pub/scm/linux-2.6:
  [S390] update default configuration
  [S390] cio: update documentation.
  [S390] dasd: clean up timer.
  [S390] Fix pte type checking.
  [S390] monwriter find header logic.
  [S390] cio: sch_no -> schid.sch_no conversion.
  [S390] Wire up epoll_pwait syscall.
  [S390] cio: invalid device operational notification
  [S390] fix vmlinux link when CONFIG_SYSIPC=n
parents 3bee9df0 ce9b18f5
...@@ -66,7 +66,7 @@ Command line parameters ...@@ -66,7 +66,7 @@ Command line parameters
When a device is un-ignored, device recognition and sensing is performed and When a device is un-ignored, device recognition and sensing is performed and
the device driver will be notified if possible, so the device will become the device driver will be notified if possible, so the device will become
available to the system. available to the system. Note that un-ignoring is performed asynchronously.
You can also add ranges of devices to be ignored by piping to You can also add ranges of devices to be ignored by piping to
/proc/cio_ignore; "add <device range>, <device range>, ..." will ignore the /proc/cio_ignore; "add <device range>, <device range>, ..." will ignore the
......
...@@ -174,14 +174,10 @@ read_dev_chars() - Read Device Characteristics ...@@ -174,14 +174,10 @@ read_dev_chars() - Read Device Characteristics
This routine returns the characteristics for the device specified. This routine returns the characteristics for the device specified.
The function is meant to be called with an irq handler in place; that is, The function is meant to be called with the device already enabled; that is,
at earliest during set_online() processing. at earliest during set_online() processing.
While the request is processed synchronously, the device interrupt The ccw_device must not be locked prior to calling read_dev_chars().
handler is called for final ending status. In case of error situations the
interrupt handler may recover appropriately. The device irq handler can
recognize the corresponding interrupts by the interruption parameter be
0x00524443. The ccw_device must not be locked prior to calling read_dev_chars().
The function may be called enabled or disabled. The function may be called enabled or disabled.
...@@ -410,26 +406,7 @@ individual flag meanings. ...@@ -410,26 +406,7 @@ individual flag meanings.
Usage Notes : Usage Notes :
Prior to call ccw_device_start() the device driver must assure disabled state, ccw_device_start() must be called disabled and with the ccw device lock held.
i.e. the I/O mask value in the PSW must be disabled. This can be accomplished
by calling local_save_flags( flags). The current PSW flags are preserved and
can be restored by local_irq_restore( flags) at a later time.
If the device driver violates this rule while running in a uni-processor
environment an interrupt might be presented prior to the ccw_device_start()
routine returning to the device driver main path. In this case we will end in a
deadlock situation as the interrupt handler will try to obtain the irq
lock the device driver still owns (see below) !
The driver must assure to hold the device specific lock. This can be
accomplished by
(i) spin_lock(get_ccwdev_lock(cdev)), or
(ii) spin_lock_irqsave(get_ccwdev_lock(cdev), flags)
Option (i) should be used if the calling routine is running disabled for
I/O interrupts (see above) already. Option (ii) obtains the device gate und
puts the CPU into I/O disabled state by preserving the current PSW flags.
The device driver is allowed to issue the next ccw_device_start() call from The device driver is allowed to issue the next ccw_device_start() call from
within its interrupt handler already. It is not required to schedule a within its interrupt handler already. It is not required to schedule a
...@@ -488,7 +465,7 @@ int ccw_device_resume(struct ccw_device *cdev); ...@@ -488,7 +465,7 @@ int ccw_device_resume(struct ccw_device *cdev);
cdev - ccw_device the resume operation is requested for cdev - ccw_device the resume operation is requested for
The resume_IO() function returns: The ccw_device_resume() function returns:
0 - suspended channel program is resumed 0 - suspended channel program is resumed
-EBUSY - status pending -EBUSY - status pending
...@@ -507,6 +484,8 @@ a long-running channel program or the device might require to initially issue ...@@ -507,6 +484,8 @@ a long-running channel program or the device might require to initially issue
a halt subchannel (HSCH) I/O command. For those purposes the ccw_device_halt() a halt subchannel (HSCH) I/O command. For those purposes the ccw_device_halt()
command is provided. command is provided.
ccw_device_halt() must be called disabled and with the ccw device lock held.
int ccw_device_halt(struct ccw_device *cdev, int ccw_device_halt(struct ccw_device *cdev,
unsigned long intparm); unsigned long intparm);
...@@ -517,7 +496,7 @@ intparm : interruption parameter; value is only used if no I/O ...@@ -517,7 +496,7 @@ intparm : interruption parameter; value is only used if no I/O
The ccw_device_halt() function returns : The ccw_device_halt() function returns :
0 - successful completion or request successfully initiated 0 - request successfully initiated
-EBUSY - the device is currently busy, or status pending. -EBUSY - the device is currently busy, or status pending.
-ENODEV - cdev invalid. -ENODEV - cdev invalid.
-EINVAL - The device is not operational or the ccw device is not online. -EINVAL - The device is not operational or the ccw device is not online.
...@@ -533,6 +512,23 @@ can then perform an appropriate action. Prior to interrupt of an outstanding ...@@ -533,6 +512,23 @@ can then perform an appropriate action. Prior to interrupt of an outstanding
read to a network device (with or without PCI flag) a ccw_device_halt() read to a network device (with or without PCI flag) a ccw_device_halt()
is required to end the pending operation. is required to end the pending operation.
ccw_device_clear() - Terminage I/O Request Processing
In order to terminate all I/O processing at the subchannel, the clear subchannel
(CSCH) command is used. It can be issued via ccw_device_clear().
ccw_device_clear() must be called disabled and with the ccw device lock held.
int ccw_device_clear(struct ccw_device *cdev, unsigned long intparm);
cdev: ccw_device the clear operation is requested for
intparm: interruption parameter (see ccw_device_halt())
The ccw_device_clear() function returns:
0 - request successfully initiated
-ENODEV - cdev invalid
-EINVAL - The device is not operational or the ccw device is not online.
Miscellaneous Support Routines Miscellaneous Support Routines
......
...@@ -239,6 +239,9 @@ status - Can be 'online' or 'offline'. ...@@ -239,6 +239,9 @@ status - Can be 'online' or 'offline'.
type - The physical type of the channel path. type - The physical type of the channel path.
shared - Whether the channel path is shared.
cmg - The channel measurement group.
3. System devices 3. System devices
----------------- -----------------
......
# #
# Automatically generated make config: don't edit # Automatically generated make config: don't edit
# Linux kernel version: 2.6.18 # Linux kernel version: 2.6.19-rc2
# Wed Oct 4 19:45:46 2006 # Wed Oct 18 17:11:10 2006
# #
CONFIG_MMU=y CONFIG_MMU=y
CONFIG_LOCKDEP_SUPPORT=y CONFIG_LOCKDEP_SUPPORT=y
...@@ -211,6 +211,7 @@ CONFIG_INET6_XFRM_MODE_TRANSPORT=y ...@@ -211,6 +211,7 @@ CONFIG_INET6_XFRM_MODE_TRANSPORT=y
CONFIG_INET6_XFRM_MODE_TUNNEL=y CONFIG_INET6_XFRM_MODE_TUNNEL=y
CONFIG_INET6_XFRM_MODE_BEET=y CONFIG_INET6_XFRM_MODE_BEET=y
# CONFIG_INET6_XFRM_MODE_ROUTEOPTIMIZATION is not set # CONFIG_INET6_XFRM_MODE_ROUTEOPTIMIZATION is not set
CONFIG_IPV6_SIT=y
# CONFIG_IPV6_TUNNEL is not set # CONFIG_IPV6_TUNNEL is not set
# CONFIG_IPV6_SUBTREES is not set # CONFIG_IPV6_SUBTREES is not set
# CONFIG_IPV6_MULTIPLE_TABLES is not set # CONFIG_IPV6_MULTIPLE_TABLES is not set
...@@ -528,6 +529,7 @@ CONFIG_EXT3_FS=y ...@@ -528,6 +529,7 @@ CONFIG_EXT3_FS=y
CONFIG_EXT3_FS_XATTR=y CONFIG_EXT3_FS_XATTR=y
# CONFIG_EXT3_FS_POSIX_ACL is not set # CONFIG_EXT3_FS_POSIX_ACL is not set
# CONFIG_EXT3_FS_SECURITY is not set # CONFIG_EXT3_FS_SECURITY is not set
# CONFIG_EXT4DEV_FS is not set
CONFIG_JBD=y CONFIG_JBD=y
# CONFIG_JBD_DEBUG is not set # CONFIG_JBD_DEBUG is not set
CONFIG_FS_MBCACHE=y CONFIG_FS_MBCACHE=y
...@@ -645,10 +647,6 @@ CONFIG_MSDOS_PARTITION=y ...@@ -645,10 +647,6 @@ CONFIG_MSDOS_PARTITION=y
# #
# CONFIG_NLS is not set # CONFIG_NLS is not set
#
# Distributed Lock Manager
#
# #
# Instrumentation Support # Instrumentation Support
# #
...@@ -669,7 +667,6 @@ CONFIG_MAGIC_SYSRQ=y ...@@ -669,7 +667,6 @@ CONFIG_MAGIC_SYSRQ=y
# CONFIG_UNUSED_SYMBOLS is not set # CONFIG_UNUSED_SYMBOLS is not set
CONFIG_DEBUG_KERNEL=y CONFIG_DEBUG_KERNEL=y
CONFIG_LOG_BUF_SHIFT=17 CONFIG_LOG_BUF_SHIFT=17
# CONFIG_DETECT_SOFTLOCKUP is not set
# CONFIG_SCHEDSTATS is not set # CONFIG_SCHEDSTATS is not set
# CONFIG_DEBUG_SLAB is not set # CONFIG_DEBUG_SLAB is not set
CONFIG_DEBUG_PREEMPT=y CONFIG_DEBUG_PREEMPT=y
...@@ -690,6 +687,7 @@ CONFIG_DEBUG_FS=y ...@@ -690,6 +687,7 @@ CONFIG_DEBUG_FS=y
# CONFIG_FRAME_POINTER is not set # CONFIG_FRAME_POINTER is not set
# CONFIG_UNWIND_INFO is not set # CONFIG_UNWIND_INFO is not set
CONFIG_FORCED_INLINING=y CONFIG_FORCED_INLINING=y
CONFIG_HEADERS_CHECK=y
# CONFIG_RCU_TORTURE_TEST is not set # CONFIG_RCU_TORTURE_TEST is not set
# CONFIG_LKDTM is not set # CONFIG_LKDTM is not set
......
...@@ -295,6 +295,7 @@ static inline long put_tv32(struct compat_timeval __user *o, struct timeval *i) ...@@ -295,6 +295,7 @@ static inline long put_tv32(struct compat_timeval __user *o, struct timeval *i)
* *
* This is really horribly ugly. * This is really horribly ugly.
*/ */
#ifdef CONFIG_SYSVIPC
asmlinkage long sys32_ipc(u32 call, int first, int second, int third, u32 ptr) asmlinkage long sys32_ipc(u32 call, int first, int second, int third, u32 ptr)
{ {
if (call >> 16) /* hack for backward compatibility */ if (call >> 16) /* hack for backward compatibility */
...@@ -338,6 +339,7 @@ asmlinkage long sys32_ipc(u32 call, int first, int second, int third, u32 ptr) ...@@ -338,6 +339,7 @@ asmlinkage long sys32_ipc(u32 call, int first, int second, int third, u32 ptr)
return -ENOSYS; return -ENOSYS;
} }
#endif
asmlinkage long sys32_truncate64(const char __user * path, unsigned long high, unsigned long low) asmlinkage long sys32_truncate64(const char __user * path, unsigned long high, unsigned long low)
{ {
......
...@@ -320,3 +320,4 @@ SYSCALL(sys_tee,sys_tee,sys_tee_wrapper) ...@@ -320,3 +320,4 @@ SYSCALL(sys_tee,sys_tee,sys_tee_wrapper)
SYSCALL(sys_vmsplice,sys_vmsplice,compat_sys_vmsplice_wrapper) SYSCALL(sys_vmsplice,sys_vmsplice,compat_sys_vmsplice_wrapper)
NI_SYSCALL /* 310 sys_move_pages */ NI_SYSCALL /* 310 sys_move_pages */
SYSCALL(sys_getcpu,sys_getcpu,sys_getcpu_wrapper) SYSCALL(sys_getcpu,sys_getcpu,sys_getcpu_wrapper)
SYSCALL(sys_epoll_pwait,sys_epoll_pwait,sys_ni_syscall)
...@@ -203,6 +203,7 @@ dasd_state_basic_to_known(struct dasd_device * device) ...@@ -203,6 +203,7 @@ dasd_state_basic_to_known(struct dasd_device * device)
rc = dasd_flush_ccw_queue(device, 1); rc = dasd_flush_ccw_queue(device, 1);
if (rc) if (rc)
return rc; return rc;
dasd_clear_timer(device);
DBF_DEV_EVENT(DBF_EMERG, device, "%p debug area deleted", device); DBF_DEV_EVENT(DBF_EMERG, device, "%p debug area deleted", device);
if (device->debug_area != NULL) { if (device->debug_area != NULL) {
......
...@@ -73,12 +73,15 @@ static inline struct mon_buf *monwrite_find_hdr(struct mon_private *monpriv, ...@@ -73,12 +73,15 @@ static inline struct mon_buf *monwrite_find_hdr(struct mon_private *monpriv,
struct mon_buf *entry, *next; struct mon_buf *entry, *next;
list_for_each_entry_safe(entry, next, &monpriv->list, list) list_for_each_entry_safe(entry, next, &monpriv->list, list)
if (entry->hdr.applid == monhdr->applid && if ((entry->hdr.mon_function == monhdr->mon_function ||
monhdr->mon_function == MONWRITE_STOP_INTERVAL) &&
entry->hdr.applid == monhdr->applid &&
entry->hdr.record_num == monhdr->record_num && entry->hdr.record_num == monhdr->record_num &&
entry->hdr.version == monhdr->version && entry->hdr.version == monhdr->version &&
entry->hdr.release == monhdr->release && entry->hdr.release == monhdr->release &&
entry->hdr.mod_level == monhdr->mod_level) entry->hdr.mod_level == monhdr->mod_level)
return entry; return entry;
return NULL; return NULL;
} }
...@@ -92,6 +95,8 @@ static int monwrite_new_hdr(struct mon_private *monpriv) ...@@ -92,6 +95,8 @@ static int monwrite_new_hdr(struct mon_private *monpriv)
monhdr->mon_function > MONWRITE_START_CONFIG || monhdr->mon_function > MONWRITE_START_CONFIG ||
monhdr->hdrlen != sizeof(struct monwrite_hdr)) monhdr->hdrlen != sizeof(struct monwrite_hdr))
return -EINVAL; return -EINVAL;
monbuf = NULL;
if (monhdr->mon_function != MONWRITE_GEN_EVENT)
monbuf = monwrite_find_hdr(monpriv, monhdr); monbuf = monwrite_find_hdr(monpriv, monhdr);
if (monbuf) { if (monbuf) {
if (monhdr->mon_function == MONWRITE_STOP_INTERVAL) { if (monhdr->mon_function == MONWRITE_STOP_INTERVAL) {
...@@ -104,7 +109,7 @@ static int monwrite_new_hdr(struct mon_private *monpriv) ...@@ -104,7 +109,7 @@ static int monwrite_new_hdr(struct mon_private *monpriv)
kfree(monbuf); kfree(monbuf);
monbuf = NULL; monbuf = NULL;
} }
} else { } else if (monhdr->mon_function != MONWRITE_STOP_INTERVAL) {
if (mon_buf_count >= mon_max_bufs) if (mon_buf_count >= mon_max_bufs)
return -ENOSPC; return -ENOSPC;
monbuf = kzalloc(sizeof(struct mon_buf), GFP_KERNEL); monbuf = kzalloc(sizeof(struct mon_buf), GFP_KERNEL);
...@@ -118,6 +123,7 @@ static int monwrite_new_hdr(struct mon_private *monpriv) ...@@ -118,6 +123,7 @@ static int monwrite_new_hdr(struct mon_private *monpriv)
} }
monbuf->hdr = *monhdr; monbuf->hdr = *monhdr;
list_add_tail(&monbuf->list, &monpriv->list); list_add_tail(&monbuf->list, &monpriv->list);
if (monhdr->mon_function != MONWRITE_GEN_EVENT)
mon_buf_count++; mon_buf_count++;
} }
monpriv->current_buf = monbuf; monpriv->current_buf = monbuf;
......
...@@ -578,9 +578,13 @@ ccw_device_verify_done(struct ccw_device *cdev, int err) ...@@ -578,9 +578,13 @@ ccw_device_verify_done(struct ccw_device *cdev, int err)
} }
break; break;
case -ETIME: case -ETIME:
/* Reset oper notify indication after verify error. */
cdev->private->flags.donotify = 0;
ccw_device_done(cdev, DEV_STATE_BOXED); ccw_device_done(cdev, DEV_STATE_BOXED);
break; break;
default: default:
/* Reset oper notify indication after verify error. */
cdev->private->flags.donotify = 0;
PREPARE_WORK(&cdev->private->kick_work, PREPARE_WORK(&cdev->private->kick_work,
ccw_device_nopath_notify, cdev); ccw_device_nopath_notify, cdev);
queue_work(ccw_device_notify_work, &cdev->private->kick_work); queue_work(ccw_device_notify_work, &cdev->private->kick_work);
......
...@@ -3529,7 +3529,7 @@ do_QDIO(struct ccw_device *cdev,unsigned int callflags, ...@@ -3529,7 +3529,7 @@ do_QDIO(struct ccw_device *cdev,unsigned int callflags,
#ifdef CONFIG_QDIO_DEBUG #ifdef CONFIG_QDIO_DEBUG
char dbf_text[20]; char dbf_text[20];
sprintf(dbf_text,"doQD%04x",cdev->private->sch_no); sprintf(dbf_text,"doQD%04x",cdev->private->schid.sch_no);
QDIO_DBF_TEXT3(0,trace,dbf_text); QDIO_DBF_TEXT3(0,trace,dbf_text);
#endif /* CONFIG_QDIO_DEBUG */ #endif /* CONFIG_QDIO_DEBUG */
......
...@@ -200,18 +200,45 @@ extern char empty_zero_page[PAGE_SIZE]; ...@@ -200,18 +200,45 @@ extern char empty_zero_page[PAGE_SIZE];
*/ */
/* Hardware bits in the page table entry */ /* Hardware bits in the page table entry */
#define _PAGE_RO 0x200 /* HW read-only */ #define _PAGE_RO 0x200 /* HW read-only bit */
#define _PAGE_INVALID 0x400 /* HW invalid */ #define _PAGE_INVALID 0x400 /* HW invalid bit */
#define _PAGE_SWT 0x001 /* SW pte type bit t */
#define _PAGE_SWX 0x002 /* SW pte type bit x */
/* Mask and six different types of pages. */ /* Six different types of pages. */
#define _PAGE_TYPE_MASK 0x601
#define _PAGE_TYPE_EMPTY 0x400 #define _PAGE_TYPE_EMPTY 0x400
#define _PAGE_TYPE_NONE 0x401 #define _PAGE_TYPE_NONE 0x401
#define _PAGE_TYPE_SWAP 0x600 #define _PAGE_TYPE_SWAP 0x403
#define _PAGE_TYPE_FILE 0x601 #define _PAGE_TYPE_FILE 0x601 /* bit 0x002 is used for offset !! */
#define _PAGE_TYPE_RO 0x200 #define _PAGE_TYPE_RO 0x200
#define _PAGE_TYPE_RW 0x000 #define _PAGE_TYPE_RW 0x000
/*
* PTE type bits are rather complicated. handle_pte_fault uses pte_present,
* pte_none and pte_file to find out the pte type WITHOUT holding the page
* table lock. ptep_clear_flush on the other hand uses ptep_clear_flush to
* invalidate a given pte. ipte sets the hw invalid bit and clears all tlbs
* for the page. The page table entry is set to _PAGE_TYPE_EMPTY afterwards.
* This change is done while holding the lock, but the intermediate step
* of a previously valid pte with the hw invalid bit set can be observed by
* handle_pte_fault. That makes it necessary that all valid pte types with
* the hw invalid bit set must be distinguishable from the four pte types
* empty, none, swap and file.
*
* irxt ipte irxt
* _PAGE_TYPE_EMPTY 1000 -> 1000
* _PAGE_TYPE_NONE 1001 -> 1001
* _PAGE_TYPE_SWAP 1011 -> 1011
* _PAGE_TYPE_FILE 11?1 -> 11?1
* _PAGE_TYPE_RO 0100 -> 1100
* _PAGE_TYPE_RW 0000 -> 1000
*
* pte_none is true for bits combinations 1000, 1100
* pte_present is true for bits combinations 0000, 0010, 0100, 0110, 1001
* pte_file is true for bits combinations 1101, 1111
* swap pte is 1011 and 0001, 0011, 0101, 0111, 1010 and 1110 are invalid.
*/
#ifndef __s390x__ #ifndef __s390x__
/* Bits in the segment table entry */ /* Bits in the segment table entry */
...@@ -365,18 +392,21 @@ static inline int pmd_bad(pmd_t pmd) ...@@ -365,18 +392,21 @@ static inline int pmd_bad(pmd_t pmd)
static inline int pte_none(pte_t pte) static inline int pte_none(pte_t pte)
{ {
return (pte_val(pte) & _PAGE_TYPE_MASK) == _PAGE_TYPE_EMPTY; return (pte_val(pte) & _PAGE_INVALID) && !(pte_val(pte) & _PAGE_SWT);
} }
static inline int pte_present(pte_t pte) static inline int pte_present(pte_t pte)
{ {
return !(pte_val(pte) & _PAGE_INVALID) || unsigned long mask = _PAGE_RO | _PAGE_INVALID | _PAGE_SWT | _PAGE_SWX;
(pte_val(pte) & _PAGE_TYPE_MASK) == _PAGE_TYPE_NONE; return (pte_val(pte) & mask) == _PAGE_TYPE_NONE ||
(!(pte_val(pte) & _PAGE_INVALID) &&
!(pte_val(pte) & _PAGE_SWT));
} }
static inline int pte_file(pte_t pte) static inline int pte_file(pte_t pte)
{ {
return (pte_val(pte) & _PAGE_TYPE_MASK) == _PAGE_TYPE_FILE; unsigned long mask = _PAGE_RO | _PAGE_INVALID | _PAGE_SWT;
return (pte_val(pte) & mask) == _PAGE_TYPE_FILE;
} }
#define pte_same(a,b) (pte_val(a) == pte_val(b)) #define pte_same(a,b) (pte_val(a) == pte_val(b))
......
...@@ -249,8 +249,9 @@ ...@@ -249,8 +249,9 @@
#define __NR_vmsplice 309 #define __NR_vmsplice 309
/* Number 310 is reserved for new sys_move_pages */ /* Number 310 is reserved for new sys_move_pages */
#define __NR_getcpu 311 #define __NR_getcpu 311
#define __NR_epoll_pwait 312
#define NR_syscalls 312 #define NR_syscalls 313
/* /*
* There are some system calls that are not present on 64 bit, some * There are some system calls that are not present on 64 bit, some
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment