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] More verbose show_mem() like other architectures. [S390] Make use of kretprobe_assert. [S390] Wire up signald, timerfd and eventfd syscalls. [S390] Wire up sys_utimensat. [S390] cio: Update documentation.
This commit is contained in:
commit
4b85df0419
@ -51,13 +51,8 @@ The major changes are:
|
|||||||
* The interrupt handlers must be adapted to use a ccw_device as argument.
|
* The interrupt handlers must be adapted to use a ccw_device as argument.
|
||||||
Moreover, they don't return a devstat, but an irb.
|
Moreover, they don't return a devstat, but an irb.
|
||||||
* Before initiating an io, the options must be set via ccw_device_set_options().
|
* Before initiating an io, the options must be set via ccw_device_set_options().
|
||||||
|
* Instead of calling read_dev_chars()/read_conf_data(), the driver issues
|
||||||
read_dev_chars()
|
the channel program and handles the interrupt itself.
|
||||||
read device characteristics
|
|
||||||
|
|
||||||
read_conf_data()
|
|
||||||
read_conf_data_lpm()
|
|
||||||
read configuration data.
|
|
||||||
|
|
||||||
ccw_device_get_ciw()
|
ccw_device_get_ciw()
|
||||||
get commands from extended sense data.
|
get commands from extended sense data.
|
||||||
@ -130,11 +125,6 @@ present their hardware status by the same (shared) IRQ, the operating system
|
|||||||
has to call every single device driver registered on this IRQ in order to
|
has to call every single device driver registered on this IRQ in order to
|
||||||
determine the device driver owning the device that raised the interrupt.
|
determine the device driver owning the device that raised the interrupt.
|
||||||
|
|
||||||
In order not to introduce a new I/O concept to the common Linux code,
|
|
||||||
Linux/390 preserves the IRQ concept and semantically maps the ESA/390
|
|
||||||
subchannels to Linux as IRQs. This allows Linux/390 to support up to 64k
|
|
||||||
different IRQs, uniquely representing a single device each.
|
|
||||||
|
|
||||||
Up to kernel 2.4, Linux/390 used to provide interfaces via the IRQ (subchannel).
|
Up to kernel 2.4, Linux/390 used to provide interfaces via the IRQ (subchannel).
|
||||||
For internal use of the common I/O layer, these are still there. However,
|
For internal use of the common I/O layer, these are still there. However,
|
||||||
device drivers should use the new calling interface via the ccw_device only.
|
device drivers should use the new calling interface via the ccw_device only.
|
||||||
@ -151,9 +141,8 @@ information during their initialization step to recognize the devices they
|
|||||||
support using the information saved in the struct ccw_device given to them.
|
support using the information saved in the struct ccw_device given to them.
|
||||||
This methods implies that Linux/390 doesn't require to probe for free (not
|
This methods implies that Linux/390 doesn't require to probe for free (not
|
||||||
armed) interrupt request lines (IRQs) to drive its devices with. Where
|
armed) interrupt request lines (IRQs) to drive its devices with. Where
|
||||||
applicable, the device drivers can use the read_dev_chars() to retrieve device
|
applicable, the device drivers can use issue the READ DEVICE CHARACTERISTICS
|
||||||
characteristics. This can be done without having to request device ownership
|
ccw to retrieve device characteristics in its online routine.
|
||||||
previously.
|
|
||||||
|
|
||||||
In order to allow for easy I/O initiation the CDS layer provides a
|
In order to allow for easy I/O initiation the CDS layer provides a
|
||||||
ccw_device_start() interface that takes a device specific channel program (one
|
ccw_device_start() interface that takes a device specific channel program (one
|
||||||
@ -170,69 +159,6 @@ SUBCHANNEL (HSCH) command without having pending I/O requests. This function is
|
|||||||
also covered by ccw_device_halt().
|
also covered by ccw_device_halt().
|
||||||
|
|
||||||
|
|
||||||
read_dev_chars() - Read Device Characteristics
|
|
||||||
|
|
||||||
This routine returns the characteristics for the device specified.
|
|
||||||
|
|
||||||
The function is meant to be called with the device already enabled; that is,
|
|
||||||
at earliest during set_online() processing.
|
|
||||||
|
|
||||||
The ccw_device must not be locked prior to calling read_dev_chars().
|
|
||||||
|
|
||||||
The function may be called enabled or disabled.
|
|
||||||
|
|
||||||
int read_dev_chars(struct ccw_device *cdev, void **buffer, int length );
|
|
||||||
|
|
||||||
cdev - the ccw_device the information is requested for.
|
|
||||||
buffer - pointer to a buffer pointer. The buffer pointer itself
|
|
||||||
must contain a valid buffer area.
|
|
||||||
length - length of the buffer provided.
|
|
||||||
|
|
||||||
The read_dev_chars() function returns :
|
|
||||||
|
|
||||||
0 - successful completion
|
|
||||||
-ENODEV - cdev invalid
|
|
||||||
-EINVAL - an invalid parameter was detected, or the function was called early.
|
|
||||||
-EBUSY - an irrecoverable I/O error occurred or the device is not
|
|
||||||
operational.
|
|
||||||
|
|
||||||
|
|
||||||
read_conf_data(), read_conf_data_lpm() - Read Configuration Data
|
|
||||||
|
|
||||||
Retrieve the device dependent configuration data. Please have a look at your
|
|
||||||
device dependent I/O commands for the device specific layout of the node
|
|
||||||
descriptor elements. read_conf_data_lpm() will retrieve the configuration data
|
|
||||||
for a specific path.
|
|
||||||
|
|
||||||
The function is meant to be called with the device already enabled; that is,
|
|
||||||
at earliest during set_online() processing.
|
|
||||||
|
|
||||||
The function may be called enabled or disabled, but the device must not be
|
|
||||||
locked
|
|
||||||
|
|
||||||
int read_conf_data(struct ccw_device, void **buffer, int *length);
|
|
||||||
int read_conf_data_lpm(struct ccw_device, void **buffer, int *length, __u8 lpm);
|
|
||||||
|
|
||||||
cdev - the ccw_device the data is requested for.
|
|
||||||
buffer - Pointer to a buffer pointer. The read_conf_data() routine
|
|
||||||
will allocate a buffer and initialize the buffer pointer
|
|
||||||
accordingly. It's the device driver's responsibility to
|
|
||||||
release the kernel memory if no longer needed.
|
|
||||||
length - Length of the buffer allocated and retrieved.
|
|
||||||
lpm - Logical path mask to be used for retrieving the data. If
|
|
||||||
zero the data is retrieved on the next path available.
|
|
||||||
|
|
||||||
The read_conf_data() function returns :
|
|
||||||
0 - Successful completion
|
|
||||||
-ENODEV - cdev invalid.
|
|
||||||
-EINVAL - An invalid parameter was detected, or the function was called early.
|
|
||||||
-EIO - An irrecoverable I/O error occurred or the device is
|
|
||||||
not operational.
|
|
||||||
-ENOMEM - The read_conf_data() routine couldn't obtain storage.
|
|
||||||
-EOPNOTSUPP - The device doesn't support the read configuration
|
|
||||||
data command.
|
|
||||||
|
|
||||||
|
|
||||||
get_ciw() - get command information word
|
get_ciw() - get command information word
|
||||||
|
|
||||||
This call enables a device driver to get information about supported commands
|
This call enables a device driver to get information about supported commands
|
||||||
|
@ -1682,3 +1682,31 @@ compat_sys_utimes_wrapper:
|
|||||||
llgtr %r2,%r2 # char *
|
llgtr %r2,%r2 # char *
|
||||||
llgtr %r3,%r3 # struct compat_timeval *
|
llgtr %r3,%r3 # struct compat_timeval *
|
||||||
jg compat_sys_utimes
|
jg compat_sys_utimes
|
||||||
|
|
||||||
|
.globl compat_sys_utimensat_wrapper
|
||||||
|
compat_sys_utimensat_wrapper:
|
||||||
|
llgfr %r2,%r2 # unsigned int
|
||||||
|
llgtr %r3,%r3 # char *
|
||||||
|
llgtr %r4,%r4 # struct compat_timespec *
|
||||||
|
lgfr %r5,%r5 # int
|
||||||
|
jg compat_sys_utimensat
|
||||||
|
|
||||||
|
.globl compat_sys_signalfd_wrapper
|
||||||
|
compat_sys_signalfd_wrapper:
|
||||||
|
lgfr %r2,%r2 # int
|
||||||
|
llgtr %r3,%r3 # compat_sigset_t *
|
||||||
|
llgfr %r4,%r4 # compat_size_t
|
||||||
|
jg compat_sys_signalfd
|
||||||
|
|
||||||
|
.globl compat_sys_timerfd_wrapper
|
||||||
|
compat_sys_timerfd_wrapper:
|
||||||
|
lgfr %r2,%r2 # int
|
||||||
|
lgfr %r3,%r3 # int
|
||||||
|
lgfr %r4,%r4 # int
|
||||||
|
llgtr %r5,%r5 # struct compat_itimerspec *
|
||||||
|
jg compat_sys_timerfd
|
||||||
|
|
||||||
|
.globl sys_eventfd_wrapper
|
||||||
|
sys_eventfd_wrapper:
|
||||||
|
llgfr %r2,%r2 # unsigned int
|
||||||
|
jg sys_eventfd
|
||||||
|
@ -413,7 +413,7 @@ static int __kprobes trampoline_probe_handler(struct kprobe *p,
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
BUG_ON(!orig_ret_address || (orig_ret_address == trampoline_address));
|
kretprobe_assert(ri, orig_ret_address, trampoline_address);
|
||||||
regs->psw.addr = orig_ret_address | PSW_ADDR_AMODE;
|
regs->psw.addr = orig_ret_address | PSW_ADDR_AMODE;
|
||||||
|
|
||||||
reset_current_kprobe();
|
reset_current_kprobe();
|
||||||
|
@ -322,3 +322,8 @@ 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,compat_sys_epoll_pwait_wrapper)
|
SYSCALL(sys_epoll_pwait,sys_epoll_pwait,compat_sys_epoll_pwait_wrapper)
|
||||||
SYSCALL(sys_utimes,sys_utimes,compat_sys_utimes_wrapper)
|
SYSCALL(sys_utimes,sys_utimes,compat_sys_utimes_wrapper)
|
||||||
|
NI_SYSCALL /* 314 sys_fallocate */
|
||||||
|
SYSCALL(sys_utimensat,sys_utimensat,compat_sys_utimensat_wrapper) /* 315 */
|
||||||
|
SYSCALL(sys_signalfd,sys_signalfd,compat_sys_signalfd_wrapper)
|
||||||
|
SYSCALL(sys_timerfd,sys_timerfd,compat_sys_timerfd_wrapper)
|
||||||
|
SYSCALL(sys_eventfd,sys_eventfd,sys_eventfd_wrapper)
|
||||||
|
@ -61,30 +61,38 @@ void diag10(unsigned long addr)
|
|||||||
|
|
||||||
void show_mem(void)
|
void show_mem(void)
|
||||||
{
|
{
|
||||||
int i, total = 0, reserved = 0;
|
int i, total = 0, reserved = 0;
|
||||||
int shared = 0, cached = 0;
|
int shared = 0, cached = 0;
|
||||||
struct page *page;
|
struct page *page;
|
||||||
|
|
||||||
printk("Mem-info:\n");
|
printk("Mem-info:\n");
|
||||||
show_free_areas();
|
show_free_areas();
|
||||||
printk("Free swap: %6ldkB\n", nr_swap_pages<<(PAGE_SHIFT-10));
|
printk("Free swap: %6ldkB\n", nr_swap_pages << (PAGE_SHIFT - 10));
|
||||||
i = max_mapnr;
|
i = max_mapnr;
|
||||||
while (i-- > 0) {
|
while (i-- > 0) {
|
||||||
if (!pfn_valid(i))
|
if (!pfn_valid(i))
|
||||||
continue;
|
continue;
|
||||||
page = pfn_to_page(i);
|
page = pfn_to_page(i);
|
||||||
total++;
|
total++;
|
||||||
if (PageReserved(page))
|
if (PageReserved(page))
|
||||||
reserved++;
|
reserved++;
|
||||||
else if (PageSwapCache(page))
|
else if (PageSwapCache(page))
|
||||||
cached++;
|
cached++;
|
||||||
else if (page_count(page))
|
else if (page_count(page))
|
||||||
shared += page_count(page) - 1;
|
shared += page_count(page) - 1;
|
||||||
}
|
}
|
||||||
printk("%d pages of RAM\n",total);
|
printk("%d pages of RAM\n", total);
|
||||||
printk("%d reserved pages\n",reserved);
|
printk("%d reserved pages\n", reserved);
|
||||||
printk("%d pages shared\n",shared);
|
printk("%d pages shared\n", shared);
|
||||||
printk("%d pages swap cached\n",cached);
|
printk("%d pages swap cached\n", cached);
|
||||||
|
|
||||||
|
printk("%lu pages dirty\n", global_page_state(NR_FILE_DIRTY));
|
||||||
|
printk("%lu pages writeback\n", global_page_state(NR_WRITEBACK));
|
||||||
|
printk("%lu pages mapped\n", global_page_state(NR_FILE_MAPPED));
|
||||||
|
printk("%lu pages slab\n",
|
||||||
|
global_page_state(NR_SLAB_RECLAIMABLE) +
|
||||||
|
global_page_state(NR_SLAB_UNRECLAIMABLE));
|
||||||
|
printk("%lu pages pagetables\n", global_page_state(NR_PAGETABLE));
|
||||||
}
|
}
|
||||||
|
|
||||||
static void __init setup_ro_region(void)
|
static void __init setup_ro_region(void)
|
||||||
|
@ -251,8 +251,12 @@
|
|||||||
#define __NR_getcpu 311
|
#define __NR_getcpu 311
|
||||||
#define __NR_epoll_pwait 312
|
#define __NR_epoll_pwait 312
|
||||||
#define __NR_utimes 313
|
#define __NR_utimes 313
|
||||||
|
/* Number 314 is reserved for new sys_fallocate */
|
||||||
#define NR_syscalls 314
|
#define __NR_utimensat 315
|
||||||
|
#define __NR_signalfd 316
|
||||||
|
#define __NR_timerfd 317
|
||||||
|
#define __NR_eventfd 318
|
||||||
|
#define NR_syscalls 319
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* 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
|
||||||
@ -346,6 +350,19 @@
|
|||||||
|
|
||||||
#ifdef __KERNEL__
|
#ifdef __KERNEL__
|
||||||
|
|
||||||
|
#ifndef CONFIG_64BIT
|
||||||
|
#define __IGNORE_select
|
||||||
|
#else
|
||||||
|
#define __IGNORE_time
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Ignore NUMA system calls. Not wired up on s390. */
|
||||||
|
#define __IGNORE_mbind
|
||||||
|
#define __IGNORE_get_mempolicy
|
||||||
|
#define __IGNORE_set_mempolicy
|
||||||
|
#define __IGNORE_migrate_pages
|
||||||
|
#define __IGNORE_move_pages
|
||||||
|
|
||||||
#define __ARCH_WANT_IPC_PARSE_VERSION
|
#define __ARCH_WANT_IPC_PARSE_VERSION
|
||||||
#define __ARCH_WANT_OLD_READDIR
|
#define __ARCH_WANT_OLD_READDIR
|
||||||
#define __ARCH_WANT_SYS_ALARM
|
#define __ARCH_WANT_SYS_ALARM
|
||||||
|
Loading…
x
Reference in New Issue
Block a user