1f91355883a951cc6aa6d1f20ea65b0cadc94e508Jan Stancekstatic key_t probe_key; 2f91355883a951cc6aa6d1f20ea65b0cadc94e508Jan Stancek 3f91355883a951cc6aa6d1f20ea65b0cadc94e508Jan Stancekvoid *probe_free_addr(void) 4f91355883a951cc6aa6d1f20ea65b0cadc94e508Jan Stancek{ 5f91355883a951cc6aa6d1f20ea65b0cadc94e508Jan Stancek void *p; 6f91355883a951cc6aa6d1f20ea65b0cadc94e508Jan Stancek int ret; 7f91355883a951cc6aa6d1f20ea65b0cadc94e508Jan Stancek int shm_id = -1; 8f91355883a951cc6aa6d1f20ea65b0cadc94e508Jan Stancek 9f91355883a951cc6aa6d1f20ea65b0cadc94e508Jan Stancek if (probe_key == 0) 10f91355883a951cc6aa6d1f20ea65b0cadc94e508Jan Stancek probe_key = getipckey(); 11f91355883a951cc6aa6d1f20ea65b0cadc94e508Jan Stancek 12f91355883a951cc6aa6d1f20ea65b0cadc94e508Jan Stancek /* create a shared memory resource with read and write permissions 13f91355883a951cc6aa6d1f20ea65b0cadc94e508Jan Stancek * We align this to SHMLBA so we should allocate at least 14f91355883a951cc6aa6d1f20ea65b0cadc94e508Jan Stancek * SHMLBA*2 in case SHMLBA > page_size. */ 15f91355883a951cc6aa6d1f20ea65b0cadc94e508Jan Stancek shm_id = shmget(probe_key, SHMLBA*2, SHM_RW | IPC_CREAT | IPC_EXCL); 16f91355883a951cc6aa6d1f20ea65b0cadc94e508Jan Stancek if (shm_id == -1) 17f91355883a951cc6aa6d1f20ea65b0cadc94e508Jan Stancek tst_brkm(TBROK, cleanup, "probe: shmget failed"); 18f91355883a951cc6aa6d1f20ea65b0cadc94e508Jan Stancek 19f91355883a951cc6aa6d1f20ea65b0cadc94e508Jan Stancek /* Probe an available linear address for attachment */ 20f91355883a951cc6aa6d1f20ea65b0cadc94e508Jan Stancek p = shmat(shm_id, NULL, 0); 21f91355883a951cc6aa6d1f20ea65b0cadc94e508Jan Stancek if (p == (void *)-1) 22f91355883a951cc6aa6d1f20ea65b0cadc94e508Jan Stancek tst_brkm(TBROK, cleanup, "probe: shmat failed"); 23f91355883a951cc6aa6d1f20ea65b0cadc94e508Jan Stancek ret = shmdt(p); 24f91355883a951cc6aa6d1f20ea65b0cadc94e508Jan Stancek if (ret == -1) 25f91355883a951cc6aa6d1f20ea65b0cadc94e508Jan Stancek tst_brkm(TBROK, cleanup, "probe: shmdt failed"); 26f91355883a951cc6aa6d1f20ea65b0cadc94e508Jan Stancek 27f91355883a951cc6aa6d1f20ea65b0cadc94e508Jan Stancek rm_shm(shm_id); 28f91355883a951cc6aa6d1f20ea65b0cadc94e508Jan Stancek 29f91355883a951cc6aa6d1f20ea65b0cadc94e508Jan Stancek /* some architectures (e.g. parisc) are strange, so better always 30f91355883a951cc6aa6d1f20ea65b0cadc94e508Jan Stancek * align to next SHMLBA address. */ 31f91355883a951cc6aa6d1f20ea65b0cadc94e508Jan Stancek p = (void *)(((unsigned long)(p) + (SHMLBA - 1)) & ~(SHMLBA - 1)); 32f91355883a951cc6aa6d1f20ea65b0cadc94e508Jan Stancek return p; 33f91355883a951cc6aa6d1f20ea65b0cadc94e508Jan Stancek} 34