Lines Matching refs:vio_cmo
91 struct vio_cmo { struct
103 } vio_cmo; argument
154 spin_lock_irqsave(&vio_cmo.lock, flags); in vio_cmo_alloc()
161 if (vio_cmo.spare >= VIO_CMO_MIN_ENT) in vio_cmo_alloc()
162 excess_free = vio_cmo.excess.free; in vio_cmo_alloc()
166 vio_cmo.curr += size; in vio_cmo_alloc()
167 if (vio_cmo.curr > vio_cmo.high) in vio_cmo_alloc()
168 vio_cmo.high = vio_cmo.curr; in vio_cmo_alloc()
171 vio_cmo.excess.free -= size; in vio_cmo_alloc()
175 spin_unlock_irqrestore(&vio_cmo.lock, flags); in vio_cmo_alloc()
200 spin_lock_irqsave(&vio_cmo.lock, flags); in vio_cmo_dealloc()
201 vio_cmo.curr -= size; in vio_cmo_dealloc()
214 spare_needed = VIO_CMO_MIN_ENT - vio_cmo.spare; in vio_cmo_dealloc()
222 vio_cmo.excess.size -= tmp; in vio_cmo_dealloc()
223 vio_cmo.reserve.size += tmp; in vio_cmo_dealloc()
224 vio_cmo.spare += tmp; in vio_cmo_dealloc()
239 vio_cmo.spare += tmp; in vio_cmo_dealloc()
251 if (excess_freed && (vio_cmo.desired > vio_cmo.reserve.size)) { in vio_cmo_dealloc()
252 tmp = min(excess_freed, (vio_cmo.desired - vio_cmo.reserve.size)); in vio_cmo_dealloc()
254 vio_cmo.excess.size -= tmp; in vio_cmo_dealloc()
255 vio_cmo.reserve.size += tmp; in vio_cmo_dealloc()
262 vio_cmo.excess.free += excess_freed; in vio_cmo_dealloc()
265 schedule_delayed_work(&vio_cmo.balance_q, VIO_CMO_BALANCE_DELAY); in vio_cmo_dealloc()
266 spin_unlock_irqrestore(&vio_cmo.lock, flags); in vio_cmo_dealloc()
287 spin_lock_irqsave(&vio_cmo.lock, flags); in vio_cmo_entitlement_update()
290 if (new_entitlement > vio_cmo.entitled) { in vio_cmo_entitlement_update()
291 delta = new_entitlement - vio_cmo.entitled; in vio_cmo_entitlement_update()
294 if (vio_cmo.spare < VIO_CMO_MIN_ENT) { in vio_cmo_entitlement_update()
295 tmp = min(delta, (VIO_CMO_MIN_ENT - vio_cmo.spare)); in vio_cmo_entitlement_update()
296 vio_cmo.spare += tmp; in vio_cmo_entitlement_update()
297 vio_cmo.reserve.size += tmp; in vio_cmo_entitlement_update()
302 vio_cmo.entitled += delta; in vio_cmo_entitlement_update()
303 vio_cmo.excess.size += delta; in vio_cmo_entitlement_update()
304 vio_cmo.excess.free += delta; in vio_cmo_entitlement_update()
310 delta = vio_cmo.entitled - new_entitlement; in vio_cmo_entitlement_update()
311 avail = vio_cmo.excess.free; in vio_cmo_entitlement_update()
317 list_for_each_entry(dev_ent, &vio_cmo.device_list, list) { in vio_cmo_entitlement_update()
330 vio_cmo.entitled -= delta; in vio_cmo_entitlement_update()
333 tmp = min(vio_cmo.excess.free, delta); in vio_cmo_entitlement_update()
334 vio_cmo.excess.size -= tmp; in vio_cmo_entitlement_update()
335 vio_cmo.excess.free -= tmp; in vio_cmo_entitlement_update()
342 list_for_each_entry(dev_ent, &vio_cmo.device_list, list) { in vio_cmo_entitlement_update()
357 spin_unlock_irqrestore(&vio_cmo.lock, flags); in vio_cmo_entitlement_update()
362 schedule_delayed_work(&vio_cmo.balance_q, 0); in vio_cmo_entitlement_update()
363 spin_unlock_irqrestore(&vio_cmo.lock, flags); in vio_cmo_entitlement_update()
390 struct vio_cmo *cmo; in vio_cmo_balance()
397 cmo = container_of(work, struct vio_cmo, balance_q.work); in vio_cmo_balance()
399 spin_lock_irqsave(&vio_cmo.lock, flags); in vio_cmo_balance()
413 list_for_each_entry(dev_ent, &vio_cmo.device_list, list) { in vio_cmo_balance()
429 list_for_each_entry(dev_ent, &vio_cmo.device_list, list) { in vio_cmo_balance()
467 list_for_each_entry(dev_ent, &vio_cmo.device_list, list) { in vio_cmo_balance()
481 spin_unlock_irqrestore(&vio_cmo.lock, flags); in vio_cmo_balance()
641 spin_lock_irqsave(&vio_cmo.lock, flags); in vio_cmo_set_dev_desired()
650 list_for_each_entry(dev_ent, &vio_cmo.device_list, list) in vio_cmo_set_dev_desired()
656 spin_unlock_irqrestore(&vio_cmo.lock, flags); in vio_cmo_set_dev_desired()
663 vio_cmo.desired += desired - viodev->cmo.desired; in vio_cmo_set_dev_desired()
667 vio_cmo.desired -= viodev->cmo.desired - desired; in vio_cmo_set_dev_desired()
674 vio_cmo.reserve.size -= viodev->cmo.entitled - desired; in vio_cmo_set_dev_desired()
675 vio_cmo.excess.size += viodev->cmo.entitled - desired; in vio_cmo_set_dev_desired()
682 vio_cmo.excess.free += viodev->cmo.entitled - in vio_cmo_set_dev_desired()
687 schedule_delayed_work(&vio_cmo.balance_q, 0); in vio_cmo_set_dev_desired()
688 spin_unlock_irqrestore(&vio_cmo.lock, flags); in vio_cmo_set_dev_desired()
737 spin_lock_irqsave(&vio_cmo.lock, flags); in vio_cmo_bus_probe()
738 list_add(&dev_ent->list, &vio_cmo.device_list); in vio_cmo_bus_probe()
742 spin_lock_irqsave(&vio_cmo.lock, flags); in vio_cmo_bus_probe()
751 if (vio_cmo.min == ((vio_cmo_num_OF_devs() + 1) * in vio_cmo_bus_probe()
755 vio_cmo.desired += (viodev->cmo.desired - in vio_cmo_bus_probe()
760 tmp = vio_cmo.spare + vio_cmo.excess.free; in vio_cmo_bus_probe()
765 size, (vio_cmo.spare + tmp)); in vio_cmo_bus_probe()
766 spin_unlock_irqrestore(&vio_cmo.lock, flags); in vio_cmo_bus_probe()
771 tmp = min(size, vio_cmo.excess.free); in vio_cmo_bus_probe()
772 vio_cmo.excess.free -= tmp; in vio_cmo_bus_probe()
773 vio_cmo.excess.size -= tmp; in vio_cmo_bus_probe()
774 vio_cmo.reserve.size += tmp; in vio_cmo_bus_probe()
777 vio_cmo.spare -= size - tmp; in vio_cmo_bus_probe()
780 vio_cmo.min += size; in vio_cmo_bus_probe()
781 vio_cmo.desired += viodev->cmo.desired; in vio_cmo_bus_probe()
783 spin_unlock_irqrestore(&vio_cmo.lock, flags); in vio_cmo_bus_probe()
803 spin_lock_irqsave(&vio_cmo.lock, flags); in vio_cmo_bus_remove()
815 list_for_each_entry(dev_ent, &vio_cmo.device_list, list) in vio_cmo_bus_remove()
833 vio_cmo.desired -= (viodev->cmo.desired - VIO_CMO_MIN_ENT); in vio_cmo_bus_remove()
843 if (viodev->cmo.entitled && (vio_cmo.spare < VIO_CMO_MIN_ENT)) { in vio_cmo_bus_remove()
845 vio_cmo.spare)); in vio_cmo_bus_remove()
846 vio_cmo.spare += tmp; in vio_cmo_bus_remove()
851 vio_cmo.excess.size += viodev->cmo.entitled; in vio_cmo_bus_remove()
852 vio_cmo.excess.free += viodev->cmo.entitled; in vio_cmo_bus_remove()
853 vio_cmo.reserve.size -= viodev->cmo.entitled; in vio_cmo_bus_remove()
865 spin_unlock_irqrestore(&vio_cmo.lock, flags); in vio_cmo_bus_remove()
885 memset(&vio_cmo, 0, sizeof(struct vio_cmo)); in vio_cmo_bus_init()
886 spin_lock_init(&vio_cmo.lock); in vio_cmo_bus_init()
887 INIT_LIST_HEAD(&vio_cmo.device_list); in vio_cmo_bus_init()
888 INIT_DELAYED_WORK(&vio_cmo.balance_q, vio_cmo_balance); in vio_cmo_bus_init()
900 vio_cmo.entitled = 0; in vio_cmo_bus_init()
902 vio_cmo.entitled = mpp_data.entitled_mem; in vio_cmo_bus_init()
906 vio_cmo.spare = VIO_CMO_MIN_ENT; in vio_cmo_bus_init()
907 vio_cmo.reserve.size = vio_cmo.spare; in vio_cmo_bus_init()
908 vio_cmo.reserve.size += (vio_cmo_num_OF_devs() * in vio_cmo_bus_init()
910 if (vio_cmo.reserve.size > vio_cmo.entitled) { in vio_cmo_bus_init()
917 vio_cmo.excess.size = vio_cmo.entitled - vio_cmo.reserve.size; in vio_cmo_bus_init()
918 vio_cmo.excess.free = vio_cmo.excess.size; in vio_cmo_bus_init()
919 vio_cmo.min = vio_cmo.reserve.size; in vio_cmo_bus_init()
920 vio_cmo.desired = vio_cmo.reserve.size; in vio_cmo_bus_init()
990 return sprintf(buf, "%lu\n", vio_cmo.name); \
997 return sprintf(buf, "%lu\n", vio_cmo.name.var); \
1005 spin_lock_irqsave(&vio_cmo.lock, flags); in viobus_cmo_high_reset()
1006 vio_cmo.high = vio_cmo.curr; in viobus_cmo_high_reset()
1007 spin_unlock_irqrestore(&vio_cmo.lock, flags); in viobus_cmo_high_reset()