Index: bsps/shared/irq/irq-server.c
===================================================================
--- bsps/shared/irq/irq-server.c	(revision 3c093d6752fb8e51216d734b60db1e97ecdb3fe4)
+++ bsps/shared/irq/irq-server.c	(revision 99c73303deb09ad66d4cc1c89961f62e4e618938)
@@ -507,7 +507,4 @@
 #endif
 
-  rtems_interrupt_lock_initialize(&s->lock, "Interrupt Server");
-  rtems_chain_initialize_empty(&s->entries);
-
   sc = rtems_task_create(
     rtems_build_name('I', 'R', 'Q', 'S'),
@@ -519,21 +516,28 @@
   );
   if (sc != RTEMS_SUCCESSFUL) {
-    return sc;
-  }
+    (*s->destroy)(s);
+    return sc;
+  }
+
+  rtems_interrupt_lock_initialize(&s->lock, "Interrupt Server");
+  rtems_chain_initialize_empty(&s->entries);
 
 #if defined(RTEMS_SMP)
   sc = rtems_scheduler_ident_by_processor(cpu_index, &scheduler);
-  if (sc != RTEMS_SUCCESSFUL) {
-    /* Do not start an interrupt server on a processor without a scheduler */
-    return RTEMS_SUCCESSFUL;
-  }
-
-  sc = rtems_task_set_scheduler(s->server, scheduler, priority);
-  _Assert(sc == RTEMS_SUCCESSFUL);
-
-  /* Set the task to processor affinity on a best-effort basis */
-  CPU_ZERO(&cpu);
-  CPU_SET(cpu_index, &cpu);
-  (void) rtems_task_set_affinity(s->server, sizeof(cpu), &cpu);
+
+  /*
+   * If a scheduler exists for the processor, then move it to this scheduler
+   * and try to set the affinity to the processor, otherwise keep the scheduler
+   * of the executing thread.
+   */
+  if (sc == RTEMS_SUCCESSFUL) {
+    sc = rtems_task_set_scheduler(s->server, scheduler, priority);
+    _Assert(sc == RTEMS_SUCCESSFUL);
+
+    /* Set the task to processor affinity on a best-effort basis */
+    CPU_ZERO(&cpu);
+    CPU_SET(cpu_index, &cpu);
+    (void) rtems_task_set_affinity(s->server, sizeof(cpu), &cpu);
+  }
 #else
   (void) cpu_index;
Index: testsuites/smptests/smpirqs01/init.c
===================================================================
--- testsuites/smptests/smpirqs01/init.c	(revision 3c093d6752fb8e51216d734b60db1e97ecdb3fe4)
+++ testsuites/smptests/smpirqs01/init.c	(revision 99c73303deb09ad66d4cc1c89961f62e4e618938)
@@ -65,9 +65,8 @@
 }
 
-T_TEST_CASE(InterruptServerSMPInitializeDestroy)
-{
-  rtems_status_code sc;
-  uint32_t server_count;
-  void *greedy;
+T_TEST_CASE(InterruptServerSMPInitializeIncorrectState)
+{
+  rtems_status_code sc;
+  uint32_t server_count;
 
   T_assert_eq_u32(rtems_scheduler_get_processor_maximum(), 2);
@@ -105,4 +104,12 @@
   T_rsc_success(sc);
   ensure_server_termination();
+}
+
+T_TEST_CASE(InterruptServerSMPInitializeInvalidPriority)
+{
+  rtems_status_code sc;
+  uint32_t server_count;
+
+  T_assert_eq_u32(rtems_scheduler_get_processor_maximum(), 2);
 
   server_count = 456;
@@ -135,4 +142,13 @@
   T_rsc_success(sc);
   ensure_server_termination();
+}
+
+T_TEST_CASE(InterruptServerSMPInitializeNoMemory)
+{
+  rtems_status_code sc;
+  uint32_t server_count;
+  void *greedy;
+
+  T_assert_eq_u32(rtems_scheduler_get_processor_maximum(), 2);
 
   greedy = rtems_heap_greedy_allocate(NULL, 0);
@@ -157,4 +173,49 @@
   sc = rtems_interrupt_server_delete(1);
   T_rsc(sc, RTEMS_INVALID_ID);
+}
+
+T_TEST_CASE(InterruptServerSMPInitializeNoScheduler)
+{
+  rtems_status_code sc;
+  uint32_t server_count;
+  rtems_id scheduler_id;
+  rtems_task_priority prio;
+
+  T_assert_eq_u32(rtems_scheduler_get_processor_maximum(), 2);
+
+  scheduler_id = 0;
+  sc = rtems_scheduler_ident_by_processor(1, &scheduler_id);
+  T_rsc_success(sc);
+  T_ne_u32(scheduler_id, 0);
+
+  sc = rtems_scheduler_remove_processor(scheduler_id, 1);
+  T_rsc_success(sc);
+
+  server_count = 456;
+  sc = rtems_interrupt_server_initialize(
+    123,
+    RTEMS_MINIMUM_STACK_SIZE,
+    RTEMS_DEFAULT_MODES,
+    RTEMS_DEFAULT_ATTRIBUTES,
+    &server_count
+  );
+  T_rsc_success(sc);
+  T_eq_u32(server_count, 2);
+
+  sc = rtems_interrupt_server_delete(0);
+  T_rsc_success(sc);
+
+  sc = rtems_interrupt_server_delete(1);
+  T_rsc_success(sc);
+
+  prio = 0;
+  sc = rtems_task_set_priority(RTEMS_SELF, 124, &prio);
+  T_rsc_success(sc);
+
+  sc = rtems_task_set_priority(RTEMS_SELF, prio, &prio);
+  T_rsc_success(sc);
+
+  sc = rtems_scheduler_add_processor(scheduler_id, 1);
+  T_rsc_success(sc);
 }
 
