vio_cmo
return sprintf(buf, "%lu\n", vio_cmo.name); \
} vio_cmo;
return sprintf(buf, "%lu\n", vio_cmo.name.var); \
return sprintf(buf, "%lu\n", vio_cmo.high);
spin_lock_irqsave(&vio_cmo.lock, flags);
vio_cmo.high = vio_cmo.curr;
spin_unlock_irqrestore(&vio_cmo.lock, flags);
spin_lock_irqsave(&vio_cmo.lock, flags);
if (vio_cmo.spare >= VIO_CMO_MIN_ENT)
excess_free = vio_cmo.excess.free;
vio_cmo.curr += size;
if (vio_cmo.curr > vio_cmo.high)
vio_cmo.high = vio_cmo.curr;
vio_cmo.excess.free -= size;
spin_unlock_irqrestore(&vio_cmo.lock, flags);
spin_lock_irqsave(&vio_cmo.lock, flags);
vio_cmo.curr -= size;
spare_needed = VIO_CMO_MIN_ENT - vio_cmo.spare;
vio_cmo.excess.size -= tmp;
vio_cmo.reserve.size += tmp;
vio_cmo.spare += tmp;
vio_cmo.spare += tmp;
if (excess_freed && (vio_cmo.desired > vio_cmo.reserve.size)) {
tmp = min(excess_freed, (vio_cmo.desired - vio_cmo.reserve.size));
vio_cmo.excess.size -= tmp;
vio_cmo.reserve.size += tmp;
vio_cmo.excess.free += excess_freed;
schedule_delayed_work(&vio_cmo.balance_q, VIO_CMO_BALANCE_DELAY);
spin_unlock_irqrestore(&vio_cmo.lock, flags);
spin_lock_irqsave(&vio_cmo.lock, flags);
if (new_entitlement > vio_cmo.entitled) {
delta = new_entitlement - vio_cmo.entitled;
if (vio_cmo.spare < VIO_CMO_MIN_ENT) {
tmp = min(delta, (VIO_CMO_MIN_ENT - vio_cmo.spare));
vio_cmo.spare += tmp;
vio_cmo.reserve.size += tmp;
vio_cmo.entitled += delta;
vio_cmo.excess.size += delta;
vio_cmo.excess.free += delta;
delta = vio_cmo.entitled - new_entitlement;
avail = vio_cmo.excess.free;
list_for_each_entry(dev_ent, &vio_cmo.device_list, list) {
vio_cmo.entitled -= delta;
tmp = min(vio_cmo.excess.free, delta);
vio_cmo.excess.size -= tmp;
vio_cmo.excess.free -= tmp;
list_for_each_entry(dev_ent, &vio_cmo.device_list, list) {
spin_unlock_irqrestore(&vio_cmo.lock, flags);
schedule_delayed_work(&vio_cmo.balance_q, 0);
spin_unlock_irqrestore(&vio_cmo.lock, flags);
struct vio_cmo *cmo;
cmo = container_of(work, struct vio_cmo, balance_q.work);
spin_lock_irqsave(&vio_cmo.lock, flags);
list_for_each_entry(dev_ent, &vio_cmo.device_list, list) {
list_for_each_entry(dev_ent, &vio_cmo.device_list, list) {
list_for_each_entry(dev_ent, &vio_cmo.device_list, list) {
spin_unlock_irqrestore(&vio_cmo.lock, flags);
spin_lock_irqsave(&vio_cmo.lock, flags);
list_for_each_entry(dev_ent, &vio_cmo.device_list, list)
spin_unlock_irqrestore(&vio_cmo.lock, flags);
vio_cmo.desired += desired - viodev->cmo.desired;
vio_cmo.desired -= viodev->cmo.desired - desired;
vio_cmo.reserve.size -= viodev->cmo.entitled - desired;
vio_cmo.excess.size += viodev->cmo.entitled - desired;
vio_cmo.excess.free += viodev->cmo.entitled -
schedule_delayed_work(&vio_cmo.balance_q, 0);
spin_unlock_irqrestore(&vio_cmo.lock, flags);
spin_lock_irqsave(&vio_cmo.lock, flags);
list_add(&dev_ent->list, &vio_cmo.device_list);
spin_lock_irqsave(&vio_cmo.lock, flags);
if (vio_cmo.min == ((vio_cmo_num_OF_devs() + 1) *
vio_cmo.desired += (viodev->cmo.desired -
tmp = vio_cmo.spare + vio_cmo.excess.free;
size, (vio_cmo.spare + tmp));
spin_unlock_irqrestore(&vio_cmo.lock, flags);
tmp = min(size, vio_cmo.excess.free);
vio_cmo.excess.free -= tmp;
vio_cmo.excess.size -= tmp;
vio_cmo.reserve.size += tmp;
vio_cmo.spare -= size - tmp;
vio_cmo.min += size;
vio_cmo.desired += viodev->cmo.desired;
spin_unlock_irqrestore(&vio_cmo.lock, flags);
spin_lock_irqsave(&vio_cmo.lock, flags);
list_for_each_entry(dev_ent, &vio_cmo.device_list, list)
vio_cmo.desired -= (viodev->cmo.desired - VIO_CMO_MIN_ENT);
if (viodev->cmo.entitled && (vio_cmo.spare < VIO_CMO_MIN_ENT)) {
vio_cmo.spare));
vio_cmo.spare += tmp;
vio_cmo.excess.size += viodev->cmo.entitled;
vio_cmo.excess.free += viodev->cmo.entitled;
vio_cmo.reserve.size -= viodev->cmo.entitled;
spin_unlock_irqrestore(&vio_cmo.lock, flags);
memset(&vio_cmo, 0, sizeof(struct vio_cmo));
spin_lock_init(&vio_cmo.lock);
INIT_LIST_HEAD(&vio_cmo.device_list);
INIT_DELAYED_WORK(&vio_cmo.balance_q, vio_cmo_balance);
vio_cmo.entitled = 0;
vio_cmo.entitled = mpp_data.entitled_mem;
vio_cmo.spare = VIO_CMO_MIN_ENT;
vio_cmo.reserve.size = vio_cmo.spare;
vio_cmo.reserve.size += (vio_cmo_num_OF_devs() *
if (vio_cmo.reserve.size > vio_cmo.entitled) {
vio_cmo.excess.size = vio_cmo.entitled - vio_cmo.reserve.size;
vio_cmo.excess.free = vio_cmo.excess.size;
vio_cmo.min = vio_cmo.reserve.size;
vio_cmo.desired = vio_cmo.reserve.size;