kvm: drop parameter validation
PATCH 1/1 kvm: drop parameter validation
We validate irq pin number when routing is setup, so code handling illegal irq # in pic and ioapic on each injection is never called.
Drop it.
---
Reposting, applies without changes to kvm/next.
arch/x86/kvm/i8259.c | 16 +++++++--------- virt/kvm/ioapic.c | 35 +++++++++++++++++------------------ 2 files changed, 24 insertions(+), 27 deletions(-)
arch/x86/kvm/i8259.c +7 -9
@@ -190,17 +190,15 @@ void kvm_pic_update_irq(struct kvm_pic *s)int kvm_pic_set_irq (struct kvm_pic *s,int irq,int irq_source_id,int level) { -int ret =-1 ; +int ret, irq_level;pic_lock (s); -if (irq >=0 && irq <PIC_NUM_PINS ) { -int irq_level =__kvm_irq_line_state (&s->irq_states[irq], - irq_source_id, level); - ret =pic_set_irq1 (&s->pics[irq >>3 ], irq &7 , irq_level); -pic_update_irq (s); -trace_kvm_pic_set_irq (irq >>3 , irq &7 , s->pics[irq >>3 ].elcr, - s->pics[irq >>3 ].imr, ret ==0 ); - } + irq_level =__kvm_irq_line_state (&s->irq_states[irq], + irq_source_id, level); + ret =pic_set_irq1 (&s->pics[irq >>3 ], irq &7 , irq_level); +pic_update_irq (s); +trace_kvm_pic_set_irq (irq >>3 , irq &7 , s->pics[irq >>3 ].elcr, + s->pics[irq >>3 ].imr, ret ==0 );pic_unlock (s);return ret;
virt/kvm/ioapic.c +17 -18
@@ -197,28 +197,27 @@ int kvm_ioapic_set_irq(struct kvm_ioapic *ioapic, int irq, int irq_source_id,u32 old_irr;u32 mask =1 << irq;union kvm_ioapic_redirect_entry entry; -int ret =1 ; +int ret, irq_level;spin_lock (&ioapic->lock); old_irr = ioapic->irr; -if (irq >=0 && irq <IOAPIC_NUM_PINS ) { -int irq_level =__kvm_irq_line_state (&ioapic->irq_states[irq], - irq_source_id, level); - entry = ioapic->redirtbl[irq]; - irq_level ^= entry.fields.polarity; -if (!irq_level) - ioapic->irr &= ~mask; -else { -int edge = (entry.fields.trig_mode ==IOAPIC_EDGE_TRIG ); - ioapic->irr |= mask; -if ((edge && old_irr != ioapic->irr) || - (!edge && !entry.fields.remote_irr)) - ret =ioapic_service (ioapic, irq); -else - ret =0 ;/* report coalesced interrupt */ - } -trace_kvm_ioapic_set_irq (entry.bits, irq, ret ==0 ); + irq_level =__kvm_irq_line_state (&ioapic->irq_states[irq], + irq_source_id, level); + entry = ioapic->redirtbl[irq]; + irq_level ^= entry.fields.polarity; +if (!irq_level) { + ioapic->irr &= ~mask; + ret =1 ; + }else { +int edge = (entry.fields.trig_mode ==IOAPIC_EDGE_TRIG ); + ioapic->irr |= mask; +if ((edge && old_irr != ioapic->irr) || + (!edge && !entry.fields.remote_irr)) + ret =ioapic_service (ioapic, irq); +else + ret =0 ;/* report coalesced interrupt */ } +trace_kvm_ioapic_set_irq (entry.bits, irq, ret ==0 );spin_unlock (&ioapic->lock);return ret;
Signature · 1 line
MST
Quoted 5 lines · Michael S. Tsirkin
We validate irq pin number when routing is setup, so code handling illegal irq # in pic and ioapic on each injection is never called.
Drop it.
I would leave BUG_ON there for a while.
Quoted 90 lines
Signed-off-by Michael S. Tsirkin <[email protected]>---
Reposting, applies without changes to kvm/next.
arch/x86/kvm/i8259.c | 16 +++++++--------- virt/kvm/ioapic.c | 35 +++++++++++++++++------------------ 2 files changed, 24 insertions(+), 27 deletions(-)arch/x86/kvm/i8259.c +7
-9@@ -190,17 +190,15 @@ void kvm_pic_update_irq(struct kvm_pic *s)int kvm_pic_set_irq (struct kvm_pic *s,int irq,int irq_source_id,int level) { -int ret =-1 ; +int ret, irq_level;pic_lock (s); -if (irq >=0 && irq <PIC_NUM_PINS ) { -int irq_level =__kvm_irq_line_state (&s->irq_states[irq], - irq_source_id, level); - ret =pic_set_irq1 (&s->pics[irq >>3 ], irq &7 , irq_level); -pic_update_irq (s); -trace_kvm_pic_set_irq (irq >>3 , irq &7 , s->pics[irq >>3 ].elcr, - s->pics[irq >>3 ].imr, ret ==0 ); - } + irq_level =__kvm_irq_line_state (&s->irq_states[irq], + irq_source_id, level); + ret =pic_set_irq1 (&s->pics[irq >>3 ], irq &7 , irq_level); +pic_update_irq (s); +trace_kvm_pic_set_irq (irq >>3 , irq &7 , s->pics[irq >>3 ].elcr, + s->pics[irq >>3 ].imr, ret ==0 );pic_unlock (s);return ret;virt/kvm/ioapic.c +17
-18@@ -197,28 +197,27 @@ int kvm_ioapic_set_irq(struct kvm_ioapic *ioapic, int irq, int irq_source_id,u32 old_irr;u32 mask =1 << irq;union kvm_ioapic_redirect_entry entry; -int ret =1 ; +int ret, irq_level;spin_lock (&ioapic->lock); old_irr = ioapic->irr; -if (irq >=0 && irq <IOAPIC_NUM_PINS ) { -int irq_level =__kvm_irq_line_state (&ioapic->irq_states[irq], - irq_source_id, level); - entry = ioapic->redirtbl[irq]; - irq_level ^= entry.fields.polarity; -if (!irq_level) - ioapic->irr &= ~mask; -else { -int edge = (entry.fields.trig_mode ==IOAPIC_EDGE_TRIG ); - ioapic->irr |= mask; -if ((edge && old_irr != ioapic->irr) || - (!edge && !entry.fields.remote_irr)) - ret =ioapic_service (ioapic, irq); -else - ret =0 ;/* report coalesced interrupt */ - } -trace_kvm_ioapic_set_irq (entry.bits, irq, ret ==0 ); + irq_level =__kvm_irq_line_state (&ioapic->irq_states[irq], + irq_source_id, level); + entry = ioapic->redirtbl[irq]; + irq_level ^= entry.fields.polarity; +if (!irq_level) { + ioapic->irr &= ~mask; + ret =1 ; + }else { +int edge = (entry.fields.trig_mode ==IOAPIC_EDGE_TRIG ); + ioapic->irr |= mask; +if ((edge && old_irr != ioapic->irr) || + (!edge && !entry.fields.remote_irr)) + ret =ioapic_service (ioapic, irq); +else + ret =0 ;/* report coalesced interrupt */ } +trace_kvm_ioapic_set_irq (entry.bits, irq, ret ==0 );spin_unlock (&ioapic->lock);return ret;Signature · 1 line
MST
--
Gleb.
Quoted 7 lines · Gleb Natapov
Quoted 5 lines · Michael S. Tsirkin
We validate irq pin number when routing is setup, so code handling illegal irq # in pic and ioapic on each injection is never called.
Drop it.I would leave
BUG_ONthere for a while.
Which BUG_ON?
Quoted 98 lines
Quoted 91 lines
Signed-off-by Michael S. Tsirkin <[email protected]>---
Reposting, applies without changes to kvm/next.
arch/x86/kvm/i8259.c | 16 +++++++--------- virt/kvm/ioapic.c | 35 +++++++++++++++++------------------ 2 files changed, 24 insertions(+), 27 deletions(-)arch/x86/kvm/i8259.c +7
-9@@ -190,17 +190,15 @@ void kvm_pic_update_irq(struct kvm_pic *s)int kvm_pic_set_irq (struct kvm_pic *s,int irq,int irq_source_id,int level) { -int ret =-1 ; +int ret, irq_level;pic_lock (s); -if (irq >=0 && irq <PIC_NUM_PINS ) { -int irq_level =__kvm_irq_line_state (&s->irq_states[irq], - irq_source_id, level); - ret =pic_set_irq1 (&s->pics[irq >>3 ], irq &7 , irq_level); -pic_update_irq (s); -trace_kvm_pic_set_irq (irq >>3 , irq &7 , s->pics[irq >>3 ].elcr, - s->pics[irq >>3 ].imr, ret ==0 ); - } + irq_level =__kvm_irq_line_state (&s->irq_states[irq], + irq_source_id, level); + ret =pic_set_irq1 (&s->pics[irq >>3 ], irq &7 , irq_level); +pic_update_irq (s); +trace_kvm_pic_set_irq (irq >>3 , irq &7 , s->pics[irq >>3 ].elcr, + s->pics[irq >>3 ].imr, ret ==0 );pic_unlock (s);return ret;virt/kvm/ioapic.c +17
-18@@ -197,28 +197,27 @@ int kvm_ioapic_set_irq(struct kvm_ioapic *ioapic, int irq, int irq_source_id,u32 old_irr;u32 mask =1 << irq;union kvm_ioapic_redirect_entry entry; -int ret =1 ; +int ret, irq_level;spin_lock (&ioapic->lock); old_irr = ioapic->irr; -if (irq >=0 && irq <IOAPIC_NUM_PINS ) { -int irq_level =__kvm_irq_line_state (&ioapic->irq_states[irq], - irq_source_id, level); - entry = ioapic->redirtbl[irq]; - irq_level ^= entry.fields.polarity; -if (!irq_level) - ioapic->irr &= ~mask; -else { -int edge = (entry.fields.trig_mode ==IOAPIC_EDGE_TRIG ); - ioapic->irr |= mask; -if ((edge && old_irr != ioapic->irr) || - (!edge && !entry.fields.remote_irr)) - ret =ioapic_service (ioapic, irq); -else - ret =0 ;/* report coalesced interrupt */ - } -trace_kvm_ioapic_set_irq (entry.bits, irq, ret ==0 ); + irq_level =__kvm_irq_line_state (&ioapic->irq_states[irq], + irq_source_id, level); + entry = ioapic->redirtbl[irq]; + irq_level ^= entry.fields.polarity; +if (!irq_level) { + ioapic->irr &= ~mask; + ret =1 ; + }else { +int edge = (entry.fields.trig_mode ==IOAPIC_EDGE_TRIG ); + ioapic->irr |= mask; +if ((edge && old_irr != ioapic->irr) || + (!edge && !entry.fields.remote_irr)) + ret =ioapic_service (ioapic, irq); +else + ret =0 ;/* report coalesced interrupt */ } +trace_kvm_ioapic_set_irq (entry.bits, irq, ret ==0 );spin_unlock (&ioapic->lock);return ret;Signature · 1 line
MST--
Gleb.
--
To unsubscribe from this list: send the line "unsubscribe kvm" in the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html
Quoted 11 lines · Marcelo Tosatti
Quoted 7 lines · Gleb Natapov
Quoted 5 lines · Michael S. Tsirkin
We validate irq pin number when routing is setup, so code handling illegal irq # in pic and ioapic on each injection is never called.
Drop it.I would leave
BUG_ONthere for a while.Which
BUG_ON?
I mean changing if() to BUG_ON().
BUG_ON (!(irq >= 0 && irq < PIC_NUM_PINS))
Quoted 88 lines
Quoted 88 lines
Quoted 88 lines
Signed-off-by Michael S. Tsirkin <[email protected]>---
Reposting, applies without changes to kvm/next.
arch/x86/kvm/i8259.c | 16 +++++++--------- virt/kvm/ioapic.c | 35 +++++++++++++++++------------------ 2 files changed, 24 insertions(+), 27 deletions(-)arch/x86/kvm/i8259.c +7
-9@@ -190,17 +190,15 @@ void kvm_pic_update_irq(struct kvm_pic *s)int kvm_pic_set_irq (struct kvm_pic *s,int irq,int irq_source_id,int level) { -int ret =-1 ; +int ret, irq_level;pic_lock (s); -if (irq >=0 && irq <PIC_NUM_PINS ) { -int irq_level =__kvm_irq_line_state (&s->irq_states[irq], - irq_source_id, level); - ret =pic_set_irq1 (&s->pics[irq >>3 ], irq &7 , irq_level); -pic_update_irq (s); -trace_kvm_pic_set_irq (irq >>3 , irq &7 , s->pics[irq >>3 ].elcr, - s->pics[irq >>3 ].imr, ret ==0 ); - } + irq_level =__kvm_irq_line_state (&s->irq_states[irq], + irq_source_id, level); + ret =pic_set_irq1 (&s->pics[irq >>3 ], irq &7 , irq_level); +pic_update_irq (s); +trace_kvm_pic_set_irq (irq >>3 , irq &7 , s->pics[irq >>3 ].elcr, + s->pics[irq >>3 ].imr, ret ==0 );pic_unlock (s);return ret;virt/kvm/ioapic.c +17
-18@@ -197,28 +197,27 @@ int kvm_ioapic_set_irq(struct kvm_ioapic *ioapic, int irq, int irq_source_id,u32 old_irr;u32 mask =1 << irq;union kvm_ioapic_redirect_entry entry; -int ret =1 ; +int ret, irq_level;spin_lock (&ioapic->lock); old_irr = ioapic->irr; -if (irq >=0 && irq <IOAPIC_NUM_PINS ) { -int irq_level =__kvm_irq_line_state (&ioapic->irq_states[irq], - irq_source_id, level); - entry = ioapic->redirtbl[irq]; - irq_level ^= entry.fields.polarity; -if (!irq_level) - ioapic->irr &= ~mask; -else { -int edge = (entry.fields.trig_mode ==IOAPIC_EDGE_TRIG ); - ioapic->irr |= mask; -if ((edge && old_irr != ioapic->irr) || - (!edge && !entry.fields.remote_irr)) - ret =ioapic_service (ioapic, irq); -else - ret =0 ;/* report coalesced interrupt */ - } -trace_kvm_ioapic_set_irq (entry.bits, irq, ret ==0 ); + irq_level =__kvm_irq_line_state (&ioapic->irq_states[irq], + irq_source_id, level); + entry = ioapic->redirtbl[irq]; + irq_level ^= entry.fields.polarity; +if (!irq_level) { + ioapic->irr &= ~mask; + ret =1 ; + }else { +int edge = (entry.fields.trig_mode ==IOAPIC_EDGE_TRIG ); + ioapic->irr |= mask; +if ((edge && old_irr != ioapic->irr) || + (!edge && !entry.fields.remote_irr)) + ret =ioapic_service (ioapic, irq); +else + ret =0 ;/* report coalesced interrupt */ } +trace_kvm_ioapic_set_irq (entry.bits, irq, ret ==0 );spin_unlock (&ioapic->lock);
Quoted 10 lines
Quoted 10 lines
Quoted 3 lines
virt/kvm/ioapic.c +0
-0return ret;Signature · 1 line
MST--
Gleb.
--
To unsubscribe from this list: send the line "unsubscribe kvm" in the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html
--
Gleb.
Quoted 8 lines · Gleb Natapov
Quoted 7 lines · Marcelo Tosatti
Quoted 6 lines · Gleb Natapov
Quoted 5 lines · Michael S. Tsirkin
We validate irq pin number when routing is setup, so code handling illegal irq # in pic and ioapic on each injection is never called.
Drop it.
Quoted 7 lines
Quoted 4 lines
Quoted 1 line
I would leave
BUG_ONthere for a while.Which
BUG_ON?I mean changing
if()toBUG_ON().
BUG_ON(!(irq >= 0 && irq <PIC_NUM_PINS))
Yes posting v2 that does this soon.
Quoted 101 lines
Quoted 88 lines
Quoted 88 lines
Quoted 88 lines
Signed-off-by Michael S. Tsirkin <[email protected]>---
Reposting, applies without changes to kvm/next.
arch/x86/kvm/i8259.c | 16 +++++++--------- virt/kvm/ioapic.c | 35 +++++++++++++++++------------------ 2 files changed, 24 insertions(+), 27 deletions(-)arch/x86/kvm/i8259.c +7
-9@@ -190,17 +190,15 @@ void kvm_pic_update_irq(struct kvm_pic *s)int kvm_pic_set_irq (struct kvm_pic *s,int irq,int irq_source_id,int level) { -int ret =-1 ; +int ret, irq_level;pic_lock (s); -if (irq >=0 && irq <PIC_NUM_PINS ) { -int irq_level =__kvm_irq_line_state (&s->irq_states[irq], - irq_source_id, level); - ret =pic_set_irq1 (&s->pics[irq >>3 ], irq &7 , irq_level); -pic_update_irq (s); -trace_kvm_pic_set_irq (irq >>3 , irq &7 , s->pics[irq >>3 ].elcr, - s->pics[irq >>3 ].imr, ret ==0 ); - } + irq_level =__kvm_irq_line_state (&s->irq_states[irq], + irq_source_id, level); + ret =pic_set_irq1 (&s->pics[irq >>3 ], irq &7 , irq_level); +pic_update_irq (s); +trace_kvm_pic_set_irq (irq >>3 , irq &7 , s->pics[irq >>3 ].elcr, + s->pics[irq >>3 ].imr, ret ==0 );pic_unlock (s);return ret;virt/kvm/ioapic.c +17
-18@@ -197,28 +197,27 @@ int kvm_ioapic_set_irq(struct kvm_ioapic *ioapic, int irq, int irq_source_id,u32 old_irr;u32 mask =1 << irq;union kvm_ioapic_redirect_entry entry; -int ret =1 ; +int ret, irq_level;spin_lock (&ioapic->lock); old_irr = ioapic->irr; -if (irq >=0 && irq <IOAPIC_NUM_PINS ) { -int irq_level =__kvm_irq_line_state (&ioapic->irq_states[irq], - irq_source_id, level); - entry = ioapic->redirtbl[irq]; - irq_level ^= entry.fields.polarity; -if (!irq_level) - ioapic->irr &= ~mask; -else { -int edge = (entry.fields.trig_mode ==IOAPIC_EDGE_TRIG ); - ioapic->irr |= mask; -if ((edge && old_irr != ioapic->irr) || - (!edge && !entry.fields.remote_irr)) - ret =ioapic_service (ioapic, irq); -else - ret =0 ;/* report coalesced interrupt */ - } -trace_kvm_ioapic_set_irq (entry.bits, irq, ret ==0 ); + irq_level =__kvm_irq_line_state (&ioapic->irq_states[irq], + irq_source_id, level); + entry = ioapic->redirtbl[irq]; + irq_level ^= entry.fields.polarity; +if (!irq_level) { + ioapic->irr &= ~mask; + ret =1 ; + }else { +int edge = (entry.fields.trig_mode ==IOAPIC_EDGE_TRIG ); + ioapic->irr |= mask; +if ((edge && old_irr != ioapic->irr) || + (!edge && !entry.fields.remote_irr)) + ret =ioapic_service (ioapic, irq); +else + ret =0 ;/* report coalesced interrupt */ } +trace_kvm_ioapic_set_irq (entry.bits, irq, ret ==0 );spin_unlock (&ioapic->lock);Quoted 10 lines
Quoted 10 lines
Quoted 3 lines
virt/kvm/ioapic.c +0
-0return ret;Signature · 1 line
MST--
Gleb.
--
To unsubscribe from this list: send the line "unsubscribe kvm" in the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html--
Gleb.