[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH 18/25] argo: limit the max number of rings that a domain may register.
Very basic implementation: a fixed limit of 128. Signed-off-by: Christopher Clark <christopher.clark6@xxxxxxxxxxxxxx> --- xen/common/argo.c | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/xen/common/argo.c b/xen/common/argo.c index ca48032..cc908f4 100644 --- a/xen/common/argo.c +++ b/xen/common/argo.c @@ -26,6 +26,8 @@ #include <xen/time.h> #include <xsm/xsm.h> +#define ARGO_MAX_RINGS_PER_DOMAIN 128U + DEFINE_XEN_GUEST_HANDLE(argo_pfn_t); DEFINE_XEN_GUEST_HANDLE(argo_addr_t); DEFINE_XEN_GUEST_HANDLE(argo_send_addr_t); @@ -101,6 +103,8 @@ struct argo_domain struct hlist_head ring_hash[ARGO_HTABLE_SIZE]; /* id cookie, written only at init, so readable with R(L1) */ uint64_t domain_cookie; + /* counter of rings registered by this domain, protected by L2 */ + uint32_t ring_count; }; /* @@ -1161,7 +1165,10 @@ argo_unregister_ring(struct domain *d, ring_info = argo_ring_find_info(d, &ring.id); if ( ring_info ) + { argo_ring_remove_info(d, ring_info); + d->argo->ring_count--; + } write_unlock(&d->argo->lock); @@ -1298,6 +1305,12 @@ argo_register_ring(struct domain *d, write_lock(&d->argo->lock); do { + if ( d->argo->ring_count >= ARGO_MAX_RINGS_PER_DOMAIN ) + { + ret = -ENOSPC; + break; + } + ring_info = argo_ring_find_info(d, &ring.id); if ( !ring_info ) @@ -1357,7 +1370,10 @@ argo_register_ring(struct domain *d, ret = update_tx_ptr ? argo_update_tx_ptr(ring_info, ring.tx_ptr) : argo_ring_map_page(ring_info, 0, NULL); if ( !ret ) + { ring_info->len = ring.len; + d->argo->ring_count++; + } } while ( 0 ); @@ -1698,6 +1714,7 @@ argo_init(struct domain *d) return -ENOMEM; rwlock_init(&argo->lock); + argo->ring_count = 0; for ( i = 0; i < ARGO_HTABLE_SIZE; ++i ) INIT_HLIST_HEAD(&argo->ring_hash[i]); -- 2.1.4 _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxxxxxxxxx https://lists.xenproject.org/mailman/listinfo/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |