cregit-Linux how code gets into the kernel

Release 4.10 arch/x86/kvm/ioapic.c

Directory: arch/x86/kvm
/*
 *  Copyright (C) 2001  MandrakeSoft S.A.
 *  Copyright 2010 Red Hat, Inc. and/or its affiliates.
 *
 *    MandrakeSoft S.A.
 *    43, rue d'Aboukir
 *    75002 Paris - France
 *    http://www.linux-mandrake.com/
 *    http://www.mandrakesoft.com/
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License as published by the Free Software Foundation; either
 *  version 2 of the License, or (at your option) any later version.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
 *
 *  Yunhong Jiang <yunhong.jiang@intel.com>
 *  Yaozu (Eddie) Dong <eddie.dong@intel.com>
 *  Based on Xen 3.1 code.
 */

#include <linux/kvm_host.h>
#include <linux/kvm.h>
#include <linux/mm.h>
#include <linux/highmem.h>
#include <linux/smp.h>
#include <linux/hrtimer.h>
#include <linux/io.h>
#include <linux/slab.h>
#include <linux/export.h>
#include <asm/processor.h>
#include <asm/page.h>
#include <asm/current.h>
#include <trace/events/kvm.h>

#include "ioapic.h"
#include "lapic.h"
#include "irq.h"

#if 0
#define ioapic_debug(fmt,arg...) printk(KERN_WARNING fmt,##arg)
#else

#define ioapic_debug(fmt, arg...)
#endif
static int ioapic_service(struct kvm_ioapic *vioapic, int irq,
		bool line_status);


static unsigned long ioapic_read_indirect(struct kvm_ioapic *ioapic, unsigned long addr, unsigned long length) { unsigned long result = 0; switch (ioapic->ioregsel) { case IOAPIC_REG_VERSION: result = ((((IOAPIC_NUM_PINS - 1) & 0xff) << 16) | (IOAPIC_VERSION_ID & 0xff)); break; case IOAPIC_REG_APIC_ID: case IOAPIC_REG_ARB_ID: result = ((ioapic->id & 0xf) << 24); break; default: { u32 redir_index = (ioapic->ioregsel - 0x10) >> 1; u64 redir_content; if (redir_index < IOAPIC_NUM_PINS) redir_content = ioapic->redirtbl[redir_index].bits; else redir_content = ~0ULL; result = (ioapic->ioregsel & 0x1) ? (redir_content >> 32) & 0xffffffff : redir_content & 0xffffffff; break; } } return result; }

Contributors

PersonTokensPropCommitsCommitProp
eddie dongeddie dong14294.04%150.00%
andy honigandy honig95.96%150.00%
Total151100.00%2100.00%


static void rtc_irq_eoi_tracking_reset(struct kvm_ioapic *ioapic) { ioapic->rtc_status.pending_eoi = 0; bitmap_zero(ioapic->rtc_status.dest_map.map, KVM_MAX_VCPU_ID); }

Contributors

PersonTokensPropCommitsCommitProp
yang zhangyang zhang2990.62%133.33%
joerg roedeljoerg roedel26.25%133.33%
radim krcmarradim krcmar13.12%133.33%
Total32100.00%3100.00%

static void kvm_rtc_eoi_tracking_restore_all(struct kvm_ioapic *ioapic);
static void rtc_status_pending_eoi_check_valid(struct kvm_ioapic *ioapic) { if (WARN_ON(ioapic->rtc_status.pending_eoi < 0)) kvm_rtc_eoi_tracking_restore_all(ioapic); }

Contributors

PersonTokensPropCommitsCommitProp
paolo bonzinipaolo bonzini29100.00%1100.00%
Total29100.00%1100.00%


static void __rtc_irq_eoi_tracking_restore_one(struct kvm_vcpu *vcpu) { bool new_val, old_val; struct kvm_ioapic *ioapic = vcpu->kvm->arch.vioapic; struct dest_map *dest_map = &ioapic->rtc_status.dest_map; union kvm_ioapic_redirect_entry *e; e = &ioapic->redirtbl[RTC_GSI]; if (!kvm_apic_match_dest(vcpu, NULL, 0, e->fields.dest_id, e->fields.dest_mode)) return; new_val = kvm_apic_pending_eoi(vcpu, e->fields.vector); old_val = test_bit(vcpu->vcpu_id, dest_map->map); if (new_val == old_val) return; if (new_val) { __set_bit(vcpu->vcpu_id, dest_map->map); dest_map->vectors[vcpu->vcpu_id] = e->fields.vector; ioapic->rtc_status.pending_eoi++; } else { __clear_bit(vcpu->vcpu_id, dest_map->map); ioapic->rtc_status.pending_eoi--; rtc_status_pending_eoi_check_valid(ioapic); } }

Contributors

PersonTokensPropCommitsCommitProp
yang zhangyang zhang14480.45%125.00%
paolo bonzinipaolo bonzini3217.88%250.00%
joerg roedeljoerg roedel31.68%125.00%
Total179100.00%4100.00%


void kvm_rtc_eoi_tracking_restore_one(struct kvm_vcpu *vcpu) { struct kvm_ioapic *ioapic = vcpu->kvm->arch.vioapic; spin_lock(&ioapic->lock); __rtc_irq_eoi_tracking_restore_one(vcpu); spin_unlock(&ioapic->lock); }

Contributors

PersonTokensPropCommitsCommitProp
yang zhangyang zhang44100.00%1100.00%
Total44100.00%1100.00%


static void kvm_rtc_eoi_tracking_restore_all(struct kvm_ioapic *ioapic) { struct kvm_vcpu *vcpu; int i; if (RTC_GSI >= IOAPIC_NUM_PINS) return; rtc_irq_eoi_tracking_reset(ioapic); kvm_for_each_vcpu(i, vcpu, ioapic->kvm) __rtc_irq_eoi_tracking_restore_one(vcpu); }

Contributors

PersonTokensPropCommitsCommitProp
yang zhangyang zhang44100.00%1100.00%
Total44100.00%1100.00%


static void rtc_irq_eoi(struct kvm_ioapic *ioapic, struct kvm_vcpu *vcpu) { if (test_and_clear_bit(vcpu->vcpu_id, ioapic->rtc_status.dest_map.map)) { --ioapic->rtc_status.pending_eoi; rtc_status_pending_eoi_check_valid(ioapic); } }

Contributors

PersonTokensPropCommitsCommitProp
yang zhangyang zhang4289.36%133.33%
paolo bonzinipaolo bonzini36.38%133.33%
joerg roedeljoerg roedel24.26%133.33%
Total47100.00%3100.00%


static bool rtc_irq_check_coalesced(struct kvm_ioapic *ioapic) { if (ioapic->rtc_status.pending_eoi > 0) return true; /* coalesced */ return false; }

Contributors

PersonTokensPropCommitsCommitProp
yang zhangyang zhang28100.00%1100.00%
Total28100.00%1100.00%


static int ioapic_set_irq(struct kvm_ioapic *ioapic, unsigned int irq, int irq_level, bool line_status) { union kvm_ioapic_redirect_entry entry; u32 mask = 1 << irq; u32 old_irr; int edge, ret; entry = ioapic->redirtbl[irq]; edge = (entry.fields.trig_mode == IOAPIC_EDGE_TRIG); if (!irq_level) { ioapic->irr &= ~mask; ret = 1; goto out; } /* * Return 0 for coalesced interrupts; for edge-triggered interrupts, * this only happens if a previous edge has not been delivered due * do masking. For level interrupts, the remote_irr field tells * us if the interrupt is waiting for an EOI. * * RTC is special: it is edge-triggered, but userspace likes to know * if it has been already ack-ed via EOI because coalesced RTC * interrupts lead to time drift in Windows guests. So we track * EOI manually for the RTC interrupt. */ if (irq == RTC_GSI && line_status && rtc_irq_check_coalesced(ioapic)) { ret = 0; goto out; } old_irr = ioapic->irr; ioapic->irr |= mask; if (edge) ioapic->irr_delivered &= ~mask; if ((edge && old_irr == ioapic->irr) || (!edge && entry.fields.remote_irr)) { ret = 0; goto out; } ret = ioapic_service(ioapic, irq, line_status); out: trace_kvm_ioapic_set_irq(entry.bits, irq, ret == 0); return ret; }

Contributors

PersonTokensPropCommitsCommitProp
paolo bonzinipaolo bonzini17894.18%150.00%
wincy vanwincy van115.82%150.00%
Total189100.00%2100.00%


static void kvm_ioapic_inject_all(struct kvm_ioapic *ioapic, unsigned long irr) { u32 idx; rtc_irq_eoi_tracking_reset(ioapic); for_each_set_bit(idx, &irr, IOAPIC_NUM_PINS) ioapic_set_irq(ioapic, idx, 1, true); kvm_rtc_eoi_tracking_restore_all(ioapic); }

Contributors

PersonTokensPropCommitsCommitProp
paolo bonzinipaolo bonzini47100.00%1100.00%
Total47100.00%1100.00%


void kvm_ioapic_scan_entry(struct kvm_vcpu *vcpu, ulong *ioapic_handled_vectors) { struct kvm_ioapic *ioapic = vcpu->kvm->arch.vioapic; struct dest_map *dest_map = &ioapic->rtc_status.dest_map; union kvm_ioapic_redirect_entry *e; int index; spin_lock(&ioapic->lock); /* Make sure we see any missing RTC EOI */ if (test_bit(vcpu->vcpu_id, dest_map->map)) __set_bit(dest_map->vectors[vcpu->vcpu_id], ioapic_handled_vectors); for (index = 0; index < IOAPIC_NUM_PINS; index++) { e = &ioapic->redirtbl[index]; if (e->fields.trig_mode == IOAPIC_LEVEL_TRIG || kvm_irq_has_notifier(ioapic->kvm, KVM_IRQCHIP_IOAPIC, index) || index == RTC_GSI) { if (kvm_apic_match_dest(vcpu, NULL, 0, e->fields.dest_id, e->fields.dest_mode) || (e->fields.trig_mode == IOAPIC_EDGE_TRIG && kvm_apic_pending_eoi(vcpu, e->fields.vector))) __set_bit(e->fields.vector, ioapic_handled_vectors); } } spin_unlock(&ioapic->lock); }

Contributors

PersonTokensPropCommitsCommitProp
yang zhangyang zhang13467.68%457.14%
joerg roedeljoerg roedel4020.20%114.29%
radim krcmarradim krcmar2110.61%114.29%
andrey smetaninandrey smetanin31.52%114.29%
Total198100.00%7100.00%


void kvm_vcpu_request_scan_ioapic(struct kvm *kvm) { struct kvm_ioapic *ioapic = kvm->arch.vioapic; if (!ioapic) return; kvm_make_scan_ioapic_request(kvm); }

Contributors

PersonTokensPropCommitsCommitProp
yang zhangyang zhang32100.00%2100.00%
Total32100.00%2100.00%


static void ioapic_write_indirect(struct kvm_ioapic *ioapic, u32 val) { unsigned index; bool mask_before, mask_after; union kvm_ioapic_redirect_entry *e; switch (ioapic->ioregsel) { case IOAPIC_REG_VERSION: /* Writes are ignored. */ break; case IOAPIC_REG_APIC_ID: ioapic->id = (val >> 24) & 0xf; break; case IOAPIC_REG_ARB_ID: break; default: index = (ioapic->ioregsel - 0x10) >> 1; ioapic_debug("change redir index %x val %x\n", index, val); if (index >= IOAPIC_NUM_PINS) return; e = &ioapic->redirtbl[index]; mask_before = e->fields.mask; if (ioapic->ioregsel & 1) { e->bits &= 0xffffffff; e->bits |= (u64) val << 32; } else { e->bits &= ~0xffffffffULL; e->bits |= (u32) val; e->fields.remote_irr = 0; } mask_after = e->fields.mask; if (mask_before != mask_after) kvm_fire_mask_notifiers(ioapic->kvm, KVM_IRQCHIP_IOAPIC, index, mask_after); if (e->fields.trig_mode == IOAPIC_LEVEL_TRIG && ioapic->irr & (1 << index)) ioapic_service(ioapic, index, false); kvm_vcpu_request_scan_ioapic(ioapic->kvm); break; } }

Contributors

PersonTokensPropCommitsCommitProp
eddie dongeddie dong14664.89%111.11%
avi kivityavi kivity4017.78%111.11%
gleb natapovgleb natapov2912.89%333.33%
yang zhangyang zhang94.00%333.33%
laurent vivierlaurent vivier10.44%111.11%
Total225100.00%9100.00%


static int ioapic_service(struct kvm_ioapic *ioapic, int irq, bool line_status) { union kvm_ioapic_redirect_entry *entry = &ioapic->redirtbl[irq]; struct kvm_lapic_irq irqe; int ret; if (entry->fields.mask) return -1; ioapic_debug("dest=%x dest_mode=%x delivery_mode=%x " "vector=%x trig_mode=%x\n", entry->fields.dest_id, entry->fields.dest_mode, entry->fields.delivery_mode, entry->fields.vector, entry->fields.trig_mode); irqe.dest_id = entry->fields.dest_id; irqe.vector = entry->fields.vector; irqe.dest_mode = entry->fields.dest_mode; irqe.trig_mode = entry->fields.trig_mode; irqe.delivery_mode = entry->fields.delivery_mode << 8; irqe.level = 1; irqe.shorthand = 0; irqe.msi_redir_hint = false; if (irqe.trig_mode == IOAPIC_EDGE_TRIG) ioapic->irr_delivered |= 1 << irq; if (irq == RTC_GSI && line_status) { /* * pending_eoi cannot ever become negative (see * rtc_status_pending_eoi_check_valid) and the caller * ensures that it is only called if it is >= zero, namely * if rtc_irq_check_coalesced returns false). */ BUG_ON(ioapic->rtc_status.pending_eoi != 0); ret = kvm_irq_delivery_to_apic(ioapic->kvm, NULL, &irqe, &ioapic->rtc_status.dest_map); ioapic->rtc_status.pending_eoi = (ret < 0 ? 0 : ret); } else ret = kvm_irq_delivery_to_apic(ioapic->kvm, NULL, &irqe, NULL); if (ret && irqe.trig_mode == IOAPIC_LEVEL_TRIG) entry->fields.remote_irr = 1; return ret; }

Contributors

PersonTokensPropCommitsCommitProp
gleb natapovgleb natapov10940.67%317.65%
yang zhangyang zhang6323.51%317.65%
paolo bonzinipaolo bonzini5420.15%423.53%
sheng yangsheng yang165.97%15.88%
eddie dongeddie dong134.85%15.88%
james sullivanjames sullivan62.24%15.88%
marcelo tosattimarcelo tosatti31.12%15.88%
wincy vanwincy van20.75%15.88%
joerg roedeljoerg roedel10.37%15.88%
liu yuanliu yuan10.37%15.88%
Total268100.00%17100.00%


int kvm_ioapic_set_irq(struct kvm_ioapic *ioapic, int irq, int irq_source_id, int level, bool line_status) { int ret, irq_level; BUG_ON(irq < 0 || irq >= IOAPIC_NUM_PINS); spin_lock(&ioapic->lock); irq_level = __kvm_irq_line_state(&ioapic->irq_states[irq], irq_source_id, level); ret = ioapic_set_irq(ioapic, irq, irq_level, line_status); spin_unlock(&ioapic->lock); return ret; }

Contributors

PersonTokensPropCommitsCommitProp
michael s. tsirkinmichael s. tsirkin3337.93%222.22%
gleb natapovgleb natapov2629.89%333.33%
eddie dongeddie dong1921.84%111.11%
yang zhangyang zhang44.60%111.11%
paolo bonzinipaolo bonzini33.45%111.11%
marcelo tosattimarcelo tosatti22.30%111.11%
Total87100.00%9100.00%


void kvm_ioapic_clear_all(struct kvm_ioapic *ioapic, int irq_source_id) { int i; spin_lock(&ioapic->lock); for (i = 0; i < KVM_IOAPIC_NUM_PINS; i++) __clear_bit(irq_source_id, &ioapic->irq_states[i]); spin_unlock(&ioapic->lock); }

Contributors

PersonTokensPropCommitsCommitProp
michael s. tsirkinmichael s. tsirkin58100.00%1100.00%
Total58100.00%1100.00%


static void kvm_ioapic_eoi_inject_work(struct work_struct *work) { int i; struct kvm_ioapic *ioapic = container_of(work, struct kvm_ioapic, eoi_inject.work); spin_lock(&ioapic->lock); for (i = 0; i < IOAPIC_NUM_PINS; i++) { union kvm_ioapic_redirect_entry *ent = &ioapic->redirtbl[i]; if (ent->fields.trig_mode != IOAPIC_LEVEL_TRIG) continue; if (ioapic->irr & (1 << i) && !ent->fields.remote_irr) ioapic_service(ioapic, i, false); } spin_unlock(&ioapic->lock); }

Contributors

PersonTokensPropCommitsCommitProp
zhang haoyuzhang haoyu114100.00%1100.00%
Total114100.00%1100.00%

#define IOAPIC_SUCCESSIVE_IRQ_MAX_COUNT 10000
static void __kvm_ioapic_update_eoi(struct kvm_vcpu *vcpu, struct kvm_ioapic *ioapic, int vector, int trigger_mode) { struct dest_map *dest_map = &ioapic->rtc_status.dest_map; struct kvm_lapic *apic = vcpu->arch.apic; int i; /* RTC special handling */ if (test_bit(vcpu->vcpu_id, dest_map->map) && vector == dest_map->vectors[vcpu->vcpu_id]) rtc_irq_eoi(ioapic, vcpu); for (i = 0; i < IOAPIC_NUM_PINS; i++) { union kvm_ioapic_redirect_entry *ent = &ioapic->redirtbl[i]; if (ent->fields.vector != vector) continue; /* * We are dropping lock while calling ack notifiers because ack * notifier callbacks for assigned devices call into IOAPIC * recursively. Since remote_irr is cleared only after call * to notifiers if the same vector will be delivered while lock * is dropped it will be put into irr and will be delivered * after ack notifier returns. */ spin_unlock(&ioapic->lock); kvm_notify_acked_irq(ioapic->kvm, KVM_IRQCHIP_IOAPIC, i); spin_lock(&ioapic->lock); if (trigger_mode != IOAPIC_LEVEL_TRIG || kvm_lapic_get_reg(apic, APIC_SPIV) & APIC_SPIV_DIRECTED_EOI) continue; ASSERT(ent->fields.trig_mode == IOAPIC_LEVEL_TRIG); ent->fields.remote_irr = 0; if (!ent->fields.mask && (ioapic->irr & (1 << i))) { ++ioapic->irq_eoi[i]; if (ioapic->irq_eoi[i] == IOAPIC_SUCCESSIVE_IRQ_MAX_COUNT) { /* * Real hardware does not deliver the interrupt * immediately during eoi broadcast, and this * lets a buggy guest make slow progress * even if it does not correctly handle a * level-triggered interrupt. Emulate this * behavior if we detect an interrupt storm. */ schedule_delayed_work(&ioapic->eoi_inject, HZ / 100); ioapic->irq_eoi[i] = 0; trace_kvm_ioapic_delayed_eoi_inj(ent->bits); } else { ioapic_service(ioapic, i, false); } } else { ioapic->irq_eoi[i] = 0; } } }

Contributors

PersonTokensPropCommitsCommitProp
zhang haoyuzhang haoyu7627.24%17.14%
eddie dongeddie dong5620.07%17.14%
gleb natapovgleb natapov4917.56%17.14%
joerg roedeljoerg roedel4616.49%17.14%
marcelo tosattimarcelo tosatti217.53%321.43%
radim krcmarradim krcmar196.81%17.14%
yang zhangyang zhang72.51%214.29%
avi kivityavi kivity20.72%17.14%
mark mcloughlinmark mcloughlin10.36%17.14%
sheng yangsheng yang10.36%17.14%
suravee suthikulpanitsuravee suthikulpanit10.36%17.14%
Total279100.00%14100.00%


void kvm_ioapic_update_eoi(struct kvm_vcpu *vcpu, int vector, int trigger_mode) { struct kvm_ioapic *ioapic = vcpu->kvm->arch.vioapic; spin_lock(&ioapic->lock); __kvm_ioapic_update_eoi(vcpu, ioapic, vector, trigger_mode); spin_unlock(&ioapic->lock); }

Contributors

PersonTokensPropCommitsCommitProp
michael s. tsirkinmichael s. tsirkin2442.86%116.67%
gleb natapovgleb natapov1323.21%116.67%
avi kivityavi kivity916.07%116.67%
yang zhangyang zhang610.71%116.67%
marcelo tosattimarcelo tosatti47.14%233.33%
Total56100.00%6100.00%


static inline struct kvm_ioapic *to_ioapic(struct kvm_io_device *dev) { return container_of(dev, struct kvm_ioapic, dev); }

Contributors

PersonTokensPropCommitsCommitProp
gregory haskinsgregory haskins25100.00%1100.00%
Total25100.00%1100.00%


static inline int ioapic_in_range(struct kvm_ioapic *ioapic, gpa_t addr) { return ((addr >= ioapic->base_address && (addr < ioapic->base_address + IOAPIC_MEM_LENGTH))); }

Contributors

PersonTokensPropCommitsCommitProp
eddie dongeddie dong3391.67%150.00%
michael s. tsirkinmichael s. tsirkin38.33%150.00%
Total36100.00%2100.00%


static int ioapic_mmio_read(struct kvm_vcpu *vcpu, struct kvm_io_device *this, gpa_t addr, int len, void *val) { struct kvm_ioapic *ioapic = to_ioapic(this); u32 result; if (!ioapic_in_range(ioapic, addr)) return -EOPNOTSUPP; ioapic_debug("addr %lx\n", (unsigned long)addr); ASSERT(!(addr & 0xf)); /* check alignment */ addr &= 0xff; spin_lock(&ioapic->lock); switch (addr) { case IOAPIC_REG_SELECT: result = ioapic->ioregsel; break; case IOAPIC_REG_WINDOW: result = ioapic_read_indirect(ioapic, addr, len); break; default: result = 0; break; } spin_unlock(&ioapic->lock); switch (len) { case 8: *(u64 *) val = result; break; case 1: case 2: case 4: memcpy(val, (char *)&result, len); break; default: printk(KERN_WARNING "ioapic: wrong length %d\n", len); } return 0; }

Contributors

PersonTokensPropCommitsCommitProp
eddie dongeddie dong14074.87%112.50%
michael s. tsirkinmichael s. tsirkin189.63%112.50%
gleb natapovgleb natapov126.42%112.50%
marcelo tosattimarcelo tosatti84.28%225.00%
nikolay nikolaevnikolay nikolaev52.67%112.50%
gregory haskinsgregory haskins31.60%112.50%
laurent vivierlaurent vivier10.53%112.50%
Total187100.00%8100.00%


static int ioapic_mmio_write(struct kvm_vcpu *vcpu, struct kvm_io_device *this, gpa_t addr, int len, const void *val) { struct kvm_ioapic *ioapic = to_ioapic(this); u32 data; if (!ioapic_in_range(ioapic, addr)) return -EOPNOTSUPP; ioapic_debug("ioapic_mmio_write addr=%p len=%d val=%p\n", (void*)addr, len, val); ASSERT(!(addr & 0xf)); /* check alignment */ switch (len) { case 8: case 4: data = *(u32 *) val; break; case 2: data = *(u16 *) val; break; case 1: data = *(u8 *) val; break; default: printk(KERN_WARNING "ioapic: Unsupported size %d\n", len); return 0; } addr &= 0xff; spin_lock(&ioapic->lock); switch (addr) { case IOAPIC_REG_SELECT: ioapic->ioregsel = data & 0xFF; /* 8-bit register */ break; case IOAPIC_REG_WINDOW: ioapic_write_indirect(ioapic, data); break; default: break; } spin_unlock(&ioapic->lock); return 0; }

Contributors

PersonTokensPropCommitsCommitProp
eddie dongeddie dong10654.36%111.11%
julian stecklinajulian stecklina3920.00%111.11%
michael s. tsirkinmichael s. tsirkin189.23%111.11%
gleb natapovgleb natapov115.64%111.11%
marcelo tosattimarcelo tosatti84.10%222.22%
laurent vivierlaurent vivier52.56%111.11%
nikolay nikolaevnikolay nikolaev52.56%111.11%
gregory haskinsgregory haskins31.54%111.11%
Total195100.00%9100.00%


static void kvm_ioapic_reset(struct kvm_ioapic *ioapic) { int i; cancel_delayed_work_sync(&ioapic->eoi_inject); for (i = 0; i < IOAPIC_NUM_PINS; i++) ioapic->redirtbl[i].fields.mask = 1; ioapic->base_address = IOAPIC_DEFAULT_BASE_ADDRESS; ioapic->ioregsel = 0; ioapic->irr = 0; ioapic->irr_delivered = 0; ioapic->id = 0; memset(ioapic->irq_eoi, 0x00, sizeof(ioapic->irq_eoi)); rtc_irq_eoi_tracking_reset(ioapic); }

Contributors

PersonTokensPropCommitsCommitProp
eddie dongeddie dong6363.64%116.67%
zhang haoyuzhang haoyu1818.18%116.67%
jiri slabyjiri slaby66.06%116.67%
wincy vanwincy van66.06%116.67%
yang zhangyang zhang55.05%116.67%
stephen hemmingerstephen hemminger11.01%116.67%
Total99100.00%6100.00%

static const struct kvm_io_device_ops ioapic_mmio_ops = { .read = ioapic_mmio_read, .write = ioapic_mmio_write, };
int kvm_ioapic_init(struct kvm *kvm) { struct kvm_ioapic *ioapic; int ret; ioapic = kzalloc(sizeof(struct kvm_ioapic), GFP_KERNEL); if (!ioapic) return -ENOMEM; spin_lock_init(&ioapic->lock); INIT_DELAYED_WORK(&ioapic->eoi_inject, kvm_ioapic_eoi_inject_work); kvm->arch.vioapic = ioapic; kvm_ioapic_reset(ioapic); kvm_iodevice_init(&ioapic->dev, &ioapic_mmio_ops); ioapic->kvm = kvm; mutex_lock(&kvm->slots_lock); ret = kvm_io_bus_register_dev(kvm, KVM_MMIO_BUS, ioapic->base_address, IOAPIC_MEM_LENGTH, &ioapic->dev); mutex_unlock(&kvm->slots_lock); if (ret < 0) { kvm->arch.vioapic = NULL; kfree(ioapic); return ret; } kvm_vcpu_request_scan_ioapic(kvm); return ret; }

Contributors

PersonTokensPropCommitsCommitProp
eddie dongeddie dong6944.23%214.29%
gregory haskinsgregory haskins2415.38%214.29%
marcelo tosattimarcelo tosatti1811.54%321.43%
wei yongjunwei yongjun106.41%17.14%
zhang haoyuzhang haoyu106.41%17.14%
paolo bonzinipaolo bonzini85.13%17.14%
gleb natapovgleb natapov74.49%17.14%
sasha levinsasha levin63.85%17.14%
xiantao zhangxiantao zhang21.28%17.14%
michael s. tsirkinmichael s. tsirkin21.28%17.14%
Total156100.00%14100.00%


void kvm_ioapic_destroy(struct kvm *kvm) { struct kvm_ioapic *ioapic = kvm->arch.vioapic; cancel_delayed_work_sync(&ioapic->eoi_inject); kvm_io_bus_unregister_dev(kvm, KVM_MMIO_BUS, &ioapic->dev); kvm->arch.vioapic = NULL; kfree(ioapic); }

Contributors

PersonTokensPropCommitsCommitProp
wei yongjunwei yongjun4685.19%150.00%
zhang haoyuzhang haoyu814.81%150.00%
Total54100.00%2100.00%


int kvm_get_ioapic(struct kvm *kvm, struct kvm_ioapic_state *state) { struct kvm_ioapic *ioapic = ioapic_irqchip(kvm); if (!ioapic) return -EINVAL; spin_lock(&ioapic->lock); memcpy(state, ioapic, sizeof(struct kvm_ioapic_state)); state->irr &= ~ioapic->irr_delivered; spin_unlock(&ioapic->lock); return 0; }

Contributors

PersonTokensPropCommitsCommitProp
gleb natapovgleb natapov6485.33%133.33%
wincy vanwincy van912.00%133.33%
marcelo tosattimarcelo tosatti22.67%133.33%
Total75100.00%3100.00%


int kvm_set_ioapic(struct kvm *kvm, struct kvm_ioapic_state *state) { struct kvm_ioapic *ioapic = ioapic_irqchip(kvm); if (!ioapic) return -EINVAL; spin_lock(&ioapic->lock); memcpy(ioapic, state, sizeof(struct kvm_ioapic_state)); ioapic->irr = 0; ioapic->irr_delivered = 0; kvm_vcpu_request_scan_ioapic(kvm); kvm_ioapic_inject_all(ioapic, state->irr); spin_unlock(&ioapic->lock); return 0; }

Contributors

PersonTokensPropCommitsCommitProp
gleb natapovgleb natapov6469.57%114.29%
paolo bonzinipaolo bonzini1111.96%114.29%
yang zhangyang zhang99.78%342.86%
wincy vanwincy van66.52%114.29%
marcelo tosattimarcelo tosatti22.17%114.29%
Total92100.00%7100.00%


Overall Contributors

PersonTokensPropCommitsCommitProp
eddie dongeddie dong83626.55%22.74%
yang zhangyang zhang60619.24%912.33%
gleb natapovgleb natapov38712.29%912.33%
paolo bonzinipaolo bonzini37611.94%810.96%
zhang haoyuzhang haoyu2307.30%11.37%
michael s. tsirkinmichael s. tsirkin1564.95%56.85%
joerg roedeljoerg roedel942.99%22.74%
gregory haskinsgregory haskins732.32%22.74%
marcelo tosattimarcelo tosatti722.29%79.59%
wei yongjunwei yongjun561.78%22.74%
avi kivityavi kivity531.68%45.48%
radim krcmarradim krcmar411.30%34.11%
julian stecklinajulian stecklina391.24%11.37%
wincy vanwincy van341.08%11.37%
laurent vivierlaurent vivier240.76%11.37%
sheng yangsheng yang170.54%22.74%
nikolay nikolaevnikolay nikolaev100.32%11.37%
andy honigandy honig90.29%11.37%
xiantao zhangxiantao zhang80.25%34.11%
jiri slabyjiri slaby60.19%11.37%
sasha levinsasha levin60.19%11.37%
james sullivanjames sullivan60.19%11.37%
andrey smetaninandrey smetanin30.10%11.37%
tejun heotejun heo30.10%11.37%
liu yuanliu yuan10.03%11.37%
suravee suthikulpanitsuravee suthikulpanit10.03%11.37%
stephen hemmingerstephen hemminger10.03%11.37%
mark mcloughlinmark mcloughlin10.03%11.37%
Total3149100.00%73100.00%
Directory: arch/x86/kvm
Information contained on this website is for historical information purposes only and does not indicate or represent copyright ownership.