/* lock for slave active lists */
 static DEFINE_SPINLOCK(slave_active_lock);
 
+#define MAX_SLAVE_INSTANCES    1000
+static int num_slaves;
+
 static DEFINE_MUTEX(register_mutex);
 
 static int snd_timer_free(struct snd_timer *timer);
                        err = -EINVAL;
                        goto unlock;
                }
+               if (num_slaves >= MAX_SLAVE_INSTANCES) {
+                       err = -EBUSY;
+                       goto unlock;
+               }
                timeri = snd_timer_instance_new(owner, NULL);
                if (!timeri) {
                        err = -ENOMEM;
                timeri->slave_id = tid->device;
                timeri->flags |= SNDRV_TIMER_IFLG_SLAVE;
                list_add_tail(&timeri->open_list, &snd_timer_slave_list);
+               num_slaves++;
                err = snd_timer_check_slave(timeri);
                if (err < 0) {
                        snd_timer_close_locked(timeri);
        }
 
        list_del(&timeri->open_list);
+       if (timeri->flags & SNDRV_TIMER_IFLG_SLAVE)
+               num_slaves--;
 
        /* force to stop the timer */
        snd_timer_stop(timeri);