Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 26291
b: refs/heads/master
c: a3ae39c
h: refs/heads/master
i:
  26289: 8c976a4
  26287: 4b77b46
v: v3
  • Loading branch information
Andreas Herrmann authored and Linus Torvalds committed Apr 28, 2006
1 parent 0c8b7c1 commit 8bbde88
Show file tree
Hide file tree
Showing 2 changed files with 25 additions and 7 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 28f223782bca914ae65d08234c57c2175ecd7f5d
refs/heads/master: a3ae39c060be57a4936d2c1d970e4d0c7d320d9c
30 changes: 24 additions & 6 deletions trunk/drivers/s390/cio/qdio.c
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,7 @@
#include <linux/kernel.h>
#include <linux/proc_fs.h>
#include <linux/timer.h>
#include <linux/mempool.h>

#include <asm/ccwdev.h>
#include <asm/io.h>
Expand Down Expand Up @@ -80,6 +81,8 @@ static int indicator_used[INDICATORS_PER_CACHELINE];
static __u32 * volatile indicators;
static __u32 volatile spare_indicator;
static atomic_t spare_indicator_usecount;
#define QDIO_MEMPOOL_SCSSC_ELEMENTS 2
static mempool_t *qdio_mempool_scssc;

static debug_info_t *qdio_dbf_setup;
static debug_info_t *qdio_dbf_sbal;
Expand Down Expand Up @@ -2304,7 +2307,7 @@ qdio_get_ssqd_information(struct qdio_irq *irq_ptr)

QDIO_DBF_TEXT0(0,setup,"getssqd");
qdioac = 0;
ssqd_area = (void *)get_zeroed_page(GFP_KERNEL | GFP_DMA);
ssqd_area = mempool_alloc(qdio_mempool_scssc, GFP_ATOMIC);
if (!ssqd_area) {
QDIO_PRINT_WARN("Could not get memory for chsc. Using all " \
"SIGAs for sch x%x.\n", irq_ptr->schid.sch_no);
Expand Down Expand Up @@ -2364,7 +2367,7 @@ qdio_get_ssqd_information(struct qdio_irq *irq_ptr)
out:
qdio_check_subchannel_qebsm(irq_ptr, qdioac,
ssqd_area->sch_token);
free_page ((unsigned long) ssqd_area);
mempool_free(ssqd_area, qdio_mempool_scssc);
irq_ptr->qdioac = qdioac;
}

Expand Down Expand Up @@ -2458,7 +2461,7 @@ tiqdio_set_subchannel_ind(struct qdio_irq *irq_ptr, int reset_to_zero)
virt_to_phys((volatile void *)irq_ptr->dev_st_chg_ind);
}

scssc_area = (void *)get_zeroed_page(GFP_KERNEL | GFP_DMA);
scssc_area = mempool_alloc(qdio_mempool_scssc, GFP_ATOMIC);
if (!scssc_area) {
QDIO_PRINT_WARN("No memory for setting indicators on " \
"subchannel 0.%x.%x.\n",
Expand Down Expand Up @@ -2514,7 +2517,7 @@ tiqdio_set_subchannel_ind(struct qdio_irq *irq_ptr, int reset_to_zero)
QDIO_DBF_HEX2(0,setup,&real_addr_dev_st_chg_ind,sizeof(unsigned long));
result = 0;
out:
free_page ((unsigned long) scssc_area);
mempool_free(scssc_area, qdio_mempool_scssc);
return result;

}
Expand Down Expand Up @@ -2543,7 +2546,7 @@ tiqdio_set_delay_target(struct qdio_irq *irq_ptr, unsigned long delay_target)
if (!irq_ptr->is_thinint_irq)
return -ENODEV;

scsscf_area = (void *)get_zeroed_page(GFP_KERNEL | GFP_DMA);
scsscf_area = mempool_alloc(qdio_mempool_scssc, GFP_ATOMIC);
if (!scsscf_area) {
QDIO_PRINT_WARN("No memory for setting delay target on " \
"subchannel 0.%x.%x.\n",
Expand Down Expand Up @@ -2581,7 +2584,7 @@ tiqdio_set_delay_target(struct qdio_irq *irq_ptr, unsigned long delay_target)
QDIO_DBF_HEX2(0,trace,&delay_target,sizeof(unsigned long));
result = 0; /* not critical */
out:
free_page ((unsigned long) scsscf_area);
mempool_free(scsscf_area, qdio_mempool_scssc);
return result;
}

Expand Down Expand Up @@ -3780,6 +3783,16 @@ qdio_register_dbf_views(void)
return -ENOMEM;
}

static void *qdio_mempool_alloc(gfp_t gfp_mask, void *size)
{
return (void *) get_zeroed_page(gfp_mask|GFP_DMA);
}

static void qdio_mempool_free(void *element, void *size)
{
free_page((unsigned long) element);
}

static int __init
init_QDIO(void)
{
Expand Down Expand Up @@ -3809,6 +3822,10 @@ init_QDIO(void)

qdio_add_procfs_entry();

qdio_mempool_scssc = mempool_create(QDIO_MEMPOOL_SCSSC_ELEMENTS,
qdio_mempool_alloc,
qdio_mempool_free, NULL);

if (tiqdio_check_chsc_availability())
QDIO_PRINT_ERR("Not all CHSCs supported. Continuing.\n");

Expand All @@ -3824,6 +3841,7 @@ cleanup_QDIO(void)
qdio_remove_procfs_entry();
qdio_release_qdio_memory();
qdio_unregister_dbf_views();
mempool_destroy(qdio_mempool_scssc);

printk("qdio: %s: module removed\n",version);
}
Expand Down

0 comments on commit 8bbde88

Please sign in to comment.