uverbs_cmd.c 106 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224222522262227222822292230223122322233223422352236223722382239224022412242224322442245224622472248224922502251225222532254225522562257225822592260226122622263226422652266226722682269227022712272227322742275227622772278227922802281228222832284228522862287228822892290229122922293229422952296229722982299230023012302230323042305230623072308230923102311231223132314231523162317231823192320232123222323232423252326232723282329233023312332233323342335233623372338233923402341234223432344234523462347234823492350235123522353235423552356235723582359236023612362236323642365236623672368236923702371237223732374237523762377237823792380238123822383238423852386238723882389239023912392239323942395239623972398239924002401240224032404240524062407240824092410241124122413241424152416241724182419242024212422242324242425242624272428242924302431243224332434243524362437243824392440244124422443244424452446244724482449245024512452245324542455245624572458245924602461246224632464246524662467246824692470247124722473247424752476247724782479248024812482248324842485248624872488248924902491249224932494249524962497249824992500250125022503250425052506250725082509251025112512251325142515251625172518251925202521252225232524252525262527252825292530253125322533253425352536253725382539254025412542254325442545254625472548254925502551255225532554255525562557255825592560256125622563256425652566256725682569257025712572257325742575257625772578257925802581258225832584258525862587258825892590259125922593259425952596259725982599260026012602260326042605260626072608260926102611261226132614261526162617261826192620262126222623262426252626262726282629263026312632263326342635263626372638263926402641264226432644264526462647264826492650265126522653265426552656265726582659266026612662266326642665266626672668266926702671267226732674267526762677267826792680268126822683268426852686268726882689269026912692269326942695269626972698269927002701270227032704270527062707270827092710271127122713271427152716271727182719272027212722272327242725272627272728272927302731273227332734273527362737273827392740274127422743274427452746274727482749275027512752275327542755275627572758275927602761276227632764276527662767276827692770277127722773277427752776277727782779278027812782278327842785278627872788278927902791279227932794279527962797279827992800280128022803280428052806280728082809281028112812281328142815281628172818281928202821282228232824282528262827282828292830283128322833283428352836283728382839284028412842284328442845284628472848284928502851285228532854285528562857285828592860286128622863286428652866286728682869287028712872287328742875287628772878287928802881288228832884288528862887288828892890289128922893289428952896289728982899290029012902290329042905290629072908290929102911291229132914291529162917291829192920292129222923292429252926292729282929293029312932293329342935293629372938293929402941294229432944294529462947294829492950295129522953295429552956295729582959296029612962296329642965296629672968296929702971297229732974297529762977297829792980298129822983298429852986298729882989299029912992299329942995299629972998299930003001300230033004300530063007300830093010301130123013301430153016301730183019302030213022302330243025302630273028302930303031303230333034303530363037303830393040304130423043304430453046304730483049305030513052305330543055305630573058305930603061306230633064306530663067306830693070307130723073307430753076307730783079308030813082308330843085308630873088308930903091309230933094309530963097309830993100310131023103310431053106310731083109311031113112311331143115311631173118311931203121312231233124312531263127312831293130313131323133313431353136313731383139314031413142314331443145314631473148314931503151315231533154315531563157315831593160316131623163316431653166316731683169317031713172317331743175317631773178317931803181318231833184318531863187318831893190319131923193319431953196319731983199320032013202320332043205320632073208320932103211321232133214321532163217321832193220322132223223322432253226322732283229323032313232323332343235323632373238323932403241324232433244324532463247324832493250325132523253325432553256325732583259326032613262326332643265326632673268326932703271327232733274327532763277327832793280328132823283328432853286328732883289329032913292329332943295329632973298329933003301330233033304330533063307330833093310331133123313331433153316331733183319332033213322332333243325332633273328332933303331333233333334333533363337333833393340334133423343334433453346334733483349335033513352335333543355335633573358335933603361336233633364336533663367336833693370337133723373337433753376337733783379338033813382338333843385338633873388338933903391339233933394339533963397339833993400340134023403340434053406340734083409341034113412341334143415341634173418341934203421342234233424342534263427342834293430343134323433343434353436343734383439344034413442344334443445344634473448344934503451345234533454345534563457345834593460346134623463346434653466346734683469347034713472347334743475347634773478347934803481348234833484348534863487348834893490349134923493349434953496349734983499350035013502350335043505350635073508350935103511351235133514351535163517351835193520352135223523352435253526352735283529353035313532353335343535353635373538353935403541354235433544354535463547354835493550355135523553355435553556355735583559356035613562356335643565356635673568356935703571357235733574357535763577357835793580358135823583358435853586358735883589359035913592359335943595359635973598359936003601360236033604360536063607360836093610361136123613361436153616361736183619362036213622362336243625362636273628362936303631363236333634363536363637363836393640364136423643364436453646364736483649365036513652365336543655365636573658365936603661366236633664366536663667366836693670367136723673367436753676367736783679368036813682368336843685368636873688368936903691369236933694369536963697369836993700370137023703370437053706370737083709371037113712371337143715371637173718371937203721372237233724372537263727372837293730373137323733373437353736373737383739374037413742374337443745374637473748374937503751375237533754375537563757375837593760376137623763376437653766376737683769377037713772377337743775377637773778377937803781378237833784378537863787378837893790379137923793379437953796379737983799380038013802380338043805380638073808380938103811381238133814381538163817381838193820382138223823382438253826382738283829383038313832383338343835383638373838383938403841384238433844384538463847384838493850385138523853385438553856385738583859386038613862386338643865386638673868386938703871387238733874387538763877387838793880388138823883388438853886388738883889389038913892389338943895389638973898389939003901390239033904390539063907390839093910391139123913391439153916391739183919392039213922392339243925392639273928392939303931393239333934393539363937393839393940394139423943394439453946394739483949395039513952395339543955395639573958395939603961396239633964396539663967396839693970397139723973397439753976397739783979398039813982398339843985398639873988398939903991399239933994399539963997399839994000400140024003400440054006400740084009401040114012401340144015401640174018401940204021402240234024402540264027402840294030403140324033403440354036403740384039404040414042404340444045404640474048404940504051405240534054405540564057405840594060406140624063
  1. /*
  2. * Copyright (c) 2005 Topspin Communications. All rights reserved.
  3. * Copyright (c) 2005, 2006, 2007 Cisco Systems. All rights reserved.
  4. * Copyright (c) 2005 PathScale, Inc. All rights reserved.
  5. * Copyright (c) 2006 Mellanox Technologies. All rights reserved.
  6. *
  7. * This software is available to you under a choice of one of two
  8. * licenses. You may choose to be licensed under the terms of the GNU
  9. * General Public License (GPL) Version 2, available from the file
  10. * COPYING in the main directory of this source tree, or the
  11. * OpenIB.org BSD license below:
  12. *
  13. * Redistribution and use in source and binary forms, with or
  14. * without modification, are permitted provided that the following
  15. * conditions are met:
  16. *
  17. * - Redistributions of source code must retain the above
  18. * copyright notice, this list of conditions and the following
  19. * disclaimer.
  20. *
  21. * - Redistributions in binary form must reproduce the above
  22. * copyright notice, this list of conditions and the following
  23. * disclaimer in the documentation and/or other materials
  24. * provided with the distribution.
  25. *
  26. * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
  27. * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
  28. * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
  29. * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
  30. * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
  31. * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
  32. * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
  33. * SOFTWARE.
  34. */
  35. #include <linux/file.h>
  36. #include <linux/fs.h>
  37. #include <linux/slab.h>
  38. #include <linux/sched.h>
  39. #include <linux/uaccess.h>
  40. #include <rdma/uverbs_types.h>
  41. #include <rdma/uverbs_std_types.h>
  42. #include "rdma_core.h"
  43. #include "uverbs.h"
  44. #include "core_priv.h"
  45. /*
  46. * Copy a response to userspace. If the provided 'resp' is larger than the
  47. * user buffer it is silently truncated. If the user provided a larger buffer
  48. * then the trailing portion is zero filled.
  49. *
  50. * These semantics are intended to support future extension of the output
  51. * structures.
  52. */
  53. static int uverbs_response(struct uverbs_attr_bundle *attrs, const void *resp,
  54. size_t resp_len)
  55. {
  56. int ret;
  57. if (uverbs_attr_is_valid(attrs, UVERBS_ATTR_CORE_OUT))
  58. return uverbs_copy_to_struct_or_zero(
  59. attrs, UVERBS_ATTR_CORE_OUT, resp, resp_len);
  60. if (copy_to_user(attrs->ucore.outbuf, resp,
  61. min(attrs->ucore.outlen, resp_len)))
  62. return -EFAULT;
  63. if (resp_len < attrs->ucore.outlen) {
  64. /*
  65. * Zero fill any extra memory that user
  66. * space might have provided.
  67. */
  68. ret = clear_user(attrs->ucore.outbuf + resp_len,
  69. attrs->ucore.outlen - resp_len);
  70. if (ret)
  71. return -EFAULT;
  72. }
  73. return 0;
  74. }
  75. /*
  76. * Copy a request from userspace. If the provided 'req' is larger than the
  77. * user buffer then the user buffer is zero extended into the 'req'. If 'req'
  78. * is smaller than the user buffer then the uncopied bytes in the user buffer
  79. * must be zero.
  80. */
  81. static int uverbs_request(struct uverbs_attr_bundle *attrs, void *req,
  82. size_t req_len)
  83. {
  84. if (copy_from_user(req, attrs->ucore.inbuf,
  85. min(attrs->ucore.inlen, req_len)))
  86. return -EFAULT;
  87. if (attrs->ucore.inlen < req_len) {
  88. memset(req + attrs->ucore.inlen, 0,
  89. req_len - attrs->ucore.inlen);
  90. } else if (attrs->ucore.inlen > req_len) {
  91. if (!ib_is_buffer_cleared(attrs->ucore.inbuf + req_len,
  92. attrs->ucore.inlen - req_len))
  93. return -EOPNOTSUPP;
  94. }
  95. return 0;
  96. }
  97. /*
  98. * Generate the value for the 'response_length' protocol used by write_ex.
  99. * This is the number of bytes the kernel actually wrote. Userspace can use
  100. * this to detect what structure members in the response the kernel
  101. * understood.
  102. */
  103. static u32 uverbs_response_length(struct uverbs_attr_bundle *attrs,
  104. size_t resp_len)
  105. {
  106. return min_t(size_t, attrs->ucore.outlen, resp_len);
  107. }
  108. /*
  109. * The iterator version of the request interface is for handlers that need to
  110. * step over a flex array at the end of a command header.
  111. */
  112. struct uverbs_req_iter {
  113. const void __user *cur;
  114. const void __user *end;
  115. };
  116. static int uverbs_request_start(struct uverbs_attr_bundle *attrs,
  117. struct uverbs_req_iter *iter,
  118. void *req,
  119. size_t req_len)
  120. {
  121. if (attrs->ucore.inlen < req_len)
  122. return -ENOSPC;
  123. if (copy_from_user(req, attrs->ucore.inbuf, req_len))
  124. return -EFAULT;
  125. iter->cur = attrs->ucore.inbuf + req_len;
  126. iter->end = attrs->ucore.inbuf + attrs->ucore.inlen;
  127. return 0;
  128. }
  129. static int uverbs_request_next(struct uverbs_req_iter *iter, void *val,
  130. size_t len)
  131. {
  132. if (iter->cur + len > iter->end)
  133. return -ENOSPC;
  134. if (copy_from_user(val, iter->cur, len))
  135. return -EFAULT;
  136. iter->cur += len;
  137. return 0;
  138. }
  139. static const void __user *uverbs_request_next_ptr(struct uverbs_req_iter *iter,
  140. size_t len)
  141. {
  142. const void __user *res = iter->cur;
  143. if (len > iter->end - iter->cur)
  144. return (void __force __user *)ERR_PTR(-ENOSPC);
  145. iter->cur += len;
  146. return res;
  147. }
  148. static int uverbs_request_finish(struct uverbs_req_iter *iter)
  149. {
  150. if (!ib_is_buffer_cleared(iter->cur, iter->end - iter->cur))
  151. return -EOPNOTSUPP;
  152. return 0;
  153. }
  154. /*
  155. * When calling a destroy function during an error unwind we need to pass in
  156. * the udata that is sanitized of all user arguments. Ie from the driver
  157. * perspective it looks like no udata was passed.
  158. */
  159. struct ib_udata *uverbs_get_cleared_udata(struct uverbs_attr_bundle *attrs)
  160. {
  161. attrs->driver_udata = (struct ib_udata){};
  162. return &attrs->driver_udata;
  163. }
  164. static struct ib_uverbs_completion_event_file *
  165. _ib_uverbs_lookup_comp_file(s32 fd, struct uverbs_attr_bundle *attrs)
  166. {
  167. struct ib_uobject *uobj = ufd_get_read(UVERBS_OBJECT_COMP_CHANNEL,
  168. fd, attrs);
  169. if (IS_ERR(uobj))
  170. return (void *)uobj;
  171. uverbs_uobject_get(uobj);
  172. uobj_put_read(uobj);
  173. return container_of(uobj, struct ib_uverbs_completion_event_file,
  174. uobj);
  175. }
  176. #define ib_uverbs_lookup_comp_file(_fd, _ufile) \
  177. _ib_uverbs_lookup_comp_file((_fd)*typecheck(s32, _fd), _ufile)
  178. int ib_alloc_ucontext(struct uverbs_attr_bundle *attrs)
  179. {
  180. struct ib_uverbs_file *ufile = attrs->ufile;
  181. struct ib_ucontext *ucontext;
  182. struct ib_device *ib_dev;
  183. ib_dev = srcu_dereference(ufile->device->ib_dev,
  184. &ufile->device->disassociate_srcu);
  185. if (!ib_dev)
  186. return -EIO;
  187. ucontext = rdma_zalloc_drv_obj(ib_dev, ib_ucontext);
  188. if (!ucontext)
  189. return -ENOMEM;
  190. ucontext->device = ib_dev;
  191. ucontext->ufile = ufile;
  192. xa_init_flags(&ucontext->mmap_xa, XA_FLAGS_ALLOC);
  193. rdma_restrack_new(&ucontext->res, RDMA_RESTRACK_CTX);
  194. rdma_restrack_set_name(&ucontext->res, NULL);
  195. attrs->context = ucontext;
  196. return 0;
  197. }
  198. int ib_init_ucontext(struct uverbs_attr_bundle *attrs)
  199. {
  200. struct ib_ucontext *ucontext = attrs->context;
  201. struct ib_uverbs_file *file = attrs->ufile;
  202. int ret;
  203. if (!down_read_trylock(&file->hw_destroy_rwsem))
  204. return -EIO;
  205. mutex_lock(&file->ucontext_lock);
  206. if (file->ucontext) {
  207. ret = -EINVAL;
  208. goto err;
  209. }
  210. ret = ib_rdmacg_try_charge(&ucontext->cg_obj, ucontext->device,
  211. RDMACG_RESOURCE_HCA_HANDLE);
  212. if (ret)
  213. goto err;
  214. ret = ucontext->device->ops.alloc_ucontext(ucontext,
  215. &attrs->driver_udata);
  216. if (ret)
  217. goto err_uncharge;
  218. rdma_restrack_add(&ucontext->res);
  219. /*
  220. * Make sure that ib_uverbs_get_ucontext() sees the pointer update
  221. * only after all writes to setup the ucontext have completed
  222. */
  223. smp_store_release(&file->ucontext, ucontext);
  224. mutex_unlock(&file->ucontext_lock);
  225. up_read(&file->hw_destroy_rwsem);
  226. return 0;
  227. err_uncharge:
  228. ib_rdmacg_uncharge(&ucontext->cg_obj, ucontext->device,
  229. RDMACG_RESOURCE_HCA_HANDLE);
  230. err:
  231. mutex_unlock(&file->ucontext_lock);
  232. up_read(&file->hw_destroy_rwsem);
  233. return ret;
  234. }
  235. static int ib_uverbs_get_context(struct uverbs_attr_bundle *attrs)
  236. {
  237. struct ib_uverbs_get_context_resp resp;
  238. struct ib_uverbs_get_context cmd;
  239. struct ib_device *ib_dev;
  240. struct ib_uobject *uobj;
  241. int ret;
  242. ret = uverbs_request(attrs, &cmd, sizeof(cmd));
  243. if (ret)
  244. return ret;
  245. ret = ib_alloc_ucontext(attrs);
  246. if (ret)
  247. return ret;
  248. uobj = uobj_alloc(UVERBS_OBJECT_ASYNC_EVENT, attrs, &ib_dev);
  249. if (IS_ERR(uobj)) {
  250. ret = PTR_ERR(uobj);
  251. goto err_ucontext;
  252. }
  253. resp = (struct ib_uverbs_get_context_resp){
  254. .num_comp_vectors = attrs->ufile->device->num_comp_vectors,
  255. .async_fd = uobj->id,
  256. };
  257. ret = uverbs_response(attrs, &resp, sizeof(resp));
  258. if (ret)
  259. goto err_uobj;
  260. ret = ib_init_ucontext(attrs);
  261. if (ret)
  262. goto err_uobj;
  263. ib_uverbs_init_async_event_file(
  264. container_of(uobj, struct ib_uverbs_async_event_file, uobj));
  265. rdma_alloc_commit_uobject(uobj, attrs);
  266. return 0;
  267. err_uobj:
  268. rdma_alloc_abort_uobject(uobj, attrs, false);
  269. err_ucontext:
  270. rdma_restrack_put(&attrs->context->res);
  271. kfree(attrs->context);
  272. attrs->context = NULL;
  273. return ret;
  274. }
  275. static void copy_query_dev_fields(struct ib_ucontext *ucontext,
  276. struct ib_uverbs_query_device_resp *resp,
  277. struct ib_device_attr *attr)
  278. {
  279. struct ib_device *ib_dev = ucontext->device;
  280. resp->fw_ver = attr->fw_ver;
  281. resp->node_guid = ib_dev->node_guid;
  282. resp->sys_image_guid = attr->sys_image_guid;
  283. resp->max_mr_size = attr->max_mr_size;
  284. resp->page_size_cap = attr->page_size_cap;
  285. resp->vendor_id = attr->vendor_id;
  286. resp->vendor_part_id = attr->vendor_part_id;
  287. resp->hw_ver = attr->hw_ver;
  288. resp->max_qp = attr->max_qp;
  289. resp->max_qp_wr = attr->max_qp_wr;
  290. resp->device_cap_flags = lower_32_bits(attr->device_cap_flags);
  291. resp->max_sge = min(attr->max_send_sge, attr->max_recv_sge);
  292. resp->max_sge_rd = attr->max_sge_rd;
  293. resp->max_cq = attr->max_cq;
  294. resp->max_cqe = attr->max_cqe;
  295. resp->max_mr = attr->max_mr;
  296. resp->max_pd = attr->max_pd;
  297. resp->max_qp_rd_atom = attr->max_qp_rd_atom;
  298. resp->max_ee_rd_atom = attr->max_ee_rd_atom;
  299. resp->max_res_rd_atom = attr->max_res_rd_atom;
  300. resp->max_qp_init_rd_atom = attr->max_qp_init_rd_atom;
  301. resp->max_ee_init_rd_atom = attr->max_ee_init_rd_atom;
  302. resp->atomic_cap = attr->atomic_cap;
  303. resp->max_ee = attr->max_ee;
  304. resp->max_rdd = attr->max_rdd;
  305. resp->max_mw = attr->max_mw;
  306. resp->max_raw_ipv6_qp = attr->max_raw_ipv6_qp;
  307. resp->max_raw_ethy_qp = attr->max_raw_ethy_qp;
  308. resp->max_mcast_grp = attr->max_mcast_grp;
  309. resp->max_mcast_qp_attach = attr->max_mcast_qp_attach;
  310. resp->max_total_mcast_qp_attach = attr->max_total_mcast_qp_attach;
  311. resp->max_ah = attr->max_ah;
  312. resp->max_srq = attr->max_srq;
  313. resp->max_srq_wr = attr->max_srq_wr;
  314. resp->max_srq_sge = attr->max_srq_sge;
  315. resp->max_pkeys = attr->max_pkeys;
  316. resp->local_ca_ack_delay = attr->local_ca_ack_delay;
  317. resp->phys_port_cnt = min_t(u32, ib_dev->phys_port_cnt, U8_MAX);
  318. }
  319. static int ib_uverbs_query_device(struct uverbs_attr_bundle *attrs)
  320. {
  321. struct ib_uverbs_query_device cmd;
  322. struct ib_uverbs_query_device_resp resp;
  323. struct ib_ucontext *ucontext;
  324. int ret;
  325. ucontext = ib_uverbs_get_ucontext(attrs);
  326. if (IS_ERR(ucontext))
  327. return PTR_ERR(ucontext);
  328. ret = uverbs_request(attrs, &cmd, sizeof(cmd));
  329. if (ret)
  330. return ret;
  331. memset(&resp, 0, sizeof resp);
  332. copy_query_dev_fields(ucontext, &resp, &ucontext->device->attrs);
  333. return uverbs_response(attrs, &resp, sizeof(resp));
  334. }
  335. static int ib_uverbs_query_port(struct uverbs_attr_bundle *attrs)
  336. {
  337. struct ib_uverbs_query_port cmd;
  338. struct ib_uverbs_query_port_resp resp;
  339. struct ib_port_attr attr;
  340. int ret;
  341. struct ib_ucontext *ucontext;
  342. struct ib_device *ib_dev;
  343. ucontext = ib_uverbs_get_ucontext(attrs);
  344. if (IS_ERR(ucontext))
  345. return PTR_ERR(ucontext);
  346. ib_dev = ucontext->device;
  347. ret = uverbs_request(attrs, &cmd, sizeof(cmd));
  348. if (ret)
  349. return ret;
  350. ret = ib_query_port(ib_dev, cmd.port_num, &attr);
  351. if (ret)
  352. return ret;
  353. memset(&resp, 0, sizeof resp);
  354. copy_port_attr_to_resp(&attr, &resp, ib_dev, cmd.port_num);
  355. return uverbs_response(attrs, &resp, sizeof(resp));
  356. }
  357. static int ib_uverbs_alloc_pd(struct uverbs_attr_bundle *attrs)
  358. {
  359. struct ib_uverbs_alloc_pd_resp resp = {};
  360. struct ib_uverbs_alloc_pd cmd;
  361. struct ib_uobject *uobj;
  362. struct ib_pd *pd;
  363. int ret;
  364. struct ib_device *ib_dev;
  365. ret = uverbs_request(attrs, &cmd, sizeof(cmd));
  366. if (ret)
  367. return ret;
  368. uobj = uobj_alloc(UVERBS_OBJECT_PD, attrs, &ib_dev);
  369. if (IS_ERR(uobj))
  370. return PTR_ERR(uobj);
  371. pd = rdma_zalloc_drv_obj(ib_dev, ib_pd);
  372. if (!pd) {
  373. ret = -ENOMEM;
  374. goto err;
  375. }
  376. pd->device = ib_dev;
  377. pd->uobject = uobj;
  378. atomic_set(&pd->usecnt, 0);
  379. rdma_restrack_new(&pd->res, RDMA_RESTRACK_PD);
  380. rdma_restrack_set_name(&pd->res, NULL);
  381. ret = ib_dev->ops.alloc_pd(pd, &attrs->driver_udata);
  382. if (ret)
  383. goto err_alloc;
  384. rdma_restrack_add(&pd->res);
  385. uobj->object = pd;
  386. uobj_finalize_uobj_create(uobj, attrs);
  387. resp.pd_handle = uobj->id;
  388. return uverbs_response(attrs, &resp, sizeof(resp));
  389. err_alloc:
  390. rdma_restrack_put(&pd->res);
  391. kfree(pd);
  392. err:
  393. uobj_alloc_abort(uobj, attrs);
  394. return ret;
  395. }
  396. static int ib_uverbs_dealloc_pd(struct uverbs_attr_bundle *attrs)
  397. {
  398. struct ib_uverbs_dealloc_pd cmd;
  399. int ret;
  400. ret = uverbs_request(attrs, &cmd, sizeof(cmd));
  401. if (ret)
  402. return ret;
  403. return uobj_perform_destroy(UVERBS_OBJECT_PD, cmd.pd_handle, attrs);
  404. }
  405. struct xrcd_table_entry {
  406. struct rb_node node;
  407. struct ib_xrcd *xrcd;
  408. struct inode *inode;
  409. };
  410. static int xrcd_table_insert(struct ib_uverbs_device *dev,
  411. struct inode *inode,
  412. struct ib_xrcd *xrcd)
  413. {
  414. struct xrcd_table_entry *entry, *scan;
  415. struct rb_node **p = &dev->xrcd_tree.rb_node;
  416. struct rb_node *parent = NULL;
  417. entry = kmalloc(sizeof *entry, GFP_KERNEL);
  418. if (!entry)
  419. return -ENOMEM;
  420. entry->xrcd = xrcd;
  421. entry->inode = inode;
  422. while (*p) {
  423. parent = *p;
  424. scan = rb_entry(parent, struct xrcd_table_entry, node);
  425. if (inode < scan->inode) {
  426. p = &(*p)->rb_left;
  427. } else if (inode > scan->inode) {
  428. p = &(*p)->rb_right;
  429. } else {
  430. kfree(entry);
  431. return -EEXIST;
  432. }
  433. }
  434. rb_link_node(&entry->node, parent, p);
  435. rb_insert_color(&entry->node, &dev->xrcd_tree);
  436. igrab(inode);
  437. return 0;
  438. }
  439. static struct xrcd_table_entry *xrcd_table_search(struct ib_uverbs_device *dev,
  440. struct inode *inode)
  441. {
  442. struct xrcd_table_entry *entry;
  443. struct rb_node *p = dev->xrcd_tree.rb_node;
  444. while (p) {
  445. entry = rb_entry(p, struct xrcd_table_entry, node);
  446. if (inode < entry->inode)
  447. p = p->rb_left;
  448. else if (inode > entry->inode)
  449. p = p->rb_right;
  450. else
  451. return entry;
  452. }
  453. return NULL;
  454. }
  455. static struct ib_xrcd *find_xrcd(struct ib_uverbs_device *dev, struct inode *inode)
  456. {
  457. struct xrcd_table_entry *entry;
  458. entry = xrcd_table_search(dev, inode);
  459. if (!entry)
  460. return NULL;
  461. return entry->xrcd;
  462. }
  463. static void xrcd_table_delete(struct ib_uverbs_device *dev,
  464. struct inode *inode)
  465. {
  466. struct xrcd_table_entry *entry;
  467. entry = xrcd_table_search(dev, inode);
  468. if (entry) {
  469. iput(inode);
  470. rb_erase(&entry->node, &dev->xrcd_tree);
  471. kfree(entry);
  472. }
  473. }
  474. static int ib_uverbs_open_xrcd(struct uverbs_attr_bundle *attrs)
  475. {
  476. struct ib_uverbs_device *ibudev = attrs->ufile->device;
  477. struct ib_uverbs_open_xrcd_resp resp = {};
  478. struct ib_uverbs_open_xrcd cmd;
  479. struct ib_uxrcd_object *obj;
  480. struct ib_xrcd *xrcd = NULL;
  481. struct inode *inode = NULL;
  482. int new_xrcd = 0;
  483. struct ib_device *ib_dev;
  484. struct fd f = EMPTY_FD;
  485. int ret;
  486. ret = uverbs_request(attrs, &cmd, sizeof(cmd));
  487. if (ret)
  488. return ret;
  489. mutex_lock(&ibudev->xrcd_tree_mutex);
  490. if (cmd.fd != -1) {
  491. /* search for file descriptor */
  492. f = fdget(cmd.fd);
  493. if (!fd_file(f)) {
  494. ret = -EBADF;
  495. goto err_tree_mutex_unlock;
  496. }
  497. inode = file_inode(fd_file(f));
  498. xrcd = find_xrcd(ibudev, inode);
  499. if (!xrcd && !(cmd.oflags & O_CREAT)) {
  500. /* no file descriptor. Need CREATE flag */
  501. ret = -EAGAIN;
  502. goto err_tree_mutex_unlock;
  503. }
  504. if (xrcd && cmd.oflags & O_EXCL) {
  505. ret = -EINVAL;
  506. goto err_tree_mutex_unlock;
  507. }
  508. }
  509. obj = (struct ib_uxrcd_object *)uobj_alloc(UVERBS_OBJECT_XRCD, attrs,
  510. &ib_dev);
  511. if (IS_ERR(obj)) {
  512. ret = PTR_ERR(obj);
  513. goto err_tree_mutex_unlock;
  514. }
  515. if (!xrcd) {
  516. xrcd = ib_alloc_xrcd_user(ib_dev, inode, &attrs->driver_udata);
  517. if (IS_ERR(xrcd)) {
  518. ret = PTR_ERR(xrcd);
  519. goto err;
  520. }
  521. new_xrcd = 1;
  522. }
  523. atomic_set(&obj->refcnt, 0);
  524. obj->uobject.object = xrcd;
  525. if (inode) {
  526. if (new_xrcd) {
  527. /* create new inode/xrcd table entry */
  528. ret = xrcd_table_insert(ibudev, inode, xrcd);
  529. if (ret)
  530. goto err_dealloc_xrcd;
  531. }
  532. atomic_inc(&xrcd->usecnt);
  533. }
  534. if (fd_file(f))
  535. fdput(f);
  536. mutex_unlock(&ibudev->xrcd_tree_mutex);
  537. uobj_finalize_uobj_create(&obj->uobject, attrs);
  538. resp.xrcd_handle = obj->uobject.id;
  539. return uverbs_response(attrs, &resp, sizeof(resp));
  540. err_dealloc_xrcd:
  541. ib_dealloc_xrcd_user(xrcd, uverbs_get_cleared_udata(attrs));
  542. err:
  543. uobj_alloc_abort(&obj->uobject, attrs);
  544. err_tree_mutex_unlock:
  545. if (fd_file(f))
  546. fdput(f);
  547. mutex_unlock(&ibudev->xrcd_tree_mutex);
  548. return ret;
  549. }
  550. static int ib_uverbs_close_xrcd(struct uverbs_attr_bundle *attrs)
  551. {
  552. struct ib_uverbs_close_xrcd cmd;
  553. int ret;
  554. ret = uverbs_request(attrs, &cmd, sizeof(cmd));
  555. if (ret)
  556. return ret;
  557. return uobj_perform_destroy(UVERBS_OBJECT_XRCD, cmd.xrcd_handle, attrs);
  558. }
  559. int ib_uverbs_dealloc_xrcd(struct ib_uobject *uobject, struct ib_xrcd *xrcd,
  560. enum rdma_remove_reason why,
  561. struct uverbs_attr_bundle *attrs)
  562. {
  563. struct inode *inode;
  564. int ret;
  565. struct ib_uverbs_device *dev = attrs->ufile->device;
  566. inode = xrcd->inode;
  567. if (inode && !atomic_dec_and_test(&xrcd->usecnt))
  568. return 0;
  569. ret = ib_dealloc_xrcd_user(xrcd, &attrs->driver_udata);
  570. if (ret) {
  571. atomic_inc(&xrcd->usecnt);
  572. return ret;
  573. }
  574. if (inode)
  575. xrcd_table_delete(dev, inode);
  576. return 0;
  577. }
  578. static int ib_uverbs_reg_mr(struct uverbs_attr_bundle *attrs)
  579. {
  580. struct ib_uverbs_reg_mr_resp resp = {};
  581. struct ib_uverbs_reg_mr cmd;
  582. struct ib_uobject *uobj;
  583. struct ib_pd *pd;
  584. struct ib_mr *mr;
  585. int ret;
  586. struct ib_device *ib_dev;
  587. ret = uverbs_request(attrs, &cmd, sizeof(cmd));
  588. if (ret)
  589. return ret;
  590. if ((cmd.start & ~PAGE_MASK) != (cmd.hca_va & ~PAGE_MASK))
  591. return -EINVAL;
  592. uobj = uobj_alloc(UVERBS_OBJECT_MR, attrs, &ib_dev);
  593. if (IS_ERR(uobj))
  594. return PTR_ERR(uobj);
  595. ret = ib_check_mr_access(ib_dev, cmd.access_flags);
  596. if (ret)
  597. goto err_free;
  598. pd = uobj_get_obj_read(pd, UVERBS_OBJECT_PD, cmd.pd_handle, attrs);
  599. if (IS_ERR(pd)) {
  600. ret = PTR_ERR(pd);
  601. goto err_free;
  602. }
  603. mr = pd->device->ops.reg_user_mr(pd, cmd.start, cmd.length, cmd.hca_va,
  604. cmd.access_flags,
  605. &attrs->driver_udata);
  606. if (IS_ERR(mr)) {
  607. ret = PTR_ERR(mr);
  608. goto err_put;
  609. }
  610. mr->device = pd->device;
  611. mr->pd = pd;
  612. mr->type = IB_MR_TYPE_USER;
  613. mr->dm = NULL;
  614. mr->sig_attrs = NULL;
  615. mr->uobject = uobj;
  616. atomic_inc(&pd->usecnt);
  617. mr->iova = cmd.hca_va;
  618. mr->length = cmd.length;
  619. rdma_restrack_new(&mr->res, RDMA_RESTRACK_MR);
  620. rdma_restrack_set_name(&mr->res, NULL);
  621. rdma_restrack_add(&mr->res);
  622. uobj->object = mr;
  623. uobj_put_obj_read(pd);
  624. uobj_finalize_uobj_create(uobj, attrs);
  625. resp.lkey = mr->lkey;
  626. resp.rkey = mr->rkey;
  627. resp.mr_handle = uobj->id;
  628. return uverbs_response(attrs, &resp, sizeof(resp));
  629. err_put:
  630. uobj_put_obj_read(pd);
  631. err_free:
  632. uobj_alloc_abort(uobj, attrs);
  633. return ret;
  634. }
  635. static int ib_uverbs_rereg_mr(struct uverbs_attr_bundle *attrs)
  636. {
  637. struct ib_uverbs_rereg_mr cmd;
  638. struct ib_uverbs_rereg_mr_resp resp;
  639. struct ib_mr *mr;
  640. int ret;
  641. struct ib_uobject *uobj;
  642. struct ib_uobject *new_uobj;
  643. struct ib_device *ib_dev;
  644. struct ib_pd *orig_pd;
  645. struct ib_pd *new_pd;
  646. struct ib_mr *new_mr;
  647. ret = uverbs_request(attrs, &cmd, sizeof(cmd));
  648. if (ret)
  649. return ret;
  650. if (!cmd.flags)
  651. return -EINVAL;
  652. if (cmd.flags & ~IB_MR_REREG_SUPPORTED)
  653. return -EOPNOTSUPP;
  654. if ((cmd.flags & IB_MR_REREG_TRANS) &&
  655. (cmd.start & ~PAGE_MASK) != (cmd.hca_va & ~PAGE_MASK))
  656. return -EINVAL;
  657. uobj = uobj_get_write(UVERBS_OBJECT_MR, cmd.mr_handle, attrs);
  658. if (IS_ERR(uobj))
  659. return PTR_ERR(uobj);
  660. mr = uobj->object;
  661. if (mr->dm) {
  662. ret = -EINVAL;
  663. goto put_uobjs;
  664. }
  665. if (cmd.flags & IB_MR_REREG_ACCESS) {
  666. ret = ib_check_mr_access(mr->device, cmd.access_flags);
  667. if (ret)
  668. goto put_uobjs;
  669. }
  670. orig_pd = mr->pd;
  671. if (cmd.flags & IB_MR_REREG_PD) {
  672. new_pd = uobj_get_obj_read(pd, UVERBS_OBJECT_PD, cmd.pd_handle,
  673. attrs);
  674. if (IS_ERR(new_pd)) {
  675. ret = PTR_ERR(new_pd);
  676. goto put_uobjs;
  677. }
  678. } else {
  679. new_pd = mr->pd;
  680. }
  681. /*
  682. * The driver might create a new HW object as part of the rereg, we need
  683. * to have a uobject ready to hold it.
  684. */
  685. new_uobj = uobj_alloc(UVERBS_OBJECT_MR, attrs, &ib_dev);
  686. if (IS_ERR(new_uobj)) {
  687. ret = PTR_ERR(new_uobj);
  688. goto put_uobj_pd;
  689. }
  690. new_mr = ib_dev->ops.rereg_user_mr(mr, cmd.flags, cmd.start, cmd.length,
  691. cmd.hca_va, cmd.access_flags, new_pd,
  692. &attrs->driver_udata);
  693. if (IS_ERR(new_mr)) {
  694. ret = PTR_ERR(new_mr);
  695. goto put_new_uobj;
  696. }
  697. if (new_mr) {
  698. new_mr->device = new_pd->device;
  699. new_mr->pd = new_pd;
  700. new_mr->type = IB_MR_TYPE_USER;
  701. new_mr->uobject = uobj;
  702. atomic_inc(&new_pd->usecnt);
  703. new_uobj->object = new_mr;
  704. rdma_restrack_new(&new_mr->res, RDMA_RESTRACK_MR);
  705. rdma_restrack_set_name(&new_mr->res, NULL);
  706. rdma_restrack_add(&new_mr->res);
  707. /*
  708. * The new uobj for the new HW object is put into the same spot
  709. * in the IDR and the old uobj & HW object is deleted.
  710. */
  711. rdma_assign_uobject(uobj, new_uobj, attrs);
  712. rdma_alloc_commit_uobject(new_uobj, attrs);
  713. uobj_put_destroy(uobj);
  714. new_uobj = NULL;
  715. uobj = NULL;
  716. mr = new_mr;
  717. } else {
  718. if (cmd.flags & IB_MR_REREG_PD) {
  719. atomic_dec(&orig_pd->usecnt);
  720. mr->pd = new_pd;
  721. atomic_inc(&new_pd->usecnt);
  722. }
  723. if (cmd.flags & IB_MR_REREG_TRANS) {
  724. mr->iova = cmd.hca_va;
  725. mr->length = cmd.length;
  726. }
  727. }
  728. memset(&resp, 0, sizeof(resp));
  729. resp.lkey = mr->lkey;
  730. resp.rkey = mr->rkey;
  731. ret = uverbs_response(attrs, &resp, sizeof(resp));
  732. put_new_uobj:
  733. if (new_uobj)
  734. uobj_alloc_abort(new_uobj, attrs);
  735. put_uobj_pd:
  736. if (cmd.flags & IB_MR_REREG_PD)
  737. uobj_put_obj_read(new_pd);
  738. put_uobjs:
  739. if (uobj)
  740. uobj_put_write(uobj);
  741. return ret;
  742. }
  743. static int ib_uverbs_dereg_mr(struct uverbs_attr_bundle *attrs)
  744. {
  745. struct ib_uverbs_dereg_mr cmd;
  746. int ret;
  747. ret = uverbs_request(attrs, &cmd, sizeof(cmd));
  748. if (ret)
  749. return ret;
  750. return uobj_perform_destroy(UVERBS_OBJECT_MR, cmd.mr_handle, attrs);
  751. }
  752. static int ib_uverbs_alloc_mw(struct uverbs_attr_bundle *attrs)
  753. {
  754. struct ib_uverbs_alloc_mw cmd;
  755. struct ib_uverbs_alloc_mw_resp resp = {};
  756. struct ib_uobject *uobj;
  757. struct ib_pd *pd;
  758. struct ib_mw *mw;
  759. int ret;
  760. struct ib_device *ib_dev;
  761. ret = uverbs_request(attrs, &cmd, sizeof(cmd));
  762. if (ret)
  763. return ret;
  764. uobj = uobj_alloc(UVERBS_OBJECT_MW, attrs, &ib_dev);
  765. if (IS_ERR(uobj))
  766. return PTR_ERR(uobj);
  767. pd = uobj_get_obj_read(pd, UVERBS_OBJECT_PD, cmd.pd_handle, attrs);
  768. if (IS_ERR(pd)) {
  769. ret = PTR_ERR(pd);
  770. goto err_free;
  771. }
  772. if (cmd.mw_type != IB_MW_TYPE_1 && cmd.mw_type != IB_MW_TYPE_2) {
  773. ret = -EINVAL;
  774. goto err_put;
  775. }
  776. mw = rdma_zalloc_drv_obj(ib_dev, ib_mw);
  777. if (!mw) {
  778. ret = -ENOMEM;
  779. goto err_put;
  780. }
  781. mw->device = ib_dev;
  782. mw->pd = pd;
  783. mw->uobject = uobj;
  784. mw->type = cmd.mw_type;
  785. ret = pd->device->ops.alloc_mw(mw, &attrs->driver_udata);
  786. if (ret)
  787. goto err_alloc;
  788. atomic_inc(&pd->usecnt);
  789. uobj->object = mw;
  790. uobj_put_obj_read(pd);
  791. uobj_finalize_uobj_create(uobj, attrs);
  792. resp.rkey = mw->rkey;
  793. resp.mw_handle = uobj->id;
  794. return uverbs_response(attrs, &resp, sizeof(resp));
  795. err_alloc:
  796. kfree(mw);
  797. err_put:
  798. uobj_put_obj_read(pd);
  799. err_free:
  800. uobj_alloc_abort(uobj, attrs);
  801. return ret;
  802. }
  803. static int ib_uverbs_dealloc_mw(struct uverbs_attr_bundle *attrs)
  804. {
  805. struct ib_uverbs_dealloc_mw cmd;
  806. int ret;
  807. ret = uverbs_request(attrs, &cmd, sizeof(cmd));
  808. if (ret)
  809. return ret;
  810. return uobj_perform_destroy(UVERBS_OBJECT_MW, cmd.mw_handle, attrs);
  811. }
  812. static int ib_uverbs_create_comp_channel(struct uverbs_attr_bundle *attrs)
  813. {
  814. struct ib_uverbs_create_comp_channel cmd;
  815. struct ib_uverbs_create_comp_channel_resp resp;
  816. struct ib_uobject *uobj;
  817. struct ib_uverbs_completion_event_file *ev_file;
  818. struct ib_device *ib_dev;
  819. int ret;
  820. ret = uverbs_request(attrs, &cmd, sizeof(cmd));
  821. if (ret)
  822. return ret;
  823. uobj = uobj_alloc(UVERBS_OBJECT_COMP_CHANNEL, attrs, &ib_dev);
  824. if (IS_ERR(uobj))
  825. return PTR_ERR(uobj);
  826. ev_file = container_of(uobj, struct ib_uverbs_completion_event_file,
  827. uobj);
  828. ib_uverbs_init_event_queue(&ev_file->ev_queue);
  829. uobj_finalize_uobj_create(uobj, attrs);
  830. resp.fd = uobj->id;
  831. return uverbs_response(attrs, &resp, sizeof(resp));
  832. }
  833. static int create_cq(struct uverbs_attr_bundle *attrs,
  834. struct ib_uverbs_ex_create_cq *cmd)
  835. {
  836. struct ib_ucq_object *obj;
  837. struct ib_uverbs_completion_event_file *ev_file = NULL;
  838. struct ib_cq *cq;
  839. int ret;
  840. struct ib_uverbs_ex_create_cq_resp resp = {};
  841. struct ib_cq_init_attr attr = {};
  842. struct ib_device *ib_dev;
  843. if (cmd->comp_vector >= attrs->ufile->device->num_comp_vectors)
  844. return -EINVAL;
  845. obj = (struct ib_ucq_object *)uobj_alloc(UVERBS_OBJECT_CQ, attrs,
  846. &ib_dev);
  847. if (IS_ERR(obj))
  848. return PTR_ERR(obj);
  849. if (cmd->comp_channel >= 0) {
  850. ev_file = ib_uverbs_lookup_comp_file(cmd->comp_channel, attrs);
  851. if (IS_ERR(ev_file)) {
  852. ret = PTR_ERR(ev_file);
  853. goto err;
  854. }
  855. }
  856. obj->uevent.uobject.user_handle = cmd->user_handle;
  857. INIT_LIST_HEAD(&obj->comp_list);
  858. INIT_LIST_HEAD(&obj->uevent.event_list);
  859. attr.cqe = cmd->cqe;
  860. attr.comp_vector = cmd->comp_vector;
  861. attr.flags = cmd->flags;
  862. cq = rdma_zalloc_drv_obj(ib_dev, ib_cq);
  863. if (!cq) {
  864. ret = -ENOMEM;
  865. goto err_file;
  866. }
  867. cq->device = ib_dev;
  868. cq->uobject = obj;
  869. cq->comp_handler = ib_uverbs_comp_handler;
  870. cq->event_handler = ib_uverbs_cq_event_handler;
  871. cq->cq_context = ev_file ? &ev_file->ev_queue : NULL;
  872. atomic_set(&cq->usecnt, 0);
  873. rdma_restrack_new(&cq->res, RDMA_RESTRACK_CQ);
  874. rdma_restrack_set_name(&cq->res, NULL);
  875. ret = ib_dev->ops.create_cq(cq, &attr, attrs);
  876. if (ret)
  877. goto err_free;
  878. rdma_restrack_add(&cq->res);
  879. obj->uevent.uobject.object = cq;
  880. obj->uevent.event_file = READ_ONCE(attrs->ufile->default_async_file);
  881. if (obj->uevent.event_file)
  882. uverbs_uobject_get(&obj->uevent.event_file->uobj);
  883. uobj_finalize_uobj_create(&obj->uevent.uobject, attrs);
  884. resp.base.cq_handle = obj->uevent.uobject.id;
  885. resp.base.cqe = cq->cqe;
  886. resp.response_length = uverbs_response_length(attrs, sizeof(resp));
  887. return uverbs_response(attrs, &resp, sizeof(resp));
  888. err_free:
  889. rdma_restrack_put(&cq->res);
  890. kfree(cq);
  891. err_file:
  892. if (ev_file)
  893. ib_uverbs_release_ucq(ev_file, obj);
  894. err:
  895. uobj_alloc_abort(&obj->uevent.uobject, attrs);
  896. return ret;
  897. }
  898. static int ib_uverbs_create_cq(struct uverbs_attr_bundle *attrs)
  899. {
  900. struct ib_uverbs_create_cq cmd;
  901. struct ib_uverbs_ex_create_cq cmd_ex;
  902. int ret;
  903. ret = uverbs_request(attrs, &cmd, sizeof(cmd));
  904. if (ret)
  905. return ret;
  906. memset(&cmd_ex, 0, sizeof(cmd_ex));
  907. cmd_ex.user_handle = cmd.user_handle;
  908. cmd_ex.cqe = cmd.cqe;
  909. cmd_ex.comp_vector = cmd.comp_vector;
  910. cmd_ex.comp_channel = cmd.comp_channel;
  911. return create_cq(attrs, &cmd_ex);
  912. }
  913. static int ib_uverbs_ex_create_cq(struct uverbs_attr_bundle *attrs)
  914. {
  915. struct ib_uverbs_ex_create_cq cmd;
  916. int ret;
  917. ret = uverbs_request(attrs, &cmd, sizeof(cmd));
  918. if (ret)
  919. return ret;
  920. if (cmd.comp_mask)
  921. return -EINVAL;
  922. if (cmd.reserved)
  923. return -EINVAL;
  924. return create_cq(attrs, &cmd);
  925. }
  926. static int ib_uverbs_resize_cq(struct uverbs_attr_bundle *attrs)
  927. {
  928. struct ib_uverbs_resize_cq cmd;
  929. struct ib_uverbs_resize_cq_resp resp = {};
  930. struct ib_cq *cq;
  931. int ret;
  932. ret = uverbs_request(attrs, &cmd, sizeof(cmd));
  933. if (ret)
  934. return ret;
  935. cq = uobj_get_obj_read(cq, UVERBS_OBJECT_CQ, cmd.cq_handle, attrs);
  936. if (IS_ERR(cq))
  937. return PTR_ERR(cq);
  938. ret = cq->device->ops.resize_cq(cq, cmd.cqe, &attrs->driver_udata);
  939. if (ret)
  940. goto out;
  941. resp.cqe = cq->cqe;
  942. ret = uverbs_response(attrs, &resp, sizeof(resp));
  943. out:
  944. rdma_lookup_put_uobject(&cq->uobject->uevent.uobject,
  945. UVERBS_LOOKUP_READ);
  946. return ret;
  947. }
  948. static int copy_wc_to_user(struct ib_device *ib_dev, void __user *dest,
  949. struct ib_wc *wc)
  950. {
  951. struct ib_uverbs_wc tmp;
  952. tmp.wr_id = wc->wr_id;
  953. tmp.status = wc->status;
  954. tmp.opcode = wc->opcode;
  955. tmp.vendor_err = wc->vendor_err;
  956. tmp.byte_len = wc->byte_len;
  957. tmp.ex.imm_data = wc->ex.imm_data;
  958. tmp.qp_num = wc->qp->qp_num;
  959. tmp.src_qp = wc->src_qp;
  960. tmp.wc_flags = wc->wc_flags;
  961. tmp.pkey_index = wc->pkey_index;
  962. if (rdma_cap_opa_ah(ib_dev, wc->port_num))
  963. tmp.slid = OPA_TO_IB_UCAST_LID(wc->slid);
  964. else
  965. tmp.slid = ib_lid_cpu16(wc->slid);
  966. tmp.sl = wc->sl;
  967. tmp.dlid_path_bits = wc->dlid_path_bits;
  968. tmp.port_num = wc->port_num;
  969. tmp.reserved = 0;
  970. if (copy_to_user(dest, &tmp, sizeof tmp))
  971. return -EFAULT;
  972. return 0;
  973. }
  974. static int ib_uverbs_poll_cq(struct uverbs_attr_bundle *attrs)
  975. {
  976. struct ib_uverbs_poll_cq cmd;
  977. struct ib_uverbs_poll_cq_resp resp;
  978. u8 __user *header_ptr;
  979. u8 __user *data_ptr;
  980. struct ib_cq *cq;
  981. struct ib_wc wc;
  982. int ret;
  983. ret = uverbs_request(attrs, &cmd, sizeof(cmd));
  984. if (ret)
  985. return ret;
  986. cq = uobj_get_obj_read(cq, UVERBS_OBJECT_CQ, cmd.cq_handle, attrs);
  987. if (IS_ERR(cq))
  988. return PTR_ERR(cq);
  989. /* we copy a struct ib_uverbs_poll_cq_resp to user space */
  990. header_ptr = attrs->ucore.outbuf;
  991. data_ptr = header_ptr + sizeof resp;
  992. memset(&resp, 0, sizeof resp);
  993. while (resp.count < cmd.ne) {
  994. ret = ib_poll_cq(cq, 1, &wc);
  995. if (ret < 0)
  996. goto out_put;
  997. if (!ret)
  998. break;
  999. ret = copy_wc_to_user(cq->device, data_ptr, &wc);
  1000. if (ret)
  1001. goto out_put;
  1002. data_ptr += sizeof(struct ib_uverbs_wc);
  1003. ++resp.count;
  1004. }
  1005. if (copy_to_user(header_ptr, &resp, sizeof resp)) {
  1006. ret = -EFAULT;
  1007. goto out_put;
  1008. }
  1009. ret = 0;
  1010. if (uverbs_attr_is_valid(attrs, UVERBS_ATTR_CORE_OUT))
  1011. ret = uverbs_output_written(attrs, UVERBS_ATTR_CORE_OUT);
  1012. out_put:
  1013. rdma_lookup_put_uobject(&cq->uobject->uevent.uobject,
  1014. UVERBS_LOOKUP_READ);
  1015. return ret;
  1016. }
  1017. static int ib_uverbs_req_notify_cq(struct uverbs_attr_bundle *attrs)
  1018. {
  1019. struct ib_uverbs_req_notify_cq cmd;
  1020. struct ib_cq *cq;
  1021. int ret;
  1022. ret = uverbs_request(attrs, &cmd, sizeof(cmd));
  1023. if (ret)
  1024. return ret;
  1025. cq = uobj_get_obj_read(cq, UVERBS_OBJECT_CQ, cmd.cq_handle, attrs);
  1026. if (IS_ERR(cq))
  1027. return PTR_ERR(cq);
  1028. ib_req_notify_cq(cq, cmd.solicited_only ?
  1029. IB_CQ_SOLICITED : IB_CQ_NEXT_COMP);
  1030. rdma_lookup_put_uobject(&cq->uobject->uevent.uobject,
  1031. UVERBS_LOOKUP_READ);
  1032. return 0;
  1033. }
  1034. static int ib_uverbs_destroy_cq(struct uverbs_attr_bundle *attrs)
  1035. {
  1036. struct ib_uverbs_destroy_cq cmd;
  1037. struct ib_uverbs_destroy_cq_resp resp;
  1038. struct ib_uobject *uobj;
  1039. struct ib_ucq_object *obj;
  1040. int ret;
  1041. ret = uverbs_request(attrs, &cmd, sizeof(cmd));
  1042. if (ret)
  1043. return ret;
  1044. uobj = uobj_get_destroy(UVERBS_OBJECT_CQ, cmd.cq_handle, attrs);
  1045. if (IS_ERR(uobj))
  1046. return PTR_ERR(uobj);
  1047. obj = container_of(uobj, struct ib_ucq_object, uevent.uobject);
  1048. memset(&resp, 0, sizeof(resp));
  1049. resp.comp_events_reported = obj->comp_events_reported;
  1050. resp.async_events_reported = obj->uevent.events_reported;
  1051. uobj_put_destroy(uobj);
  1052. return uverbs_response(attrs, &resp, sizeof(resp));
  1053. }
  1054. static int create_qp(struct uverbs_attr_bundle *attrs,
  1055. struct ib_uverbs_ex_create_qp *cmd)
  1056. {
  1057. struct ib_uqp_object *obj;
  1058. struct ib_device *device;
  1059. struct ib_pd *pd = NULL;
  1060. struct ib_xrcd *xrcd = NULL;
  1061. struct ib_uobject *xrcd_uobj = ERR_PTR(-ENOENT);
  1062. struct ib_cq *scq = NULL, *rcq = NULL;
  1063. struct ib_srq *srq = NULL;
  1064. struct ib_qp *qp;
  1065. struct ib_qp_init_attr attr = {};
  1066. struct ib_uverbs_ex_create_qp_resp resp = {};
  1067. int ret;
  1068. struct ib_rwq_ind_table *ind_tbl = NULL;
  1069. bool has_sq = true;
  1070. struct ib_device *ib_dev;
  1071. switch (cmd->qp_type) {
  1072. case IB_QPT_RAW_PACKET:
  1073. if (!capable(CAP_NET_RAW))
  1074. return -EPERM;
  1075. break;
  1076. case IB_QPT_RC:
  1077. case IB_QPT_UC:
  1078. case IB_QPT_UD:
  1079. case IB_QPT_XRC_INI:
  1080. case IB_QPT_XRC_TGT:
  1081. case IB_QPT_DRIVER:
  1082. break;
  1083. default:
  1084. return -EINVAL;
  1085. }
  1086. obj = (struct ib_uqp_object *)uobj_alloc(UVERBS_OBJECT_QP, attrs,
  1087. &ib_dev);
  1088. if (IS_ERR(obj))
  1089. return PTR_ERR(obj);
  1090. obj->uxrcd = NULL;
  1091. obj->uevent.uobject.user_handle = cmd->user_handle;
  1092. mutex_init(&obj->mcast_lock);
  1093. if (cmd->comp_mask & IB_UVERBS_CREATE_QP_MASK_IND_TABLE) {
  1094. ind_tbl = uobj_get_obj_read(rwq_ind_table,
  1095. UVERBS_OBJECT_RWQ_IND_TBL,
  1096. cmd->rwq_ind_tbl_handle, attrs);
  1097. if (IS_ERR(ind_tbl)) {
  1098. ret = PTR_ERR(ind_tbl);
  1099. goto err_put;
  1100. }
  1101. attr.rwq_ind_tbl = ind_tbl;
  1102. }
  1103. if (ind_tbl && (cmd->max_recv_wr || cmd->max_recv_sge || cmd->is_srq)) {
  1104. ret = -EINVAL;
  1105. goto err_put;
  1106. }
  1107. if (ind_tbl && !cmd->max_send_wr)
  1108. has_sq = false;
  1109. if (cmd->qp_type == IB_QPT_XRC_TGT) {
  1110. xrcd_uobj = uobj_get_read(UVERBS_OBJECT_XRCD, cmd->pd_handle,
  1111. attrs);
  1112. if (IS_ERR(xrcd_uobj)) {
  1113. ret = -EINVAL;
  1114. goto err_put;
  1115. }
  1116. xrcd = (struct ib_xrcd *)xrcd_uobj->object;
  1117. if (!xrcd) {
  1118. ret = -EINVAL;
  1119. goto err_put;
  1120. }
  1121. device = xrcd->device;
  1122. } else {
  1123. if (cmd->qp_type == IB_QPT_XRC_INI) {
  1124. cmd->max_recv_wr = 0;
  1125. cmd->max_recv_sge = 0;
  1126. } else {
  1127. if (cmd->is_srq) {
  1128. srq = uobj_get_obj_read(srq, UVERBS_OBJECT_SRQ,
  1129. cmd->srq_handle, attrs);
  1130. if (IS_ERR(srq) ||
  1131. srq->srq_type == IB_SRQT_XRC) {
  1132. ret = IS_ERR(srq) ? PTR_ERR(srq) :
  1133. -EINVAL;
  1134. goto err_put;
  1135. }
  1136. }
  1137. if (!ind_tbl) {
  1138. if (cmd->recv_cq_handle != cmd->send_cq_handle) {
  1139. rcq = uobj_get_obj_read(
  1140. cq, UVERBS_OBJECT_CQ,
  1141. cmd->recv_cq_handle, attrs);
  1142. if (IS_ERR(rcq)) {
  1143. ret = PTR_ERR(rcq);
  1144. goto err_put;
  1145. }
  1146. }
  1147. }
  1148. }
  1149. if (has_sq) {
  1150. scq = uobj_get_obj_read(cq, UVERBS_OBJECT_CQ,
  1151. cmd->send_cq_handle, attrs);
  1152. if (IS_ERR(scq)) {
  1153. ret = PTR_ERR(scq);
  1154. goto err_put;
  1155. }
  1156. }
  1157. if (!ind_tbl && cmd->qp_type != IB_QPT_XRC_INI)
  1158. rcq = rcq ?: scq;
  1159. pd = uobj_get_obj_read(pd, UVERBS_OBJECT_PD, cmd->pd_handle,
  1160. attrs);
  1161. if (IS_ERR(pd)) {
  1162. ret = PTR_ERR(pd);
  1163. goto err_put;
  1164. }
  1165. device = pd->device;
  1166. }
  1167. attr.event_handler = ib_uverbs_qp_event_handler;
  1168. attr.send_cq = scq;
  1169. attr.recv_cq = rcq;
  1170. attr.srq = srq;
  1171. attr.xrcd = xrcd;
  1172. attr.sq_sig_type = cmd->sq_sig_all ? IB_SIGNAL_ALL_WR :
  1173. IB_SIGNAL_REQ_WR;
  1174. attr.qp_type = cmd->qp_type;
  1175. attr.cap.max_send_wr = cmd->max_send_wr;
  1176. attr.cap.max_recv_wr = cmd->max_recv_wr;
  1177. attr.cap.max_send_sge = cmd->max_send_sge;
  1178. attr.cap.max_recv_sge = cmd->max_recv_sge;
  1179. attr.cap.max_inline_data = cmd->max_inline_data;
  1180. INIT_LIST_HEAD(&obj->uevent.event_list);
  1181. INIT_LIST_HEAD(&obj->mcast_list);
  1182. attr.create_flags = cmd->create_flags;
  1183. if (attr.create_flags & ~(IB_QP_CREATE_BLOCK_MULTICAST_LOOPBACK |
  1184. IB_QP_CREATE_CROSS_CHANNEL |
  1185. IB_QP_CREATE_MANAGED_SEND |
  1186. IB_QP_CREATE_MANAGED_RECV |
  1187. IB_QP_CREATE_SCATTER_FCS |
  1188. IB_QP_CREATE_CVLAN_STRIPPING |
  1189. IB_QP_CREATE_SOURCE_QPN |
  1190. IB_QP_CREATE_PCI_WRITE_END_PADDING)) {
  1191. ret = -EINVAL;
  1192. goto err_put;
  1193. }
  1194. if (attr.create_flags & IB_QP_CREATE_SOURCE_QPN) {
  1195. if (!capable(CAP_NET_RAW)) {
  1196. ret = -EPERM;
  1197. goto err_put;
  1198. }
  1199. attr.source_qpn = cmd->source_qpn;
  1200. }
  1201. qp = ib_create_qp_user(device, pd, &attr, &attrs->driver_udata, obj,
  1202. KBUILD_MODNAME);
  1203. if (IS_ERR(qp)) {
  1204. ret = PTR_ERR(qp);
  1205. goto err_put;
  1206. }
  1207. ib_qp_usecnt_inc(qp);
  1208. obj->uevent.uobject.object = qp;
  1209. obj->uevent.event_file = READ_ONCE(attrs->ufile->default_async_file);
  1210. if (obj->uevent.event_file)
  1211. uverbs_uobject_get(&obj->uevent.event_file->uobj);
  1212. if (xrcd) {
  1213. obj->uxrcd = container_of(xrcd_uobj, struct ib_uxrcd_object,
  1214. uobject);
  1215. atomic_inc(&obj->uxrcd->refcnt);
  1216. uobj_put_read(xrcd_uobj);
  1217. }
  1218. if (pd)
  1219. uobj_put_obj_read(pd);
  1220. if (scq)
  1221. rdma_lookup_put_uobject(&scq->uobject->uevent.uobject,
  1222. UVERBS_LOOKUP_READ);
  1223. if (rcq && rcq != scq)
  1224. rdma_lookup_put_uobject(&rcq->uobject->uevent.uobject,
  1225. UVERBS_LOOKUP_READ);
  1226. if (srq)
  1227. rdma_lookup_put_uobject(&srq->uobject->uevent.uobject,
  1228. UVERBS_LOOKUP_READ);
  1229. if (ind_tbl)
  1230. uobj_put_obj_read(ind_tbl);
  1231. uobj_finalize_uobj_create(&obj->uevent.uobject, attrs);
  1232. resp.base.qpn = qp->qp_num;
  1233. resp.base.qp_handle = obj->uevent.uobject.id;
  1234. resp.base.max_recv_sge = attr.cap.max_recv_sge;
  1235. resp.base.max_send_sge = attr.cap.max_send_sge;
  1236. resp.base.max_recv_wr = attr.cap.max_recv_wr;
  1237. resp.base.max_send_wr = attr.cap.max_send_wr;
  1238. resp.base.max_inline_data = attr.cap.max_inline_data;
  1239. resp.response_length = uverbs_response_length(attrs, sizeof(resp));
  1240. return uverbs_response(attrs, &resp, sizeof(resp));
  1241. err_put:
  1242. if (!IS_ERR(xrcd_uobj))
  1243. uobj_put_read(xrcd_uobj);
  1244. if (!IS_ERR_OR_NULL(pd))
  1245. uobj_put_obj_read(pd);
  1246. if (!IS_ERR_OR_NULL(scq))
  1247. rdma_lookup_put_uobject(&scq->uobject->uevent.uobject,
  1248. UVERBS_LOOKUP_READ);
  1249. if (!IS_ERR_OR_NULL(rcq) && rcq != scq)
  1250. rdma_lookup_put_uobject(&rcq->uobject->uevent.uobject,
  1251. UVERBS_LOOKUP_READ);
  1252. if (!IS_ERR_OR_NULL(srq))
  1253. rdma_lookup_put_uobject(&srq->uobject->uevent.uobject,
  1254. UVERBS_LOOKUP_READ);
  1255. if (!IS_ERR_OR_NULL(ind_tbl))
  1256. uobj_put_obj_read(ind_tbl);
  1257. uobj_alloc_abort(&obj->uevent.uobject, attrs);
  1258. return ret;
  1259. }
  1260. static int ib_uverbs_create_qp(struct uverbs_attr_bundle *attrs)
  1261. {
  1262. struct ib_uverbs_create_qp cmd;
  1263. struct ib_uverbs_ex_create_qp cmd_ex;
  1264. int ret;
  1265. ret = uverbs_request(attrs, &cmd, sizeof(cmd));
  1266. if (ret)
  1267. return ret;
  1268. memset(&cmd_ex, 0, sizeof(cmd_ex));
  1269. cmd_ex.user_handle = cmd.user_handle;
  1270. cmd_ex.pd_handle = cmd.pd_handle;
  1271. cmd_ex.send_cq_handle = cmd.send_cq_handle;
  1272. cmd_ex.recv_cq_handle = cmd.recv_cq_handle;
  1273. cmd_ex.srq_handle = cmd.srq_handle;
  1274. cmd_ex.max_send_wr = cmd.max_send_wr;
  1275. cmd_ex.max_recv_wr = cmd.max_recv_wr;
  1276. cmd_ex.max_send_sge = cmd.max_send_sge;
  1277. cmd_ex.max_recv_sge = cmd.max_recv_sge;
  1278. cmd_ex.max_inline_data = cmd.max_inline_data;
  1279. cmd_ex.sq_sig_all = cmd.sq_sig_all;
  1280. cmd_ex.qp_type = cmd.qp_type;
  1281. cmd_ex.is_srq = cmd.is_srq;
  1282. return create_qp(attrs, &cmd_ex);
  1283. }
  1284. static int ib_uverbs_ex_create_qp(struct uverbs_attr_bundle *attrs)
  1285. {
  1286. struct ib_uverbs_ex_create_qp cmd;
  1287. int ret;
  1288. ret = uverbs_request(attrs, &cmd, sizeof(cmd));
  1289. if (ret)
  1290. return ret;
  1291. if (cmd.comp_mask & ~IB_UVERBS_CREATE_QP_SUP_COMP_MASK)
  1292. return -EINVAL;
  1293. if (cmd.reserved)
  1294. return -EINVAL;
  1295. return create_qp(attrs, &cmd);
  1296. }
  1297. static int ib_uverbs_open_qp(struct uverbs_attr_bundle *attrs)
  1298. {
  1299. struct ib_uverbs_create_qp_resp resp = {};
  1300. struct ib_uverbs_open_qp cmd;
  1301. struct ib_uqp_object *obj;
  1302. struct ib_xrcd *xrcd;
  1303. struct ib_qp *qp;
  1304. struct ib_qp_open_attr attr = {};
  1305. int ret;
  1306. struct ib_uobject *xrcd_uobj;
  1307. struct ib_device *ib_dev;
  1308. ret = uverbs_request(attrs, &cmd, sizeof(cmd));
  1309. if (ret)
  1310. return ret;
  1311. obj = (struct ib_uqp_object *)uobj_alloc(UVERBS_OBJECT_QP, attrs,
  1312. &ib_dev);
  1313. if (IS_ERR(obj))
  1314. return PTR_ERR(obj);
  1315. xrcd_uobj = uobj_get_read(UVERBS_OBJECT_XRCD, cmd.pd_handle, attrs);
  1316. if (IS_ERR(xrcd_uobj)) {
  1317. ret = -EINVAL;
  1318. goto err_put;
  1319. }
  1320. xrcd = (struct ib_xrcd *)xrcd_uobj->object;
  1321. if (!xrcd) {
  1322. ret = -EINVAL;
  1323. goto err_xrcd;
  1324. }
  1325. attr.event_handler = ib_uverbs_qp_event_handler;
  1326. attr.qp_num = cmd.qpn;
  1327. attr.qp_type = cmd.qp_type;
  1328. INIT_LIST_HEAD(&obj->uevent.event_list);
  1329. INIT_LIST_HEAD(&obj->mcast_list);
  1330. qp = ib_open_qp(xrcd, &attr);
  1331. if (IS_ERR(qp)) {
  1332. ret = PTR_ERR(qp);
  1333. goto err_xrcd;
  1334. }
  1335. obj->uevent.uobject.object = qp;
  1336. obj->uevent.uobject.user_handle = cmd.user_handle;
  1337. obj->uxrcd = container_of(xrcd_uobj, struct ib_uxrcd_object, uobject);
  1338. atomic_inc(&obj->uxrcd->refcnt);
  1339. qp->uobject = obj;
  1340. uobj_put_read(xrcd_uobj);
  1341. uobj_finalize_uobj_create(&obj->uevent.uobject, attrs);
  1342. resp.qpn = qp->qp_num;
  1343. resp.qp_handle = obj->uevent.uobject.id;
  1344. return uverbs_response(attrs, &resp, sizeof(resp));
  1345. err_xrcd:
  1346. uobj_put_read(xrcd_uobj);
  1347. err_put:
  1348. uobj_alloc_abort(&obj->uevent.uobject, attrs);
  1349. return ret;
  1350. }
  1351. static void copy_ah_attr_to_uverbs(struct ib_uverbs_qp_dest *uverb_attr,
  1352. struct rdma_ah_attr *rdma_attr)
  1353. {
  1354. const struct ib_global_route *grh;
  1355. uverb_attr->dlid = rdma_ah_get_dlid(rdma_attr);
  1356. uverb_attr->sl = rdma_ah_get_sl(rdma_attr);
  1357. uverb_attr->src_path_bits = rdma_ah_get_path_bits(rdma_attr);
  1358. uverb_attr->static_rate = rdma_ah_get_static_rate(rdma_attr);
  1359. uverb_attr->is_global = !!(rdma_ah_get_ah_flags(rdma_attr) &
  1360. IB_AH_GRH);
  1361. if (uverb_attr->is_global) {
  1362. grh = rdma_ah_read_grh(rdma_attr);
  1363. memcpy(uverb_attr->dgid, grh->dgid.raw, 16);
  1364. uverb_attr->flow_label = grh->flow_label;
  1365. uverb_attr->sgid_index = grh->sgid_index;
  1366. uverb_attr->hop_limit = grh->hop_limit;
  1367. uverb_attr->traffic_class = grh->traffic_class;
  1368. }
  1369. uverb_attr->port_num = rdma_ah_get_port_num(rdma_attr);
  1370. }
  1371. static int ib_uverbs_query_qp(struct uverbs_attr_bundle *attrs)
  1372. {
  1373. struct ib_uverbs_query_qp cmd;
  1374. struct ib_uverbs_query_qp_resp resp;
  1375. struct ib_qp *qp;
  1376. struct ib_qp_attr *attr;
  1377. struct ib_qp_init_attr *init_attr;
  1378. int ret;
  1379. ret = uverbs_request(attrs, &cmd, sizeof(cmd));
  1380. if (ret)
  1381. return ret;
  1382. attr = kmalloc(sizeof *attr, GFP_KERNEL);
  1383. init_attr = kmalloc(sizeof *init_attr, GFP_KERNEL);
  1384. if (!attr || !init_attr) {
  1385. ret = -ENOMEM;
  1386. goto out;
  1387. }
  1388. qp = uobj_get_obj_read(qp, UVERBS_OBJECT_QP, cmd.qp_handle, attrs);
  1389. if (IS_ERR(qp)) {
  1390. ret = PTR_ERR(qp);
  1391. goto out;
  1392. }
  1393. ret = ib_query_qp(qp, attr, cmd.attr_mask, init_attr);
  1394. rdma_lookup_put_uobject(&qp->uobject->uevent.uobject,
  1395. UVERBS_LOOKUP_READ);
  1396. if (ret)
  1397. goto out;
  1398. memset(&resp, 0, sizeof resp);
  1399. resp.qp_state = attr->qp_state;
  1400. resp.cur_qp_state = attr->cur_qp_state;
  1401. resp.path_mtu = attr->path_mtu;
  1402. resp.path_mig_state = attr->path_mig_state;
  1403. resp.qkey = attr->qkey;
  1404. resp.rq_psn = attr->rq_psn;
  1405. resp.sq_psn = attr->sq_psn;
  1406. resp.dest_qp_num = attr->dest_qp_num;
  1407. resp.qp_access_flags = attr->qp_access_flags;
  1408. resp.pkey_index = attr->pkey_index;
  1409. resp.alt_pkey_index = attr->alt_pkey_index;
  1410. resp.sq_draining = attr->sq_draining;
  1411. resp.max_rd_atomic = attr->max_rd_atomic;
  1412. resp.max_dest_rd_atomic = attr->max_dest_rd_atomic;
  1413. resp.min_rnr_timer = attr->min_rnr_timer;
  1414. resp.port_num = attr->port_num;
  1415. resp.timeout = attr->timeout;
  1416. resp.retry_cnt = attr->retry_cnt;
  1417. resp.rnr_retry = attr->rnr_retry;
  1418. resp.alt_port_num = attr->alt_port_num;
  1419. resp.alt_timeout = attr->alt_timeout;
  1420. copy_ah_attr_to_uverbs(&resp.dest, &attr->ah_attr);
  1421. copy_ah_attr_to_uverbs(&resp.alt_dest, &attr->alt_ah_attr);
  1422. resp.max_send_wr = init_attr->cap.max_send_wr;
  1423. resp.max_recv_wr = init_attr->cap.max_recv_wr;
  1424. resp.max_send_sge = init_attr->cap.max_send_sge;
  1425. resp.max_recv_sge = init_attr->cap.max_recv_sge;
  1426. resp.max_inline_data = init_attr->cap.max_inline_data;
  1427. resp.sq_sig_all = init_attr->sq_sig_type == IB_SIGNAL_ALL_WR;
  1428. ret = uverbs_response(attrs, &resp, sizeof(resp));
  1429. out:
  1430. kfree(attr);
  1431. kfree(init_attr);
  1432. return ret;
  1433. }
  1434. /* Remove ignored fields set in the attribute mask */
  1435. static int modify_qp_mask(enum ib_qp_type qp_type, int mask)
  1436. {
  1437. switch (qp_type) {
  1438. case IB_QPT_XRC_INI:
  1439. return mask & ~(IB_QP_MAX_DEST_RD_ATOMIC | IB_QP_MIN_RNR_TIMER);
  1440. case IB_QPT_XRC_TGT:
  1441. return mask & ~(IB_QP_MAX_QP_RD_ATOMIC | IB_QP_RETRY_CNT |
  1442. IB_QP_RNR_RETRY);
  1443. default:
  1444. return mask;
  1445. }
  1446. }
  1447. static void copy_ah_attr_from_uverbs(struct ib_device *dev,
  1448. struct rdma_ah_attr *rdma_attr,
  1449. struct ib_uverbs_qp_dest *uverb_attr)
  1450. {
  1451. rdma_attr->type = rdma_ah_find_type(dev, uverb_attr->port_num);
  1452. if (uverb_attr->is_global) {
  1453. rdma_ah_set_grh(rdma_attr, NULL,
  1454. uverb_attr->flow_label,
  1455. uverb_attr->sgid_index,
  1456. uverb_attr->hop_limit,
  1457. uverb_attr->traffic_class);
  1458. rdma_ah_set_dgid_raw(rdma_attr, uverb_attr->dgid);
  1459. } else {
  1460. rdma_ah_set_ah_flags(rdma_attr, 0);
  1461. }
  1462. rdma_ah_set_dlid(rdma_attr, uverb_attr->dlid);
  1463. rdma_ah_set_sl(rdma_attr, uverb_attr->sl);
  1464. rdma_ah_set_path_bits(rdma_attr, uverb_attr->src_path_bits);
  1465. rdma_ah_set_static_rate(rdma_attr, uverb_attr->static_rate);
  1466. rdma_ah_set_port_num(rdma_attr, uverb_attr->port_num);
  1467. rdma_ah_set_make_grd(rdma_attr, false);
  1468. }
  1469. static int modify_qp(struct uverbs_attr_bundle *attrs,
  1470. struct ib_uverbs_ex_modify_qp *cmd)
  1471. {
  1472. struct ib_qp_attr *attr;
  1473. struct ib_qp *qp;
  1474. int ret;
  1475. attr = kzalloc(sizeof(*attr), GFP_KERNEL);
  1476. if (!attr)
  1477. return -ENOMEM;
  1478. qp = uobj_get_obj_read(qp, UVERBS_OBJECT_QP, cmd->base.qp_handle,
  1479. attrs);
  1480. if (IS_ERR(qp)) {
  1481. ret = PTR_ERR(qp);
  1482. goto out;
  1483. }
  1484. if ((cmd->base.attr_mask & IB_QP_PORT) &&
  1485. !rdma_is_port_valid(qp->device, cmd->base.port_num)) {
  1486. ret = -EINVAL;
  1487. goto release_qp;
  1488. }
  1489. if ((cmd->base.attr_mask & IB_QP_AV)) {
  1490. if (!rdma_is_port_valid(qp->device, cmd->base.dest.port_num)) {
  1491. ret = -EINVAL;
  1492. goto release_qp;
  1493. }
  1494. if (cmd->base.attr_mask & IB_QP_STATE &&
  1495. cmd->base.qp_state == IB_QPS_RTR) {
  1496. /* We are in INIT->RTR TRANSITION (if we are not,
  1497. * this transition will be rejected in subsequent checks).
  1498. * In the INIT->RTR transition, we cannot have IB_QP_PORT set,
  1499. * but the IB_QP_STATE flag is required.
  1500. *
  1501. * Since kernel 3.14 (commit dbf727de7440), the uverbs driver,
  1502. * when IB_QP_AV is set, has required inclusion of a valid
  1503. * port number in the primary AV. (AVs are created and handled
  1504. * differently for infiniband and ethernet (RoCE) ports).
  1505. *
  1506. * Check the port number included in the primary AV against
  1507. * the port number in the qp struct, which was set (and saved)
  1508. * in the RST->INIT transition.
  1509. */
  1510. if (cmd->base.dest.port_num != qp->real_qp->port) {
  1511. ret = -EINVAL;
  1512. goto release_qp;
  1513. }
  1514. } else {
  1515. /* We are in SQD->SQD. (If we are not, this transition will
  1516. * be rejected later in the verbs layer checks).
  1517. * Check for both IB_QP_PORT and IB_QP_AV, these can be set
  1518. * together in the SQD->SQD transition.
  1519. *
  1520. * If only IP_QP_AV was set, add in IB_QP_PORT as well (the
  1521. * verbs layer driver does not track primary port changes
  1522. * resulting from path migration. Thus, in SQD, if the primary
  1523. * AV is modified, the primary port should also be modified).
  1524. *
  1525. * Note that in this transition, the IB_QP_STATE flag
  1526. * is not allowed.
  1527. */
  1528. if (((cmd->base.attr_mask & (IB_QP_AV | IB_QP_PORT))
  1529. == (IB_QP_AV | IB_QP_PORT)) &&
  1530. cmd->base.port_num != cmd->base.dest.port_num) {
  1531. ret = -EINVAL;
  1532. goto release_qp;
  1533. }
  1534. if ((cmd->base.attr_mask & (IB_QP_AV | IB_QP_PORT))
  1535. == IB_QP_AV) {
  1536. cmd->base.attr_mask |= IB_QP_PORT;
  1537. cmd->base.port_num = cmd->base.dest.port_num;
  1538. }
  1539. }
  1540. }
  1541. if ((cmd->base.attr_mask & IB_QP_ALT_PATH) &&
  1542. (!rdma_is_port_valid(qp->device, cmd->base.alt_port_num) ||
  1543. !rdma_is_port_valid(qp->device, cmd->base.alt_dest.port_num) ||
  1544. cmd->base.alt_port_num != cmd->base.alt_dest.port_num)) {
  1545. ret = -EINVAL;
  1546. goto release_qp;
  1547. }
  1548. if ((cmd->base.attr_mask & IB_QP_CUR_STATE &&
  1549. cmd->base.cur_qp_state > IB_QPS_ERR) ||
  1550. (cmd->base.attr_mask & IB_QP_STATE &&
  1551. cmd->base.qp_state > IB_QPS_ERR)) {
  1552. ret = -EINVAL;
  1553. goto release_qp;
  1554. }
  1555. if (cmd->base.attr_mask & IB_QP_STATE)
  1556. attr->qp_state = cmd->base.qp_state;
  1557. if (cmd->base.attr_mask & IB_QP_CUR_STATE)
  1558. attr->cur_qp_state = cmd->base.cur_qp_state;
  1559. if (cmd->base.attr_mask & IB_QP_PATH_MTU)
  1560. attr->path_mtu = cmd->base.path_mtu;
  1561. if (cmd->base.attr_mask & IB_QP_PATH_MIG_STATE)
  1562. attr->path_mig_state = cmd->base.path_mig_state;
  1563. if (cmd->base.attr_mask & IB_QP_QKEY) {
  1564. if (cmd->base.qkey & IB_QP_SET_QKEY &&
  1565. !rdma_nl_get_privileged_qkey()) {
  1566. ret = -EPERM;
  1567. goto release_qp;
  1568. }
  1569. attr->qkey = cmd->base.qkey;
  1570. }
  1571. if (cmd->base.attr_mask & IB_QP_RQ_PSN)
  1572. attr->rq_psn = cmd->base.rq_psn;
  1573. if (cmd->base.attr_mask & IB_QP_SQ_PSN)
  1574. attr->sq_psn = cmd->base.sq_psn;
  1575. if (cmd->base.attr_mask & IB_QP_DEST_QPN)
  1576. attr->dest_qp_num = cmd->base.dest_qp_num;
  1577. if (cmd->base.attr_mask & IB_QP_ACCESS_FLAGS)
  1578. attr->qp_access_flags = cmd->base.qp_access_flags;
  1579. if (cmd->base.attr_mask & IB_QP_PKEY_INDEX)
  1580. attr->pkey_index = cmd->base.pkey_index;
  1581. if (cmd->base.attr_mask & IB_QP_EN_SQD_ASYNC_NOTIFY)
  1582. attr->en_sqd_async_notify = cmd->base.en_sqd_async_notify;
  1583. if (cmd->base.attr_mask & IB_QP_MAX_QP_RD_ATOMIC)
  1584. attr->max_rd_atomic = cmd->base.max_rd_atomic;
  1585. if (cmd->base.attr_mask & IB_QP_MAX_DEST_RD_ATOMIC)
  1586. attr->max_dest_rd_atomic = cmd->base.max_dest_rd_atomic;
  1587. if (cmd->base.attr_mask & IB_QP_MIN_RNR_TIMER)
  1588. attr->min_rnr_timer = cmd->base.min_rnr_timer;
  1589. if (cmd->base.attr_mask & IB_QP_PORT)
  1590. attr->port_num = cmd->base.port_num;
  1591. if (cmd->base.attr_mask & IB_QP_TIMEOUT)
  1592. attr->timeout = cmd->base.timeout;
  1593. if (cmd->base.attr_mask & IB_QP_RETRY_CNT)
  1594. attr->retry_cnt = cmd->base.retry_cnt;
  1595. if (cmd->base.attr_mask & IB_QP_RNR_RETRY)
  1596. attr->rnr_retry = cmd->base.rnr_retry;
  1597. if (cmd->base.attr_mask & IB_QP_ALT_PATH) {
  1598. attr->alt_port_num = cmd->base.alt_port_num;
  1599. attr->alt_timeout = cmd->base.alt_timeout;
  1600. attr->alt_pkey_index = cmd->base.alt_pkey_index;
  1601. }
  1602. if (cmd->base.attr_mask & IB_QP_RATE_LIMIT)
  1603. attr->rate_limit = cmd->rate_limit;
  1604. if (cmd->base.attr_mask & IB_QP_AV)
  1605. copy_ah_attr_from_uverbs(qp->device, &attr->ah_attr,
  1606. &cmd->base.dest);
  1607. if (cmd->base.attr_mask & IB_QP_ALT_PATH)
  1608. copy_ah_attr_from_uverbs(qp->device, &attr->alt_ah_attr,
  1609. &cmd->base.alt_dest);
  1610. ret = ib_modify_qp_with_udata(qp, attr,
  1611. modify_qp_mask(qp->qp_type,
  1612. cmd->base.attr_mask),
  1613. &attrs->driver_udata);
  1614. release_qp:
  1615. rdma_lookup_put_uobject(&qp->uobject->uevent.uobject,
  1616. UVERBS_LOOKUP_READ);
  1617. out:
  1618. kfree(attr);
  1619. return ret;
  1620. }
  1621. static int ib_uverbs_modify_qp(struct uverbs_attr_bundle *attrs)
  1622. {
  1623. struct ib_uverbs_ex_modify_qp cmd;
  1624. int ret;
  1625. ret = uverbs_request(attrs, &cmd.base, sizeof(cmd.base));
  1626. if (ret)
  1627. return ret;
  1628. if (cmd.base.attr_mask & ~IB_QP_ATTR_STANDARD_BITS)
  1629. return -EOPNOTSUPP;
  1630. return modify_qp(attrs, &cmd);
  1631. }
  1632. static int ib_uverbs_ex_modify_qp(struct uverbs_attr_bundle *attrs)
  1633. {
  1634. struct ib_uverbs_ex_modify_qp cmd;
  1635. struct ib_uverbs_ex_modify_qp_resp resp = {
  1636. .response_length = uverbs_response_length(attrs, sizeof(resp))
  1637. };
  1638. int ret;
  1639. ret = uverbs_request(attrs, &cmd, sizeof(cmd));
  1640. if (ret)
  1641. return ret;
  1642. /*
  1643. * Last bit is reserved for extending the attr_mask by
  1644. * using another field.
  1645. */
  1646. if (cmd.base.attr_mask & ~(IB_QP_ATTR_STANDARD_BITS | IB_QP_RATE_LIMIT))
  1647. return -EOPNOTSUPP;
  1648. ret = modify_qp(attrs, &cmd);
  1649. if (ret)
  1650. return ret;
  1651. return uverbs_response(attrs, &resp, sizeof(resp));
  1652. }
  1653. static int ib_uverbs_destroy_qp(struct uverbs_attr_bundle *attrs)
  1654. {
  1655. struct ib_uverbs_destroy_qp cmd;
  1656. struct ib_uverbs_destroy_qp_resp resp;
  1657. struct ib_uobject *uobj;
  1658. struct ib_uqp_object *obj;
  1659. int ret;
  1660. ret = uverbs_request(attrs, &cmd, sizeof(cmd));
  1661. if (ret)
  1662. return ret;
  1663. uobj = uobj_get_destroy(UVERBS_OBJECT_QP, cmd.qp_handle, attrs);
  1664. if (IS_ERR(uobj))
  1665. return PTR_ERR(uobj);
  1666. obj = container_of(uobj, struct ib_uqp_object, uevent.uobject);
  1667. memset(&resp, 0, sizeof(resp));
  1668. resp.events_reported = obj->uevent.events_reported;
  1669. uobj_put_destroy(uobj);
  1670. return uverbs_response(attrs, &resp, sizeof(resp));
  1671. }
  1672. static void *alloc_wr(size_t wr_size, __u32 num_sge)
  1673. {
  1674. if (num_sge >= (U32_MAX - ALIGN(wr_size, sizeof(struct ib_sge))) /
  1675. sizeof(struct ib_sge))
  1676. return NULL;
  1677. return kmalloc(ALIGN(wr_size, sizeof(struct ib_sge)) +
  1678. num_sge * sizeof(struct ib_sge),
  1679. GFP_KERNEL);
  1680. }
  1681. static int ib_uverbs_post_send(struct uverbs_attr_bundle *attrs)
  1682. {
  1683. struct ib_uverbs_post_send cmd;
  1684. struct ib_uverbs_post_send_resp resp;
  1685. struct ib_uverbs_send_wr *user_wr;
  1686. struct ib_send_wr *wr = NULL, *last, *next;
  1687. const struct ib_send_wr *bad_wr;
  1688. struct ib_qp *qp;
  1689. int i, sg_ind;
  1690. int is_ud;
  1691. int ret, ret2;
  1692. size_t next_size;
  1693. const struct ib_sge __user *sgls;
  1694. const void __user *wqes;
  1695. struct uverbs_req_iter iter;
  1696. ret = uverbs_request_start(attrs, &iter, &cmd, sizeof(cmd));
  1697. if (ret)
  1698. return ret;
  1699. wqes = uverbs_request_next_ptr(&iter, size_mul(cmd.wqe_size,
  1700. cmd.wr_count));
  1701. if (IS_ERR(wqes))
  1702. return PTR_ERR(wqes);
  1703. sgls = uverbs_request_next_ptr(&iter,
  1704. size_mul(cmd.sge_count,
  1705. sizeof(struct ib_uverbs_sge)));
  1706. if (IS_ERR(sgls))
  1707. return PTR_ERR(sgls);
  1708. ret = uverbs_request_finish(&iter);
  1709. if (ret)
  1710. return ret;
  1711. user_wr = kmalloc(cmd.wqe_size, GFP_KERNEL);
  1712. if (!user_wr)
  1713. return -ENOMEM;
  1714. qp = uobj_get_obj_read(qp, UVERBS_OBJECT_QP, cmd.qp_handle, attrs);
  1715. if (IS_ERR(qp)) {
  1716. ret = PTR_ERR(qp);
  1717. goto out;
  1718. }
  1719. is_ud = qp->qp_type == IB_QPT_UD;
  1720. sg_ind = 0;
  1721. last = NULL;
  1722. for (i = 0; i < cmd.wr_count; ++i) {
  1723. if (copy_from_user(user_wr, wqes + i * cmd.wqe_size,
  1724. cmd.wqe_size)) {
  1725. ret = -EFAULT;
  1726. goto out_put;
  1727. }
  1728. if (user_wr->num_sge + sg_ind > cmd.sge_count) {
  1729. ret = -EINVAL;
  1730. goto out_put;
  1731. }
  1732. if (is_ud) {
  1733. struct ib_ud_wr *ud;
  1734. if (user_wr->opcode != IB_WR_SEND &&
  1735. user_wr->opcode != IB_WR_SEND_WITH_IMM) {
  1736. ret = -EINVAL;
  1737. goto out_put;
  1738. }
  1739. next_size = sizeof(*ud);
  1740. ud = alloc_wr(next_size, user_wr->num_sge);
  1741. if (!ud) {
  1742. ret = -ENOMEM;
  1743. goto out_put;
  1744. }
  1745. ud->ah = uobj_get_obj_read(ah, UVERBS_OBJECT_AH,
  1746. user_wr->wr.ud.ah, attrs);
  1747. if (IS_ERR(ud->ah)) {
  1748. ret = PTR_ERR(ud->ah);
  1749. kfree(ud);
  1750. goto out_put;
  1751. }
  1752. ud->remote_qpn = user_wr->wr.ud.remote_qpn;
  1753. ud->remote_qkey = user_wr->wr.ud.remote_qkey;
  1754. next = &ud->wr;
  1755. } else if (user_wr->opcode == IB_WR_RDMA_WRITE_WITH_IMM ||
  1756. user_wr->opcode == IB_WR_RDMA_WRITE ||
  1757. user_wr->opcode == IB_WR_RDMA_READ) {
  1758. struct ib_rdma_wr *rdma;
  1759. next_size = sizeof(*rdma);
  1760. rdma = alloc_wr(next_size, user_wr->num_sge);
  1761. if (!rdma) {
  1762. ret = -ENOMEM;
  1763. goto out_put;
  1764. }
  1765. rdma->remote_addr = user_wr->wr.rdma.remote_addr;
  1766. rdma->rkey = user_wr->wr.rdma.rkey;
  1767. next = &rdma->wr;
  1768. } else if (user_wr->opcode == IB_WR_ATOMIC_CMP_AND_SWP ||
  1769. user_wr->opcode == IB_WR_ATOMIC_FETCH_AND_ADD) {
  1770. struct ib_atomic_wr *atomic;
  1771. next_size = sizeof(*atomic);
  1772. atomic = alloc_wr(next_size, user_wr->num_sge);
  1773. if (!atomic) {
  1774. ret = -ENOMEM;
  1775. goto out_put;
  1776. }
  1777. atomic->remote_addr = user_wr->wr.atomic.remote_addr;
  1778. atomic->compare_add = user_wr->wr.atomic.compare_add;
  1779. atomic->swap = user_wr->wr.atomic.swap;
  1780. atomic->rkey = user_wr->wr.atomic.rkey;
  1781. next = &atomic->wr;
  1782. } else if (user_wr->opcode == IB_WR_SEND ||
  1783. user_wr->opcode == IB_WR_SEND_WITH_IMM ||
  1784. user_wr->opcode == IB_WR_SEND_WITH_INV) {
  1785. next_size = sizeof(*next);
  1786. next = alloc_wr(next_size, user_wr->num_sge);
  1787. if (!next) {
  1788. ret = -ENOMEM;
  1789. goto out_put;
  1790. }
  1791. } else {
  1792. ret = -EINVAL;
  1793. goto out_put;
  1794. }
  1795. if (user_wr->opcode == IB_WR_SEND_WITH_IMM ||
  1796. user_wr->opcode == IB_WR_RDMA_WRITE_WITH_IMM) {
  1797. next->ex.imm_data =
  1798. (__be32 __force) user_wr->ex.imm_data;
  1799. } else if (user_wr->opcode == IB_WR_SEND_WITH_INV) {
  1800. next->ex.invalidate_rkey = user_wr->ex.invalidate_rkey;
  1801. }
  1802. if (!last)
  1803. wr = next;
  1804. else
  1805. last->next = next;
  1806. last = next;
  1807. next->next = NULL;
  1808. next->wr_id = user_wr->wr_id;
  1809. next->num_sge = user_wr->num_sge;
  1810. next->opcode = user_wr->opcode;
  1811. next->send_flags = user_wr->send_flags;
  1812. if (next->num_sge) {
  1813. next->sg_list = (void *) next +
  1814. ALIGN(next_size, sizeof(struct ib_sge));
  1815. if (copy_from_user(next->sg_list, sgls + sg_ind,
  1816. next->num_sge *
  1817. sizeof(struct ib_sge))) {
  1818. ret = -EFAULT;
  1819. goto out_put;
  1820. }
  1821. sg_ind += next->num_sge;
  1822. } else
  1823. next->sg_list = NULL;
  1824. }
  1825. resp.bad_wr = 0;
  1826. ret = qp->device->ops.post_send(qp->real_qp, wr, &bad_wr);
  1827. if (ret)
  1828. for (next = wr; next; next = next->next) {
  1829. ++resp.bad_wr;
  1830. if (next == bad_wr)
  1831. break;
  1832. }
  1833. ret2 = uverbs_response(attrs, &resp, sizeof(resp));
  1834. if (ret2)
  1835. ret = ret2;
  1836. out_put:
  1837. rdma_lookup_put_uobject(&qp->uobject->uevent.uobject,
  1838. UVERBS_LOOKUP_READ);
  1839. while (wr) {
  1840. if (is_ud && ud_wr(wr)->ah)
  1841. uobj_put_obj_read(ud_wr(wr)->ah);
  1842. next = wr->next;
  1843. kfree(wr);
  1844. wr = next;
  1845. }
  1846. out:
  1847. kfree(user_wr);
  1848. return ret;
  1849. }
  1850. static struct ib_recv_wr *
  1851. ib_uverbs_unmarshall_recv(struct uverbs_req_iter *iter, u32 wr_count,
  1852. u32 wqe_size, u32 sge_count)
  1853. {
  1854. struct ib_uverbs_recv_wr *user_wr;
  1855. struct ib_recv_wr *wr = NULL, *last, *next;
  1856. int sg_ind;
  1857. int i;
  1858. int ret;
  1859. const struct ib_sge __user *sgls;
  1860. const void __user *wqes;
  1861. if (wqe_size < sizeof(struct ib_uverbs_recv_wr))
  1862. return ERR_PTR(-EINVAL);
  1863. wqes = uverbs_request_next_ptr(iter, size_mul(wqe_size, wr_count));
  1864. if (IS_ERR(wqes))
  1865. return ERR_CAST(wqes);
  1866. sgls = uverbs_request_next_ptr(iter, size_mul(sge_count,
  1867. sizeof(struct ib_uverbs_sge)));
  1868. if (IS_ERR(sgls))
  1869. return ERR_CAST(sgls);
  1870. ret = uverbs_request_finish(iter);
  1871. if (ret)
  1872. return ERR_PTR(ret);
  1873. user_wr = kmalloc(wqe_size, GFP_KERNEL);
  1874. if (!user_wr)
  1875. return ERR_PTR(-ENOMEM);
  1876. sg_ind = 0;
  1877. last = NULL;
  1878. for (i = 0; i < wr_count; ++i) {
  1879. if (copy_from_user(user_wr, wqes + i * wqe_size,
  1880. wqe_size)) {
  1881. ret = -EFAULT;
  1882. goto err;
  1883. }
  1884. if (user_wr->num_sge + sg_ind > sge_count) {
  1885. ret = -EINVAL;
  1886. goto err;
  1887. }
  1888. if (user_wr->num_sge >=
  1889. (U32_MAX - ALIGN(sizeof(*next), sizeof(struct ib_sge))) /
  1890. sizeof(struct ib_sge)) {
  1891. ret = -EINVAL;
  1892. goto err;
  1893. }
  1894. next = kmalloc(ALIGN(sizeof(*next), sizeof(struct ib_sge)) +
  1895. user_wr->num_sge * sizeof(struct ib_sge),
  1896. GFP_KERNEL);
  1897. if (!next) {
  1898. ret = -ENOMEM;
  1899. goto err;
  1900. }
  1901. if (!last)
  1902. wr = next;
  1903. else
  1904. last->next = next;
  1905. last = next;
  1906. next->next = NULL;
  1907. next->wr_id = user_wr->wr_id;
  1908. next->num_sge = user_wr->num_sge;
  1909. if (next->num_sge) {
  1910. next->sg_list = (void *)next +
  1911. ALIGN(sizeof(*next), sizeof(struct ib_sge));
  1912. if (copy_from_user(next->sg_list, sgls + sg_ind,
  1913. next->num_sge *
  1914. sizeof(struct ib_sge))) {
  1915. ret = -EFAULT;
  1916. goto err;
  1917. }
  1918. sg_ind += next->num_sge;
  1919. } else
  1920. next->sg_list = NULL;
  1921. }
  1922. kfree(user_wr);
  1923. return wr;
  1924. err:
  1925. kfree(user_wr);
  1926. while (wr) {
  1927. next = wr->next;
  1928. kfree(wr);
  1929. wr = next;
  1930. }
  1931. return ERR_PTR(ret);
  1932. }
  1933. static int ib_uverbs_post_recv(struct uverbs_attr_bundle *attrs)
  1934. {
  1935. struct ib_uverbs_post_recv cmd;
  1936. struct ib_uverbs_post_recv_resp resp;
  1937. struct ib_recv_wr *wr, *next;
  1938. const struct ib_recv_wr *bad_wr;
  1939. struct ib_qp *qp;
  1940. int ret, ret2;
  1941. struct uverbs_req_iter iter;
  1942. ret = uverbs_request_start(attrs, &iter, &cmd, sizeof(cmd));
  1943. if (ret)
  1944. return ret;
  1945. wr = ib_uverbs_unmarshall_recv(&iter, cmd.wr_count, cmd.wqe_size,
  1946. cmd.sge_count);
  1947. if (IS_ERR(wr))
  1948. return PTR_ERR(wr);
  1949. qp = uobj_get_obj_read(qp, UVERBS_OBJECT_QP, cmd.qp_handle, attrs);
  1950. if (IS_ERR(qp)) {
  1951. ret = PTR_ERR(qp);
  1952. goto out;
  1953. }
  1954. resp.bad_wr = 0;
  1955. ret = qp->device->ops.post_recv(qp->real_qp, wr, &bad_wr);
  1956. rdma_lookup_put_uobject(&qp->uobject->uevent.uobject,
  1957. UVERBS_LOOKUP_READ);
  1958. if (ret) {
  1959. for (next = wr; next; next = next->next) {
  1960. ++resp.bad_wr;
  1961. if (next == bad_wr)
  1962. break;
  1963. }
  1964. }
  1965. ret2 = uverbs_response(attrs, &resp, sizeof(resp));
  1966. if (ret2)
  1967. ret = ret2;
  1968. out:
  1969. while (wr) {
  1970. next = wr->next;
  1971. kfree(wr);
  1972. wr = next;
  1973. }
  1974. return ret;
  1975. }
  1976. static int ib_uverbs_post_srq_recv(struct uverbs_attr_bundle *attrs)
  1977. {
  1978. struct ib_uverbs_post_srq_recv cmd;
  1979. struct ib_uverbs_post_srq_recv_resp resp;
  1980. struct ib_recv_wr *wr, *next;
  1981. const struct ib_recv_wr *bad_wr;
  1982. struct ib_srq *srq;
  1983. int ret, ret2;
  1984. struct uverbs_req_iter iter;
  1985. ret = uverbs_request_start(attrs, &iter, &cmd, sizeof(cmd));
  1986. if (ret)
  1987. return ret;
  1988. wr = ib_uverbs_unmarshall_recv(&iter, cmd.wr_count, cmd.wqe_size,
  1989. cmd.sge_count);
  1990. if (IS_ERR(wr))
  1991. return PTR_ERR(wr);
  1992. srq = uobj_get_obj_read(srq, UVERBS_OBJECT_SRQ, cmd.srq_handle, attrs);
  1993. if (IS_ERR(srq)) {
  1994. ret = PTR_ERR(srq);
  1995. goto out;
  1996. }
  1997. resp.bad_wr = 0;
  1998. ret = srq->device->ops.post_srq_recv(srq, wr, &bad_wr);
  1999. rdma_lookup_put_uobject(&srq->uobject->uevent.uobject,
  2000. UVERBS_LOOKUP_READ);
  2001. if (ret)
  2002. for (next = wr; next; next = next->next) {
  2003. ++resp.bad_wr;
  2004. if (next == bad_wr)
  2005. break;
  2006. }
  2007. ret2 = uverbs_response(attrs, &resp, sizeof(resp));
  2008. if (ret2)
  2009. ret = ret2;
  2010. out:
  2011. while (wr) {
  2012. next = wr->next;
  2013. kfree(wr);
  2014. wr = next;
  2015. }
  2016. return ret;
  2017. }
  2018. static int ib_uverbs_create_ah(struct uverbs_attr_bundle *attrs)
  2019. {
  2020. struct ib_uverbs_create_ah cmd;
  2021. struct ib_uverbs_create_ah_resp resp;
  2022. struct ib_uobject *uobj;
  2023. struct ib_pd *pd;
  2024. struct ib_ah *ah;
  2025. struct rdma_ah_attr attr = {};
  2026. int ret;
  2027. struct ib_device *ib_dev;
  2028. ret = uverbs_request(attrs, &cmd, sizeof(cmd));
  2029. if (ret)
  2030. return ret;
  2031. uobj = uobj_alloc(UVERBS_OBJECT_AH, attrs, &ib_dev);
  2032. if (IS_ERR(uobj))
  2033. return PTR_ERR(uobj);
  2034. if (!rdma_is_port_valid(ib_dev, cmd.attr.port_num)) {
  2035. ret = -EINVAL;
  2036. goto err;
  2037. }
  2038. pd = uobj_get_obj_read(pd, UVERBS_OBJECT_PD, cmd.pd_handle, attrs);
  2039. if (IS_ERR(pd)) {
  2040. ret = PTR_ERR(pd);
  2041. goto err;
  2042. }
  2043. attr.type = rdma_ah_find_type(ib_dev, cmd.attr.port_num);
  2044. rdma_ah_set_make_grd(&attr, false);
  2045. rdma_ah_set_dlid(&attr, cmd.attr.dlid);
  2046. rdma_ah_set_sl(&attr, cmd.attr.sl);
  2047. rdma_ah_set_path_bits(&attr, cmd.attr.src_path_bits);
  2048. rdma_ah_set_static_rate(&attr, cmd.attr.static_rate);
  2049. rdma_ah_set_port_num(&attr, cmd.attr.port_num);
  2050. if (cmd.attr.is_global) {
  2051. rdma_ah_set_grh(&attr, NULL, cmd.attr.grh.flow_label,
  2052. cmd.attr.grh.sgid_index,
  2053. cmd.attr.grh.hop_limit,
  2054. cmd.attr.grh.traffic_class);
  2055. rdma_ah_set_dgid_raw(&attr, cmd.attr.grh.dgid);
  2056. } else {
  2057. rdma_ah_set_ah_flags(&attr, 0);
  2058. }
  2059. ah = rdma_create_user_ah(pd, &attr, &attrs->driver_udata);
  2060. if (IS_ERR(ah)) {
  2061. ret = PTR_ERR(ah);
  2062. goto err_put;
  2063. }
  2064. ah->uobject = uobj;
  2065. uobj->user_handle = cmd.user_handle;
  2066. uobj->object = ah;
  2067. uobj_put_obj_read(pd);
  2068. uobj_finalize_uobj_create(uobj, attrs);
  2069. resp.ah_handle = uobj->id;
  2070. return uverbs_response(attrs, &resp, sizeof(resp));
  2071. err_put:
  2072. uobj_put_obj_read(pd);
  2073. err:
  2074. uobj_alloc_abort(uobj, attrs);
  2075. return ret;
  2076. }
  2077. static int ib_uverbs_destroy_ah(struct uverbs_attr_bundle *attrs)
  2078. {
  2079. struct ib_uverbs_destroy_ah cmd;
  2080. int ret;
  2081. ret = uverbs_request(attrs, &cmd, sizeof(cmd));
  2082. if (ret)
  2083. return ret;
  2084. return uobj_perform_destroy(UVERBS_OBJECT_AH, cmd.ah_handle, attrs);
  2085. }
  2086. static int ib_uverbs_attach_mcast(struct uverbs_attr_bundle *attrs)
  2087. {
  2088. struct ib_uverbs_attach_mcast cmd;
  2089. struct ib_qp *qp;
  2090. struct ib_uqp_object *obj;
  2091. struct ib_uverbs_mcast_entry *mcast;
  2092. int ret;
  2093. ret = uverbs_request(attrs, &cmd, sizeof(cmd));
  2094. if (ret)
  2095. return ret;
  2096. qp = uobj_get_obj_read(qp, UVERBS_OBJECT_QP, cmd.qp_handle, attrs);
  2097. if (IS_ERR(qp))
  2098. return PTR_ERR(qp);
  2099. obj = qp->uobject;
  2100. mutex_lock(&obj->mcast_lock);
  2101. list_for_each_entry(mcast, &obj->mcast_list, list)
  2102. if (cmd.mlid == mcast->lid &&
  2103. !memcmp(cmd.gid, mcast->gid.raw, sizeof mcast->gid.raw)) {
  2104. ret = 0;
  2105. goto out_put;
  2106. }
  2107. mcast = kmalloc(sizeof *mcast, GFP_KERNEL);
  2108. if (!mcast) {
  2109. ret = -ENOMEM;
  2110. goto out_put;
  2111. }
  2112. mcast->lid = cmd.mlid;
  2113. memcpy(mcast->gid.raw, cmd.gid, sizeof mcast->gid.raw);
  2114. ret = ib_attach_mcast(qp, &mcast->gid, cmd.mlid);
  2115. if (!ret)
  2116. list_add_tail(&mcast->list, &obj->mcast_list);
  2117. else
  2118. kfree(mcast);
  2119. out_put:
  2120. mutex_unlock(&obj->mcast_lock);
  2121. rdma_lookup_put_uobject(&qp->uobject->uevent.uobject,
  2122. UVERBS_LOOKUP_READ);
  2123. return ret;
  2124. }
  2125. static int ib_uverbs_detach_mcast(struct uverbs_attr_bundle *attrs)
  2126. {
  2127. struct ib_uverbs_detach_mcast cmd;
  2128. struct ib_uqp_object *obj;
  2129. struct ib_qp *qp;
  2130. struct ib_uverbs_mcast_entry *mcast;
  2131. int ret;
  2132. bool found = false;
  2133. ret = uverbs_request(attrs, &cmd, sizeof(cmd));
  2134. if (ret)
  2135. return ret;
  2136. qp = uobj_get_obj_read(qp, UVERBS_OBJECT_QP, cmd.qp_handle, attrs);
  2137. if (IS_ERR(qp))
  2138. return PTR_ERR(qp);
  2139. obj = qp->uobject;
  2140. mutex_lock(&obj->mcast_lock);
  2141. list_for_each_entry(mcast, &obj->mcast_list, list)
  2142. if (cmd.mlid == mcast->lid &&
  2143. !memcmp(cmd.gid, mcast->gid.raw, sizeof mcast->gid.raw)) {
  2144. list_del(&mcast->list);
  2145. kfree(mcast);
  2146. found = true;
  2147. break;
  2148. }
  2149. if (!found) {
  2150. ret = -EINVAL;
  2151. goto out_put;
  2152. }
  2153. ret = ib_detach_mcast(qp, (union ib_gid *)cmd.gid, cmd.mlid);
  2154. out_put:
  2155. mutex_unlock(&obj->mcast_lock);
  2156. rdma_lookup_put_uobject(&qp->uobject->uevent.uobject,
  2157. UVERBS_LOOKUP_READ);
  2158. return ret;
  2159. }
  2160. struct ib_uflow_resources *flow_resources_alloc(size_t num_specs)
  2161. {
  2162. struct ib_uflow_resources *resources;
  2163. resources = kzalloc(sizeof(*resources), GFP_KERNEL);
  2164. if (!resources)
  2165. return NULL;
  2166. if (!num_specs)
  2167. goto out;
  2168. resources->counters =
  2169. kcalloc(num_specs, sizeof(*resources->counters), GFP_KERNEL);
  2170. resources->collection =
  2171. kcalloc(num_specs, sizeof(*resources->collection), GFP_KERNEL);
  2172. if (!resources->counters || !resources->collection)
  2173. goto err;
  2174. out:
  2175. resources->max = num_specs;
  2176. return resources;
  2177. err:
  2178. kfree(resources->counters);
  2179. kfree(resources);
  2180. return NULL;
  2181. }
  2182. EXPORT_SYMBOL(flow_resources_alloc);
  2183. void ib_uverbs_flow_resources_free(struct ib_uflow_resources *uflow_res)
  2184. {
  2185. unsigned int i;
  2186. if (!uflow_res)
  2187. return;
  2188. for (i = 0; i < uflow_res->collection_num; i++)
  2189. atomic_dec(&uflow_res->collection[i]->usecnt);
  2190. for (i = 0; i < uflow_res->counters_num; i++)
  2191. atomic_dec(&uflow_res->counters[i]->usecnt);
  2192. kfree(uflow_res->collection);
  2193. kfree(uflow_res->counters);
  2194. kfree(uflow_res);
  2195. }
  2196. EXPORT_SYMBOL(ib_uverbs_flow_resources_free);
  2197. void flow_resources_add(struct ib_uflow_resources *uflow_res,
  2198. enum ib_flow_spec_type type,
  2199. void *ibobj)
  2200. {
  2201. WARN_ON(uflow_res->num >= uflow_res->max);
  2202. switch (type) {
  2203. case IB_FLOW_SPEC_ACTION_HANDLE:
  2204. atomic_inc(&((struct ib_flow_action *)ibobj)->usecnt);
  2205. uflow_res->collection[uflow_res->collection_num++] =
  2206. (struct ib_flow_action *)ibobj;
  2207. break;
  2208. case IB_FLOW_SPEC_ACTION_COUNT:
  2209. atomic_inc(&((struct ib_counters *)ibobj)->usecnt);
  2210. uflow_res->counters[uflow_res->counters_num++] =
  2211. (struct ib_counters *)ibobj;
  2212. break;
  2213. default:
  2214. WARN_ON(1);
  2215. }
  2216. uflow_res->num++;
  2217. }
  2218. EXPORT_SYMBOL(flow_resources_add);
  2219. static int kern_spec_to_ib_spec_action(struct uverbs_attr_bundle *attrs,
  2220. struct ib_uverbs_flow_spec *kern_spec,
  2221. union ib_flow_spec *ib_spec,
  2222. struct ib_uflow_resources *uflow_res)
  2223. {
  2224. ib_spec->type = kern_spec->type;
  2225. switch (ib_spec->type) {
  2226. case IB_FLOW_SPEC_ACTION_TAG:
  2227. if (kern_spec->flow_tag.size !=
  2228. sizeof(struct ib_uverbs_flow_spec_action_tag))
  2229. return -EINVAL;
  2230. ib_spec->flow_tag.size = sizeof(struct ib_flow_spec_action_tag);
  2231. ib_spec->flow_tag.tag_id = kern_spec->flow_tag.tag_id;
  2232. break;
  2233. case IB_FLOW_SPEC_ACTION_DROP:
  2234. if (kern_spec->drop.size !=
  2235. sizeof(struct ib_uverbs_flow_spec_action_drop))
  2236. return -EINVAL;
  2237. ib_spec->drop.size = sizeof(struct ib_flow_spec_action_drop);
  2238. break;
  2239. case IB_FLOW_SPEC_ACTION_HANDLE:
  2240. if (kern_spec->action.size !=
  2241. sizeof(struct ib_uverbs_flow_spec_action_handle))
  2242. return -EOPNOTSUPP;
  2243. ib_spec->action.act = uobj_get_obj_read(flow_action,
  2244. UVERBS_OBJECT_FLOW_ACTION,
  2245. kern_spec->action.handle,
  2246. attrs);
  2247. if (IS_ERR(ib_spec->action.act))
  2248. return PTR_ERR(ib_spec->action.act);
  2249. ib_spec->action.size =
  2250. sizeof(struct ib_flow_spec_action_handle);
  2251. flow_resources_add(uflow_res,
  2252. IB_FLOW_SPEC_ACTION_HANDLE,
  2253. ib_spec->action.act);
  2254. uobj_put_obj_read(ib_spec->action.act);
  2255. break;
  2256. case IB_FLOW_SPEC_ACTION_COUNT:
  2257. if (kern_spec->flow_count.size !=
  2258. sizeof(struct ib_uverbs_flow_spec_action_count))
  2259. return -EINVAL;
  2260. ib_spec->flow_count.counters =
  2261. uobj_get_obj_read(counters,
  2262. UVERBS_OBJECT_COUNTERS,
  2263. kern_spec->flow_count.handle,
  2264. attrs);
  2265. if (IS_ERR(ib_spec->flow_count.counters))
  2266. return PTR_ERR(ib_spec->flow_count.counters);
  2267. ib_spec->flow_count.size =
  2268. sizeof(struct ib_flow_spec_action_count);
  2269. flow_resources_add(uflow_res,
  2270. IB_FLOW_SPEC_ACTION_COUNT,
  2271. ib_spec->flow_count.counters);
  2272. uobj_put_obj_read(ib_spec->flow_count.counters);
  2273. break;
  2274. default:
  2275. return -EINVAL;
  2276. }
  2277. return 0;
  2278. }
  2279. static ssize_t spec_filter_size(const void *kern_spec_filter, u16 kern_filter_size,
  2280. u16 ib_real_filter_sz)
  2281. {
  2282. /*
  2283. * User space filter structures must be 64 bit aligned, otherwise this
  2284. * may pass, but we won't handle additional new attributes.
  2285. */
  2286. if (kern_filter_size > ib_real_filter_sz) {
  2287. if (memchr_inv(kern_spec_filter +
  2288. ib_real_filter_sz, 0,
  2289. kern_filter_size - ib_real_filter_sz))
  2290. return -EINVAL;
  2291. return ib_real_filter_sz;
  2292. }
  2293. return kern_filter_size;
  2294. }
  2295. int ib_uverbs_kern_spec_to_ib_spec_filter(enum ib_flow_spec_type type,
  2296. const void *kern_spec_mask,
  2297. const void *kern_spec_val,
  2298. size_t kern_filter_sz,
  2299. union ib_flow_spec *ib_spec)
  2300. {
  2301. ssize_t actual_filter_sz;
  2302. ssize_t ib_filter_sz;
  2303. /* User flow spec size must be aligned to 4 bytes */
  2304. if (kern_filter_sz != ALIGN(kern_filter_sz, 4))
  2305. return -EINVAL;
  2306. ib_spec->type = type;
  2307. if (ib_spec->type == (IB_FLOW_SPEC_INNER | IB_FLOW_SPEC_VXLAN_TUNNEL))
  2308. return -EINVAL;
  2309. switch (ib_spec->type & ~IB_FLOW_SPEC_INNER) {
  2310. case IB_FLOW_SPEC_ETH:
  2311. ib_filter_sz = sizeof(struct ib_flow_eth_filter);
  2312. actual_filter_sz = spec_filter_size(kern_spec_mask,
  2313. kern_filter_sz,
  2314. ib_filter_sz);
  2315. if (actual_filter_sz <= 0)
  2316. return -EINVAL;
  2317. ib_spec->size = sizeof(struct ib_flow_spec_eth);
  2318. memcpy(&ib_spec->eth.val, kern_spec_val, actual_filter_sz);
  2319. memcpy(&ib_spec->eth.mask, kern_spec_mask, actual_filter_sz);
  2320. break;
  2321. case IB_FLOW_SPEC_IPV4:
  2322. ib_filter_sz = sizeof(struct ib_flow_ipv4_filter);
  2323. actual_filter_sz = spec_filter_size(kern_spec_mask,
  2324. kern_filter_sz,
  2325. ib_filter_sz);
  2326. if (actual_filter_sz <= 0)
  2327. return -EINVAL;
  2328. ib_spec->size = sizeof(struct ib_flow_spec_ipv4);
  2329. memcpy(&ib_spec->ipv4.val, kern_spec_val, actual_filter_sz);
  2330. memcpy(&ib_spec->ipv4.mask, kern_spec_mask, actual_filter_sz);
  2331. break;
  2332. case IB_FLOW_SPEC_IPV6:
  2333. ib_filter_sz = sizeof(struct ib_flow_ipv6_filter);
  2334. actual_filter_sz = spec_filter_size(kern_spec_mask,
  2335. kern_filter_sz,
  2336. ib_filter_sz);
  2337. if (actual_filter_sz <= 0)
  2338. return -EINVAL;
  2339. ib_spec->size = sizeof(struct ib_flow_spec_ipv6);
  2340. memcpy(&ib_spec->ipv6.val, kern_spec_val, actual_filter_sz);
  2341. memcpy(&ib_spec->ipv6.mask, kern_spec_mask, actual_filter_sz);
  2342. if ((ntohl(ib_spec->ipv6.mask.flow_label)) >= BIT(20) ||
  2343. (ntohl(ib_spec->ipv6.val.flow_label)) >= BIT(20))
  2344. return -EINVAL;
  2345. break;
  2346. case IB_FLOW_SPEC_TCP:
  2347. case IB_FLOW_SPEC_UDP:
  2348. ib_filter_sz = sizeof(struct ib_flow_tcp_udp_filter);
  2349. actual_filter_sz = spec_filter_size(kern_spec_mask,
  2350. kern_filter_sz,
  2351. ib_filter_sz);
  2352. if (actual_filter_sz <= 0)
  2353. return -EINVAL;
  2354. ib_spec->size = sizeof(struct ib_flow_spec_tcp_udp);
  2355. memcpy(&ib_spec->tcp_udp.val, kern_spec_val, actual_filter_sz);
  2356. memcpy(&ib_spec->tcp_udp.mask, kern_spec_mask, actual_filter_sz);
  2357. break;
  2358. case IB_FLOW_SPEC_VXLAN_TUNNEL:
  2359. ib_filter_sz = sizeof(struct ib_flow_tunnel_filter);
  2360. actual_filter_sz = spec_filter_size(kern_spec_mask,
  2361. kern_filter_sz,
  2362. ib_filter_sz);
  2363. if (actual_filter_sz <= 0)
  2364. return -EINVAL;
  2365. ib_spec->tunnel.size = sizeof(struct ib_flow_spec_tunnel);
  2366. memcpy(&ib_spec->tunnel.val, kern_spec_val, actual_filter_sz);
  2367. memcpy(&ib_spec->tunnel.mask, kern_spec_mask, actual_filter_sz);
  2368. if ((ntohl(ib_spec->tunnel.mask.tunnel_id)) >= BIT(24) ||
  2369. (ntohl(ib_spec->tunnel.val.tunnel_id)) >= BIT(24))
  2370. return -EINVAL;
  2371. break;
  2372. case IB_FLOW_SPEC_ESP:
  2373. ib_filter_sz = sizeof(struct ib_flow_esp_filter);
  2374. actual_filter_sz = spec_filter_size(kern_spec_mask,
  2375. kern_filter_sz,
  2376. ib_filter_sz);
  2377. if (actual_filter_sz <= 0)
  2378. return -EINVAL;
  2379. ib_spec->esp.size = sizeof(struct ib_flow_spec_esp);
  2380. memcpy(&ib_spec->esp.val, kern_spec_val, actual_filter_sz);
  2381. memcpy(&ib_spec->esp.mask, kern_spec_mask, actual_filter_sz);
  2382. break;
  2383. case IB_FLOW_SPEC_GRE:
  2384. ib_filter_sz = sizeof(struct ib_flow_gre_filter);
  2385. actual_filter_sz = spec_filter_size(kern_spec_mask,
  2386. kern_filter_sz,
  2387. ib_filter_sz);
  2388. if (actual_filter_sz <= 0)
  2389. return -EINVAL;
  2390. ib_spec->gre.size = sizeof(struct ib_flow_spec_gre);
  2391. memcpy(&ib_spec->gre.val, kern_spec_val, actual_filter_sz);
  2392. memcpy(&ib_spec->gre.mask, kern_spec_mask, actual_filter_sz);
  2393. break;
  2394. case IB_FLOW_SPEC_MPLS:
  2395. ib_filter_sz = sizeof(struct ib_flow_mpls_filter);
  2396. actual_filter_sz = spec_filter_size(kern_spec_mask,
  2397. kern_filter_sz,
  2398. ib_filter_sz);
  2399. if (actual_filter_sz <= 0)
  2400. return -EINVAL;
  2401. ib_spec->mpls.size = sizeof(struct ib_flow_spec_mpls);
  2402. memcpy(&ib_spec->mpls.val, kern_spec_val, actual_filter_sz);
  2403. memcpy(&ib_spec->mpls.mask, kern_spec_mask, actual_filter_sz);
  2404. break;
  2405. default:
  2406. return -EINVAL;
  2407. }
  2408. return 0;
  2409. }
  2410. static int kern_spec_to_ib_spec_filter(struct ib_uverbs_flow_spec *kern_spec,
  2411. union ib_flow_spec *ib_spec)
  2412. {
  2413. size_t kern_filter_sz;
  2414. void *kern_spec_mask;
  2415. void *kern_spec_val;
  2416. if (check_sub_overflow((size_t)kern_spec->hdr.size,
  2417. sizeof(struct ib_uverbs_flow_spec_hdr),
  2418. &kern_filter_sz))
  2419. return -EINVAL;
  2420. kern_filter_sz /= 2;
  2421. kern_spec_val = (void *)kern_spec +
  2422. sizeof(struct ib_uverbs_flow_spec_hdr);
  2423. kern_spec_mask = kern_spec_val + kern_filter_sz;
  2424. return ib_uverbs_kern_spec_to_ib_spec_filter(kern_spec->type,
  2425. kern_spec_mask,
  2426. kern_spec_val,
  2427. kern_filter_sz, ib_spec);
  2428. }
  2429. static int kern_spec_to_ib_spec(struct uverbs_attr_bundle *attrs,
  2430. struct ib_uverbs_flow_spec *kern_spec,
  2431. union ib_flow_spec *ib_spec,
  2432. struct ib_uflow_resources *uflow_res)
  2433. {
  2434. if (kern_spec->reserved)
  2435. return -EINVAL;
  2436. if (kern_spec->type >= IB_FLOW_SPEC_ACTION_TAG)
  2437. return kern_spec_to_ib_spec_action(attrs, kern_spec, ib_spec,
  2438. uflow_res);
  2439. else
  2440. return kern_spec_to_ib_spec_filter(kern_spec, ib_spec);
  2441. }
  2442. static int ib_uverbs_ex_create_wq(struct uverbs_attr_bundle *attrs)
  2443. {
  2444. struct ib_uverbs_ex_create_wq cmd;
  2445. struct ib_uverbs_ex_create_wq_resp resp = {};
  2446. struct ib_uwq_object *obj;
  2447. int err = 0;
  2448. struct ib_cq *cq;
  2449. struct ib_pd *pd;
  2450. struct ib_wq *wq;
  2451. struct ib_wq_init_attr wq_init_attr = {};
  2452. struct ib_device *ib_dev;
  2453. err = uverbs_request(attrs, &cmd, sizeof(cmd));
  2454. if (err)
  2455. return err;
  2456. if (cmd.comp_mask)
  2457. return -EOPNOTSUPP;
  2458. obj = (struct ib_uwq_object *)uobj_alloc(UVERBS_OBJECT_WQ, attrs,
  2459. &ib_dev);
  2460. if (IS_ERR(obj))
  2461. return PTR_ERR(obj);
  2462. pd = uobj_get_obj_read(pd, UVERBS_OBJECT_PD, cmd.pd_handle, attrs);
  2463. if (IS_ERR(pd)) {
  2464. err = PTR_ERR(pd);
  2465. goto err_uobj;
  2466. }
  2467. cq = uobj_get_obj_read(cq, UVERBS_OBJECT_CQ, cmd.cq_handle, attrs);
  2468. if (IS_ERR(cq)) {
  2469. err = PTR_ERR(cq);
  2470. goto err_put_pd;
  2471. }
  2472. wq_init_attr.cq = cq;
  2473. wq_init_attr.max_sge = cmd.max_sge;
  2474. wq_init_attr.max_wr = cmd.max_wr;
  2475. wq_init_attr.wq_type = cmd.wq_type;
  2476. wq_init_attr.event_handler = ib_uverbs_wq_event_handler;
  2477. wq_init_attr.create_flags = cmd.create_flags;
  2478. INIT_LIST_HEAD(&obj->uevent.event_list);
  2479. obj->uevent.uobject.user_handle = cmd.user_handle;
  2480. wq = pd->device->ops.create_wq(pd, &wq_init_attr, &attrs->driver_udata);
  2481. if (IS_ERR(wq)) {
  2482. err = PTR_ERR(wq);
  2483. goto err_put_cq;
  2484. }
  2485. wq->uobject = obj;
  2486. obj->uevent.uobject.object = wq;
  2487. wq->wq_type = wq_init_attr.wq_type;
  2488. wq->cq = cq;
  2489. wq->pd = pd;
  2490. wq->device = pd->device;
  2491. atomic_set(&wq->usecnt, 0);
  2492. atomic_inc(&pd->usecnt);
  2493. atomic_inc(&cq->usecnt);
  2494. obj->uevent.event_file = READ_ONCE(attrs->ufile->default_async_file);
  2495. if (obj->uevent.event_file)
  2496. uverbs_uobject_get(&obj->uevent.event_file->uobj);
  2497. uobj_put_obj_read(pd);
  2498. rdma_lookup_put_uobject(&cq->uobject->uevent.uobject,
  2499. UVERBS_LOOKUP_READ);
  2500. uobj_finalize_uobj_create(&obj->uevent.uobject, attrs);
  2501. resp.wq_handle = obj->uevent.uobject.id;
  2502. resp.max_sge = wq_init_attr.max_sge;
  2503. resp.max_wr = wq_init_attr.max_wr;
  2504. resp.wqn = wq->wq_num;
  2505. resp.response_length = uverbs_response_length(attrs, sizeof(resp));
  2506. return uverbs_response(attrs, &resp, sizeof(resp));
  2507. err_put_cq:
  2508. rdma_lookup_put_uobject(&cq->uobject->uevent.uobject,
  2509. UVERBS_LOOKUP_READ);
  2510. err_put_pd:
  2511. uobj_put_obj_read(pd);
  2512. err_uobj:
  2513. uobj_alloc_abort(&obj->uevent.uobject, attrs);
  2514. return err;
  2515. }
  2516. static int ib_uverbs_ex_destroy_wq(struct uverbs_attr_bundle *attrs)
  2517. {
  2518. struct ib_uverbs_ex_destroy_wq cmd;
  2519. struct ib_uverbs_ex_destroy_wq_resp resp = {};
  2520. struct ib_uobject *uobj;
  2521. struct ib_uwq_object *obj;
  2522. int ret;
  2523. ret = uverbs_request(attrs, &cmd, sizeof(cmd));
  2524. if (ret)
  2525. return ret;
  2526. if (cmd.comp_mask)
  2527. return -EOPNOTSUPP;
  2528. resp.response_length = uverbs_response_length(attrs, sizeof(resp));
  2529. uobj = uobj_get_destroy(UVERBS_OBJECT_WQ, cmd.wq_handle, attrs);
  2530. if (IS_ERR(uobj))
  2531. return PTR_ERR(uobj);
  2532. obj = container_of(uobj, struct ib_uwq_object, uevent.uobject);
  2533. resp.events_reported = obj->uevent.events_reported;
  2534. uobj_put_destroy(uobj);
  2535. return uverbs_response(attrs, &resp, sizeof(resp));
  2536. }
  2537. static int ib_uverbs_ex_modify_wq(struct uverbs_attr_bundle *attrs)
  2538. {
  2539. struct ib_uverbs_ex_modify_wq cmd;
  2540. struct ib_wq *wq;
  2541. struct ib_wq_attr wq_attr = {};
  2542. int ret;
  2543. ret = uverbs_request(attrs, &cmd, sizeof(cmd));
  2544. if (ret)
  2545. return ret;
  2546. if (!cmd.attr_mask)
  2547. return -EINVAL;
  2548. if (cmd.attr_mask > (IB_WQ_STATE | IB_WQ_CUR_STATE | IB_WQ_FLAGS))
  2549. return -EINVAL;
  2550. wq = uobj_get_obj_read(wq, UVERBS_OBJECT_WQ, cmd.wq_handle, attrs);
  2551. if (IS_ERR(wq))
  2552. return PTR_ERR(wq);
  2553. if (cmd.attr_mask & IB_WQ_FLAGS) {
  2554. wq_attr.flags = cmd.flags;
  2555. wq_attr.flags_mask = cmd.flags_mask;
  2556. }
  2557. if (cmd.attr_mask & IB_WQ_CUR_STATE) {
  2558. if (cmd.curr_wq_state > IB_WQS_ERR)
  2559. return -EINVAL;
  2560. wq_attr.curr_wq_state = cmd.curr_wq_state;
  2561. } else {
  2562. wq_attr.curr_wq_state = wq->state;
  2563. }
  2564. if (cmd.attr_mask & IB_WQ_STATE) {
  2565. if (cmd.wq_state > IB_WQS_ERR)
  2566. return -EINVAL;
  2567. wq_attr.wq_state = cmd.wq_state;
  2568. } else {
  2569. wq_attr.wq_state = wq_attr.curr_wq_state;
  2570. }
  2571. ret = wq->device->ops.modify_wq(wq, &wq_attr, cmd.attr_mask,
  2572. &attrs->driver_udata);
  2573. rdma_lookup_put_uobject(&wq->uobject->uevent.uobject,
  2574. UVERBS_LOOKUP_READ);
  2575. return ret;
  2576. }
  2577. static int ib_uverbs_ex_create_rwq_ind_table(struct uverbs_attr_bundle *attrs)
  2578. {
  2579. struct ib_uverbs_ex_create_rwq_ind_table cmd;
  2580. struct ib_uverbs_ex_create_rwq_ind_table_resp resp = {};
  2581. struct ib_uobject *uobj;
  2582. int err;
  2583. struct ib_rwq_ind_table_init_attr init_attr = {};
  2584. struct ib_rwq_ind_table *rwq_ind_tbl;
  2585. struct ib_wq **wqs = NULL;
  2586. u32 *wqs_handles = NULL;
  2587. struct ib_wq *wq = NULL;
  2588. int i, num_read_wqs;
  2589. u32 num_wq_handles;
  2590. struct uverbs_req_iter iter;
  2591. struct ib_device *ib_dev;
  2592. err = uverbs_request_start(attrs, &iter, &cmd, sizeof(cmd));
  2593. if (err)
  2594. return err;
  2595. if (cmd.comp_mask)
  2596. return -EOPNOTSUPP;
  2597. if (cmd.log_ind_tbl_size > IB_USER_VERBS_MAX_LOG_IND_TBL_SIZE)
  2598. return -EINVAL;
  2599. num_wq_handles = 1 << cmd.log_ind_tbl_size;
  2600. wqs_handles = kcalloc(num_wq_handles, sizeof(*wqs_handles),
  2601. GFP_KERNEL);
  2602. if (!wqs_handles)
  2603. return -ENOMEM;
  2604. err = uverbs_request_next(&iter, wqs_handles,
  2605. num_wq_handles * sizeof(__u32));
  2606. if (err)
  2607. goto err_free;
  2608. err = uverbs_request_finish(&iter);
  2609. if (err)
  2610. goto err_free;
  2611. wqs = kcalloc(num_wq_handles, sizeof(*wqs), GFP_KERNEL);
  2612. if (!wqs) {
  2613. err = -ENOMEM;
  2614. goto err_free;
  2615. }
  2616. for (num_read_wqs = 0; num_read_wqs < num_wq_handles;
  2617. num_read_wqs++) {
  2618. wq = uobj_get_obj_read(wq, UVERBS_OBJECT_WQ,
  2619. wqs_handles[num_read_wqs], attrs);
  2620. if (IS_ERR(wq)) {
  2621. err = PTR_ERR(wq);
  2622. goto put_wqs;
  2623. }
  2624. wqs[num_read_wqs] = wq;
  2625. atomic_inc(&wqs[num_read_wqs]->usecnt);
  2626. }
  2627. uobj = uobj_alloc(UVERBS_OBJECT_RWQ_IND_TBL, attrs, &ib_dev);
  2628. if (IS_ERR(uobj)) {
  2629. err = PTR_ERR(uobj);
  2630. goto put_wqs;
  2631. }
  2632. rwq_ind_tbl = rdma_zalloc_drv_obj(ib_dev, ib_rwq_ind_table);
  2633. if (!rwq_ind_tbl) {
  2634. err = -ENOMEM;
  2635. goto err_uobj;
  2636. }
  2637. init_attr.log_ind_tbl_size = cmd.log_ind_tbl_size;
  2638. init_attr.ind_tbl = wqs;
  2639. rwq_ind_tbl->ind_tbl = wqs;
  2640. rwq_ind_tbl->log_ind_tbl_size = init_attr.log_ind_tbl_size;
  2641. rwq_ind_tbl->uobject = uobj;
  2642. uobj->object = rwq_ind_tbl;
  2643. rwq_ind_tbl->device = ib_dev;
  2644. atomic_set(&rwq_ind_tbl->usecnt, 0);
  2645. err = ib_dev->ops.create_rwq_ind_table(rwq_ind_tbl, &init_attr,
  2646. &attrs->driver_udata);
  2647. if (err)
  2648. goto err_create;
  2649. for (i = 0; i < num_wq_handles; i++)
  2650. rdma_lookup_put_uobject(&wqs[i]->uobject->uevent.uobject,
  2651. UVERBS_LOOKUP_READ);
  2652. kfree(wqs_handles);
  2653. uobj_finalize_uobj_create(uobj, attrs);
  2654. resp.ind_tbl_handle = uobj->id;
  2655. resp.ind_tbl_num = rwq_ind_tbl->ind_tbl_num;
  2656. resp.response_length = uverbs_response_length(attrs, sizeof(resp));
  2657. return uverbs_response(attrs, &resp, sizeof(resp));
  2658. err_create:
  2659. kfree(rwq_ind_tbl);
  2660. err_uobj:
  2661. uobj_alloc_abort(uobj, attrs);
  2662. put_wqs:
  2663. for (i = 0; i < num_read_wqs; i++) {
  2664. rdma_lookup_put_uobject(&wqs[i]->uobject->uevent.uobject,
  2665. UVERBS_LOOKUP_READ);
  2666. atomic_dec(&wqs[i]->usecnt);
  2667. }
  2668. err_free:
  2669. kfree(wqs_handles);
  2670. kfree(wqs);
  2671. return err;
  2672. }
  2673. static int ib_uverbs_ex_destroy_rwq_ind_table(struct uverbs_attr_bundle *attrs)
  2674. {
  2675. struct ib_uverbs_ex_destroy_rwq_ind_table cmd;
  2676. int ret;
  2677. ret = uverbs_request(attrs, &cmd, sizeof(cmd));
  2678. if (ret)
  2679. return ret;
  2680. if (cmd.comp_mask)
  2681. return -EOPNOTSUPP;
  2682. return uobj_perform_destroy(UVERBS_OBJECT_RWQ_IND_TBL,
  2683. cmd.ind_tbl_handle, attrs);
  2684. }
  2685. static int ib_uverbs_ex_create_flow(struct uverbs_attr_bundle *attrs)
  2686. {
  2687. struct ib_uverbs_create_flow cmd;
  2688. struct ib_uverbs_create_flow_resp resp = {};
  2689. struct ib_uobject *uobj;
  2690. struct ib_flow *flow_id;
  2691. struct ib_uverbs_flow_attr *kern_flow_attr;
  2692. struct ib_flow_attr *flow_attr;
  2693. struct ib_qp *qp;
  2694. struct ib_uflow_resources *uflow_res;
  2695. struct ib_uverbs_flow_spec_hdr *kern_spec;
  2696. struct uverbs_req_iter iter;
  2697. int err;
  2698. void *ib_spec;
  2699. int i;
  2700. struct ib_device *ib_dev;
  2701. err = uverbs_request_start(attrs, &iter, &cmd, sizeof(cmd));
  2702. if (err)
  2703. return err;
  2704. if (cmd.comp_mask)
  2705. return -EINVAL;
  2706. if (!capable(CAP_NET_RAW))
  2707. return -EPERM;
  2708. if (cmd.flow_attr.flags >= IB_FLOW_ATTR_FLAGS_RESERVED)
  2709. return -EINVAL;
  2710. if ((cmd.flow_attr.flags & IB_FLOW_ATTR_FLAGS_DONT_TRAP) &&
  2711. ((cmd.flow_attr.type == IB_FLOW_ATTR_ALL_DEFAULT) ||
  2712. (cmd.flow_attr.type == IB_FLOW_ATTR_MC_DEFAULT)))
  2713. return -EINVAL;
  2714. if (cmd.flow_attr.num_of_specs > IB_FLOW_SPEC_SUPPORT_LAYERS)
  2715. return -EINVAL;
  2716. if (cmd.flow_attr.size >
  2717. (cmd.flow_attr.num_of_specs * sizeof(struct ib_uverbs_flow_spec)))
  2718. return -EINVAL;
  2719. if (cmd.flow_attr.reserved[0] ||
  2720. cmd.flow_attr.reserved[1])
  2721. return -EINVAL;
  2722. if (cmd.flow_attr.num_of_specs) {
  2723. kern_flow_attr = kmalloc(sizeof(*kern_flow_attr) + cmd.flow_attr.size,
  2724. GFP_KERNEL);
  2725. if (!kern_flow_attr)
  2726. return -ENOMEM;
  2727. *kern_flow_attr = cmd.flow_attr;
  2728. err = uverbs_request_next(&iter, &kern_flow_attr->flow_specs,
  2729. cmd.flow_attr.size);
  2730. if (err)
  2731. goto err_free_attr;
  2732. } else {
  2733. kern_flow_attr = &cmd.flow_attr;
  2734. }
  2735. err = uverbs_request_finish(&iter);
  2736. if (err)
  2737. goto err_free_attr;
  2738. uobj = uobj_alloc(UVERBS_OBJECT_FLOW, attrs, &ib_dev);
  2739. if (IS_ERR(uobj)) {
  2740. err = PTR_ERR(uobj);
  2741. goto err_free_attr;
  2742. }
  2743. if (!rdma_is_port_valid(uobj->context->device, cmd.flow_attr.port)) {
  2744. err = -EINVAL;
  2745. goto err_uobj;
  2746. }
  2747. qp = uobj_get_obj_read(qp, UVERBS_OBJECT_QP, cmd.qp_handle, attrs);
  2748. if (IS_ERR(qp)) {
  2749. err = PTR_ERR(qp);
  2750. goto err_uobj;
  2751. }
  2752. if (qp->qp_type != IB_QPT_UD && qp->qp_type != IB_QPT_RAW_PACKET) {
  2753. err = -EINVAL;
  2754. goto err_put;
  2755. }
  2756. flow_attr = kzalloc(struct_size(flow_attr, flows,
  2757. cmd.flow_attr.num_of_specs), GFP_KERNEL);
  2758. if (!flow_attr) {
  2759. err = -ENOMEM;
  2760. goto err_put;
  2761. }
  2762. uflow_res = flow_resources_alloc(cmd.flow_attr.num_of_specs);
  2763. if (!uflow_res) {
  2764. err = -ENOMEM;
  2765. goto err_free_flow_attr;
  2766. }
  2767. flow_attr->type = kern_flow_attr->type;
  2768. flow_attr->priority = kern_flow_attr->priority;
  2769. flow_attr->num_of_specs = kern_flow_attr->num_of_specs;
  2770. flow_attr->port = kern_flow_attr->port;
  2771. flow_attr->flags = kern_flow_attr->flags;
  2772. flow_attr->size = sizeof(*flow_attr);
  2773. kern_spec = kern_flow_attr->flow_specs;
  2774. ib_spec = flow_attr + 1;
  2775. for (i = 0; i < flow_attr->num_of_specs &&
  2776. cmd.flow_attr.size >= sizeof(*kern_spec) &&
  2777. cmd.flow_attr.size >= kern_spec->size;
  2778. i++) {
  2779. err = kern_spec_to_ib_spec(
  2780. attrs, (struct ib_uverbs_flow_spec *)kern_spec,
  2781. ib_spec, uflow_res);
  2782. if (err)
  2783. goto err_free;
  2784. flow_attr->size +=
  2785. ((union ib_flow_spec *) ib_spec)->size;
  2786. cmd.flow_attr.size -= kern_spec->size;
  2787. kern_spec = ((void *)kern_spec) + kern_spec->size;
  2788. ib_spec += ((union ib_flow_spec *) ib_spec)->size;
  2789. }
  2790. if (cmd.flow_attr.size || (i != flow_attr->num_of_specs)) {
  2791. pr_warn("create flow failed, flow %d: %u bytes left from uverb cmd\n",
  2792. i, cmd.flow_attr.size);
  2793. err = -EINVAL;
  2794. goto err_free;
  2795. }
  2796. flow_id = qp->device->ops.create_flow(qp, flow_attr,
  2797. &attrs->driver_udata);
  2798. if (IS_ERR(flow_id)) {
  2799. err = PTR_ERR(flow_id);
  2800. goto err_free;
  2801. }
  2802. ib_set_flow(uobj, flow_id, qp, qp->device, uflow_res);
  2803. rdma_lookup_put_uobject(&qp->uobject->uevent.uobject,
  2804. UVERBS_LOOKUP_READ);
  2805. kfree(flow_attr);
  2806. if (cmd.flow_attr.num_of_specs)
  2807. kfree(kern_flow_attr);
  2808. uobj_finalize_uobj_create(uobj, attrs);
  2809. resp.flow_handle = uobj->id;
  2810. return uverbs_response(attrs, &resp, sizeof(resp));
  2811. err_free:
  2812. ib_uverbs_flow_resources_free(uflow_res);
  2813. err_free_flow_attr:
  2814. kfree(flow_attr);
  2815. err_put:
  2816. rdma_lookup_put_uobject(&qp->uobject->uevent.uobject,
  2817. UVERBS_LOOKUP_READ);
  2818. err_uobj:
  2819. uobj_alloc_abort(uobj, attrs);
  2820. err_free_attr:
  2821. if (cmd.flow_attr.num_of_specs)
  2822. kfree(kern_flow_attr);
  2823. return err;
  2824. }
  2825. static int ib_uverbs_ex_destroy_flow(struct uverbs_attr_bundle *attrs)
  2826. {
  2827. struct ib_uverbs_destroy_flow cmd;
  2828. int ret;
  2829. ret = uverbs_request(attrs, &cmd, sizeof(cmd));
  2830. if (ret)
  2831. return ret;
  2832. if (cmd.comp_mask)
  2833. return -EINVAL;
  2834. return uobj_perform_destroy(UVERBS_OBJECT_FLOW, cmd.flow_handle, attrs);
  2835. }
  2836. static int __uverbs_create_xsrq(struct uverbs_attr_bundle *attrs,
  2837. struct ib_uverbs_create_xsrq *cmd,
  2838. struct ib_udata *udata)
  2839. {
  2840. struct ib_uverbs_create_srq_resp resp = {};
  2841. struct ib_usrq_object *obj;
  2842. struct ib_pd *pd;
  2843. struct ib_srq *srq;
  2844. struct ib_srq_init_attr attr;
  2845. int ret;
  2846. struct ib_uobject *xrcd_uobj;
  2847. struct ib_device *ib_dev;
  2848. obj = (struct ib_usrq_object *)uobj_alloc(UVERBS_OBJECT_SRQ, attrs,
  2849. &ib_dev);
  2850. if (IS_ERR(obj))
  2851. return PTR_ERR(obj);
  2852. if (cmd->srq_type == IB_SRQT_TM)
  2853. attr.ext.tag_matching.max_num_tags = cmd->max_num_tags;
  2854. if (cmd->srq_type == IB_SRQT_XRC) {
  2855. xrcd_uobj = uobj_get_read(UVERBS_OBJECT_XRCD, cmd->xrcd_handle,
  2856. attrs);
  2857. if (IS_ERR(xrcd_uobj)) {
  2858. ret = -EINVAL;
  2859. goto err;
  2860. }
  2861. attr.ext.xrc.xrcd = (struct ib_xrcd *)xrcd_uobj->object;
  2862. if (!attr.ext.xrc.xrcd) {
  2863. ret = -EINVAL;
  2864. goto err_put_xrcd;
  2865. }
  2866. obj->uxrcd = container_of(xrcd_uobj, struct ib_uxrcd_object, uobject);
  2867. atomic_inc(&obj->uxrcd->refcnt);
  2868. }
  2869. if (ib_srq_has_cq(cmd->srq_type)) {
  2870. attr.ext.cq = uobj_get_obj_read(cq, UVERBS_OBJECT_CQ,
  2871. cmd->cq_handle, attrs);
  2872. if (IS_ERR(attr.ext.cq)) {
  2873. ret = PTR_ERR(attr.ext.cq);
  2874. goto err_put_xrcd;
  2875. }
  2876. }
  2877. pd = uobj_get_obj_read(pd, UVERBS_OBJECT_PD, cmd->pd_handle, attrs);
  2878. if (IS_ERR(pd)) {
  2879. ret = PTR_ERR(pd);
  2880. goto err_put_cq;
  2881. }
  2882. attr.event_handler = ib_uverbs_srq_event_handler;
  2883. attr.srq_type = cmd->srq_type;
  2884. attr.attr.max_wr = cmd->max_wr;
  2885. attr.attr.max_sge = cmd->max_sge;
  2886. attr.attr.srq_limit = cmd->srq_limit;
  2887. INIT_LIST_HEAD(&obj->uevent.event_list);
  2888. obj->uevent.uobject.user_handle = cmd->user_handle;
  2889. srq = ib_create_srq_user(pd, &attr, obj, udata);
  2890. if (IS_ERR(srq)) {
  2891. ret = PTR_ERR(srq);
  2892. goto err_put_pd;
  2893. }
  2894. obj->uevent.uobject.object = srq;
  2895. obj->uevent.uobject.user_handle = cmd->user_handle;
  2896. obj->uevent.event_file = READ_ONCE(attrs->ufile->default_async_file);
  2897. if (obj->uevent.event_file)
  2898. uverbs_uobject_get(&obj->uevent.event_file->uobj);
  2899. if (cmd->srq_type == IB_SRQT_XRC)
  2900. resp.srqn = srq->ext.xrc.srq_num;
  2901. if (cmd->srq_type == IB_SRQT_XRC)
  2902. uobj_put_read(xrcd_uobj);
  2903. if (ib_srq_has_cq(cmd->srq_type))
  2904. rdma_lookup_put_uobject(&attr.ext.cq->uobject->uevent.uobject,
  2905. UVERBS_LOOKUP_READ);
  2906. uobj_put_obj_read(pd);
  2907. uobj_finalize_uobj_create(&obj->uevent.uobject, attrs);
  2908. resp.srq_handle = obj->uevent.uobject.id;
  2909. resp.max_wr = attr.attr.max_wr;
  2910. resp.max_sge = attr.attr.max_sge;
  2911. return uverbs_response(attrs, &resp, sizeof(resp));
  2912. err_put_pd:
  2913. uobj_put_obj_read(pd);
  2914. err_put_cq:
  2915. if (ib_srq_has_cq(cmd->srq_type))
  2916. rdma_lookup_put_uobject(&attr.ext.cq->uobject->uevent.uobject,
  2917. UVERBS_LOOKUP_READ);
  2918. err_put_xrcd:
  2919. if (cmd->srq_type == IB_SRQT_XRC) {
  2920. atomic_dec(&obj->uxrcd->refcnt);
  2921. uobj_put_read(xrcd_uobj);
  2922. }
  2923. err:
  2924. uobj_alloc_abort(&obj->uevent.uobject, attrs);
  2925. return ret;
  2926. }
  2927. static int ib_uverbs_create_srq(struct uverbs_attr_bundle *attrs)
  2928. {
  2929. struct ib_uverbs_create_srq cmd;
  2930. struct ib_uverbs_create_xsrq xcmd;
  2931. int ret;
  2932. ret = uverbs_request(attrs, &cmd, sizeof(cmd));
  2933. if (ret)
  2934. return ret;
  2935. memset(&xcmd, 0, sizeof(xcmd));
  2936. xcmd.response = cmd.response;
  2937. xcmd.user_handle = cmd.user_handle;
  2938. xcmd.srq_type = IB_SRQT_BASIC;
  2939. xcmd.pd_handle = cmd.pd_handle;
  2940. xcmd.max_wr = cmd.max_wr;
  2941. xcmd.max_sge = cmd.max_sge;
  2942. xcmd.srq_limit = cmd.srq_limit;
  2943. return __uverbs_create_xsrq(attrs, &xcmd, &attrs->driver_udata);
  2944. }
  2945. static int ib_uverbs_create_xsrq(struct uverbs_attr_bundle *attrs)
  2946. {
  2947. struct ib_uverbs_create_xsrq cmd;
  2948. int ret;
  2949. ret = uverbs_request(attrs, &cmd, sizeof(cmd));
  2950. if (ret)
  2951. return ret;
  2952. return __uverbs_create_xsrq(attrs, &cmd, &attrs->driver_udata);
  2953. }
  2954. static int ib_uverbs_modify_srq(struct uverbs_attr_bundle *attrs)
  2955. {
  2956. struct ib_uverbs_modify_srq cmd;
  2957. struct ib_srq *srq;
  2958. struct ib_srq_attr attr;
  2959. int ret;
  2960. ret = uverbs_request(attrs, &cmd, sizeof(cmd));
  2961. if (ret)
  2962. return ret;
  2963. srq = uobj_get_obj_read(srq, UVERBS_OBJECT_SRQ, cmd.srq_handle, attrs);
  2964. if (IS_ERR(srq))
  2965. return PTR_ERR(srq);
  2966. attr.max_wr = cmd.max_wr;
  2967. attr.srq_limit = cmd.srq_limit;
  2968. ret = srq->device->ops.modify_srq(srq, &attr, cmd.attr_mask,
  2969. &attrs->driver_udata);
  2970. rdma_lookup_put_uobject(&srq->uobject->uevent.uobject,
  2971. UVERBS_LOOKUP_READ);
  2972. return ret;
  2973. }
  2974. static int ib_uverbs_query_srq(struct uverbs_attr_bundle *attrs)
  2975. {
  2976. struct ib_uverbs_query_srq cmd;
  2977. struct ib_uverbs_query_srq_resp resp;
  2978. struct ib_srq_attr attr;
  2979. struct ib_srq *srq;
  2980. int ret;
  2981. ret = uverbs_request(attrs, &cmd, sizeof(cmd));
  2982. if (ret)
  2983. return ret;
  2984. srq = uobj_get_obj_read(srq, UVERBS_OBJECT_SRQ, cmd.srq_handle, attrs);
  2985. if (IS_ERR(srq))
  2986. return PTR_ERR(srq);
  2987. ret = ib_query_srq(srq, &attr);
  2988. rdma_lookup_put_uobject(&srq->uobject->uevent.uobject,
  2989. UVERBS_LOOKUP_READ);
  2990. if (ret)
  2991. return ret;
  2992. memset(&resp, 0, sizeof resp);
  2993. resp.max_wr = attr.max_wr;
  2994. resp.max_sge = attr.max_sge;
  2995. resp.srq_limit = attr.srq_limit;
  2996. return uverbs_response(attrs, &resp, sizeof(resp));
  2997. }
  2998. static int ib_uverbs_destroy_srq(struct uverbs_attr_bundle *attrs)
  2999. {
  3000. struct ib_uverbs_destroy_srq cmd;
  3001. struct ib_uverbs_destroy_srq_resp resp;
  3002. struct ib_uobject *uobj;
  3003. struct ib_uevent_object *obj;
  3004. int ret;
  3005. ret = uverbs_request(attrs, &cmd, sizeof(cmd));
  3006. if (ret)
  3007. return ret;
  3008. uobj = uobj_get_destroy(UVERBS_OBJECT_SRQ, cmd.srq_handle, attrs);
  3009. if (IS_ERR(uobj))
  3010. return PTR_ERR(uobj);
  3011. obj = container_of(uobj, struct ib_uevent_object, uobject);
  3012. memset(&resp, 0, sizeof(resp));
  3013. resp.events_reported = obj->events_reported;
  3014. uobj_put_destroy(uobj);
  3015. return uverbs_response(attrs, &resp, sizeof(resp));
  3016. }
  3017. static int ib_uverbs_ex_query_device(struct uverbs_attr_bundle *attrs)
  3018. {
  3019. struct ib_uverbs_ex_query_device_resp resp = {};
  3020. struct ib_uverbs_ex_query_device cmd;
  3021. struct ib_device_attr attr = {0};
  3022. struct ib_ucontext *ucontext;
  3023. struct ib_device *ib_dev;
  3024. int err;
  3025. ucontext = ib_uverbs_get_ucontext(attrs);
  3026. if (IS_ERR(ucontext))
  3027. return PTR_ERR(ucontext);
  3028. ib_dev = ucontext->device;
  3029. err = uverbs_request(attrs, &cmd, sizeof(cmd));
  3030. if (err)
  3031. return err;
  3032. if (cmd.comp_mask)
  3033. return -EINVAL;
  3034. if (cmd.reserved)
  3035. return -EINVAL;
  3036. err = ib_dev->ops.query_device(ib_dev, &attr, &attrs->driver_udata);
  3037. if (err)
  3038. return err;
  3039. copy_query_dev_fields(ucontext, &resp.base, &attr);
  3040. resp.odp_caps.general_caps = attr.odp_caps.general_caps;
  3041. resp.odp_caps.per_transport_caps.rc_odp_caps =
  3042. attr.odp_caps.per_transport_caps.rc_odp_caps;
  3043. resp.odp_caps.per_transport_caps.uc_odp_caps =
  3044. attr.odp_caps.per_transport_caps.uc_odp_caps;
  3045. resp.odp_caps.per_transport_caps.ud_odp_caps =
  3046. attr.odp_caps.per_transport_caps.ud_odp_caps;
  3047. resp.xrc_odp_caps = attr.odp_caps.per_transport_caps.xrc_odp_caps;
  3048. resp.timestamp_mask = attr.timestamp_mask;
  3049. resp.hca_core_clock = attr.hca_core_clock;
  3050. resp.device_cap_flags_ex = attr.device_cap_flags;
  3051. resp.rss_caps.supported_qpts = attr.rss_caps.supported_qpts;
  3052. resp.rss_caps.max_rwq_indirection_tables =
  3053. attr.rss_caps.max_rwq_indirection_tables;
  3054. resp.rss_caps.max_rwq_indirection_table_size =
  3055. attr.rss_caps.max_rwq_indirection_table_size;
  3056. resp.max_wq_type_rq = attr.max_wq_type_rq;
  3057. resp.raw_packet_caps = attr.raw_packet_caps;
  3058. resp.tm_caps.max_rndv_hdr_size = attr.tm_caps.max_rndv_hdr_size;
  3059. resp.tm_caps.max_num_tags = attr.tm_caps.max_num_tags;
  3060. resp.tm_caps.max_ops = attr.tm_caps.max_ops;
  3061. resp.tm_caps.max_sge = attr.tm_caps.max_sge;
  3062. resp.tm_caps.flags = attr.tm_caps.flags;
  3063. resp.cq_moderation_caps.max_cq_moderation_count =
  3064. attr.cq_caps.max_cq_moderation_count;
  3065. resp.cq_moderation_caps.max_cq_moderation_period =
  3066. attr.cq_caps.max_cq_moderation_period;
  3067. resp.max_dm_size = attr.max_dm_size;
  3068. resp.response_length = uverbs_response_length(attrs, sizeof(resp));
  3069. return uverbs_response(attrs, &resp, sizeof(resp));
  3070. }
  3071. static int ib_uverbs_ex_modify_cq(struct uverbs_attr_bundle *attrs)
  3072. {
  3073. struct ib_uverbs_ex_modify_cq cmd;
  3074. struct ib_cq *cq;
  3075. int ret;
  3076. ret = uverbs_request(attrs, &cmd, sizeof(cmd));
  3077. if (ret)
  3078. return ret;
  3079. if (!cmd.attr_mask || cmd.reserved)
  3080. return -EINVAL;
  3081. if (cmd.attr_mask > IB_CQ_MODERATE)
  3082. return -EOPNOTSUPP;
  3083. cq = uobj_get_obj_read(cq, UVERBS_OBJECT_CQ, cmd.cq_handle, attrs);
  3084. if (IS_ERR(cq))
  3085. return PTR_ERR(cq);
  3086. ret = rdma_set_cq_moderation(cq, cmd.attr.cq_count, cmd.attr.cq_period);
  3087. rdma_lookup_put_uobject(&cq->uobject->uevent.uobject,
  3088. UVERBS_LOOKUP_READ);
  3089. return ret;
  3090. }
  3091. /*
  3092. * Describe the input structs for write(). Some write methods have an input
  3093. * only struct, most have an input and output. If the struct has an output then
  3094. * the 'response' u64 must be the first field in the request structure.
  3095. *
  3096. * If udata is present then both the request and response structs have a
  3097. * trailing driver_data flex array. In this case the size of the base struct
  3098. * cannot be changed.
  3099. */
  3100. #define UAPI_DEF_WRITE_IO(req, resp) \
  3101. .write.has_resp = 1 + \
  3102. BUILD_BUG_ON_ZERO(offsetof(req, response) != 0) + \
  3103. BUILD_BUG_ON_ZERO(sizeof_field(req, response) != \
  3104. sizeof(u64)), \
  3105. .write.req_size = sizeof(req), .write.resp_size = sizeof(resp)
  3106. #define UAPI_DEF_WRITE_I(req) .write.req_size = sizeof(req)
  3107. #define UAPI_DEF_WRITE_UDATA_IO(req, resp) \
  3108. UAPI_DEF_WRITE_IO(req, resp), \
  3109. .write.has_udata = \
  3110. 1 + \
  3111. BUILD_BUG_ON_ZERO(offsetof(req, driver_data) != \
  3112. sizeof(req)) + \
  3113. BUILD_BUG_ON_ZERO(offsetof(resp, driver_data) != \
  3114. sizeof(resp))
  3115. #define UAPI_DEF_WRITE_UDATA_I(req) \
  3116. UAPI_DEF_WRITE_I(req), \
  3117. .write.has_udata = \
  3118. 1 + BUILD_BUG_ON_ZERO(offsetof(req, driver_data) != \
  3119. sizeof(req))
  3120. /*
  3121. * The _EX versions are for use with WRITE_EX and allow the last struct member
  3122. * to be specified. Buffers that do not include that member will be rejected.
  3123. */
  3124. #define UAPI_DEF_WRITE_IO_EX(req, req_last_member, resp, resp_last_member) \
  3125. .write.has_resp = 1, \
  3126. .write.req_size = offsetofend(req, req_last_member), \
  3127. .write.resp_size = offsetofend(resp, resp_last_member)
  3128. #define UAPI_DEF_WRITE_I_EX(req, req_last_member) \
  3129. .write.req_size = offsetofend(req, req_last_member)
  3130. const struct uapi_definition uverbs_def_write_intf[] = {
  3131. DECLARE_UVERBS_OBJECT(
  3132. UVERBS_OBJECT_AH,
  3133. DECLARE_UVERBS_WRITE(IB_USER_VERBS_CMD_CREATE_AH,
  3134. ib_uverbs_create_ah,
  3135. UAPI_DEF_WRITE_UDATA_IO(
  3136. struct ib_uverbs_create_ah,
  3137. struct ib_uverbs_create_ah_resp)),
  3138. DECLARE_UVERBS_WRITE(
  3139. IB_USER_VERBS_CMD_DESTROY_AH,
  3140. ib_uverbs_destroy_ah,
  3141. UAPI_DEF_WRITE_I(struct ib_uverbs_destroy_ah)),
  3142. UAPI_DEF_OBJ_NEEDS_FN(create_user_ah),
  3143. UAPI_DEF_OBJ_NEEDS_FN(destroy_ah)),
  3144. DECLARE_UVERBS_OBJECT(
  3145. UVERBS_OBJECT_COMP_CHANNEL,
  3146. DECLARE_UVERBS_WRITE(
  3147. IB_USER_VERBS_CMD_CREATE_COMP_CHANNEL,
  3148. ib_uverbs_create_comp_channel,
  3149. UAPI_DEF_WRITE_IO(
  3150. struct ib_uverbs_create_comp_channel,
  3151. struct ib_uverbs_create_comp_channel_resp))),
  3152. DECLARE_UVERBS_OBJECT(
  3153. UVERBS_OBJECT_CQ,
  3154. DECLARE_UVERBS_WRITE(IB_USER_VERBS_CMD_CREATE_CQ,
  3155. ib_uverbs_create_cq,
  3156. UAPI_DEF_WRITE_UDATA_IO(
  3157. struct ib_uverbs_create_cq,
  3158. struct ib_uverbs_create_cq_resp),
  3159. UAPI_DEF_METHOD_NEEDS_FN(create_cq)),
  3160. DECLARE_UVERBS_WRITE(
  3161. IB_USER_VERBS_CMD_DESTROY_CQ,
  3162. ib_uverbs_destroy_cq,
  3163. UAPI_DEF_WRITE_IO(struct ib_uverbs_destroy_cq,
  3164. struct ib_uverbs_destroy_cq_resp),
  3165. UAPI_DEF_METHOD_NEEDS_FN(destroy_cq)),
  3166. DECLARE_UVERBS_WRITE(
  3167. IB_USER_VERBS_CMD_POLL_CQ,
  3168. ib_uverbs_poll_cq,
  3169. UAPI_DEF_WRITE_IO(struct ib_uverbs_poll_cq,
  3170. struct ib_uverbs_poll_cq_resp),
  3171. UAPI_DEF_METHOD_NEEDS_FN(poll_cq)),
  3172. DECLARE_UVERBS_WRITE(
  3173. IB_USER_VERBS_CMD_REQ_NOTIFY_CQ,
  3174. ib_uverbs_req_notify_cq,
  3175. UAPI_DEF_WRITE_I(struct ib_uverbs_req_notify_cq),
  3176. UAPI_DEF_METHOD_NEEDS_FN(req_notify_cq)),
  3177. DECLARE_UVERBS_WRITE(IB_USER_VERBS_CMD_RESIZE_CQ,
  3178. ib_uverbs_resize_cq,
  3179. UAPI_DEF_WRITE_UDATA_IO(
  3180. struct ib_uverbs_resize_cq,
  3181. struct ib_uverbs_resize_cq_resp),
  3182. UAPI_DEF_METHOD_NEEDS_FN(resize_cq)),
  3183. DECLARE_UVERBS_WRITE_EX(
  3184. IB_USER_VERBS_EX_CMD_CREATE_CQ,
  3185. ib_uverbs_ex_create_cq,
  3186. UAPI_DEF_WRITE_IO_EX(struct ib_uverbs_ex_create_cq,
  3187. reserved,
  3188. struct ib_uverbs_ex_create_cq_resp,
  3189. response_length),
  3190. UAPI_DEF_METHOD_NEEDS_FN(create_cq)),
  3191. DECLARE_UVERBS_WRITE_EX(
  3192. IB_USER_VERBS_EX_CMD_MODIFY_CQ,
  3193. ib_uverbs_ex_modify_cq,
  3194. UAPI_DEF_WRITE_I(struct ib_uverbs_ex_modify_cq),
  3195. UAPI_DEF_METHOD_NEEDS_FN(modify_cq))),
  3196. DECLARE_UVERBS_OBJECT(
  3197. UVERBS_OBJECT_DEVICE,
  3198. DECLARE_UVERBS_WRITE(IB_USER_VERBS_CMD_GET_CONTEXT,
  3199. ib_uverbs_get_context,
  3200. UAPI_DEF_WRITE_UDATA_IO(
  3201. struct ib_uverbs_get_context,
  3202. struct ib_uverbs_get_context_resp)),
  3203. DECLARE_UVERBS_WRITE(
  3204. IB_USER_VERBS_CMD_QUERY_DEVICE,
  3205. ib_uverbs_query_device,
  3206. UAPI_DEF_WRITE_IO(struct ib_uverbs_query_device,
  3207. struct ib_uverbs_query_device_resp)),
  3208. DECLARE_UVERBS_WRITE(
  3209. IB_USER_VERBS_CMD_QUERY_PORT,
  3210. ib_uverbs_query_port,
  3211. UAPI_DEF_WRITE_IO(struct ib_uverbs_query_port,
  3212. struct ib_uverbs_query_port_resp),
  3213. UAPI_DEF_METHOD_NEEDS_FN(query_port)),
  3214. DECLARE_UVERBS_WRITE_EX(
  3215. IB_USER_VERBS_EX_CMD_QUERY_DEVICE,
  3216. ib_uverbs_ex_query_device,
  3217. UAPI_DEF_WRITE_IO_EX(
  3218. struct ib_uverbs_ex_query_device,
  3219. reserved,
  3220. struct ib_uverbs_ex_query_device_resp,
  3221. response_length),
  3222. UAPI_DEF_METHOD_NEEDS_FN(query_device)),
  3223. UAPI_DEF_OBJ_NEEDS_FN(alloc_ucontext),
  3224. UAPI_DEF_OBJ_NEEDS_FN(dealloc_ucontext)),
  3225. DECLARE_UVERBS_OBJECT(
  3226. UVERBS_OBJECT_FLOW,
  3227. DECLARE_UVERBS_WRITE_EX(
  3228. IB_USER_VERBS_EX_CMD_CREATE_FLOW,
  3229. ib_uverbs_ex_create_flow,
  3230. UAPI_DEF_WRITE_IO_EX(struct ib_uverbs_create_flow,
  3231. flow_attr,
  3232. struct ib_uverbs_create_flow_resp,
  3233. flow_handle),
  3234. UAPI_DEF_METHOD_NEEDS_FN(create_flow)),
  3235. DECLARE_UVERBS_WRITE_EX(
  3236. IB_USER_VERBS_EX_CMD_DESTROY_FLOW,
  3237. ib_uverbs_ex_destroy_flow,
  3238. UAPI_DEF_WRITE_I(struct ib_uverbs_destroy_flow),
  3239. UAPI_DEF_METHOD_NEEDS_FN(destroy_flow))),
  3240. DECLARE_UVERBS_OBJECT(
  3241. UVERBS_OBJECT_MR,
  3242. DECLARE_UVERBS_WRITE(IB_USER_VERBS_CMD_DEREG_MR,
  3243. ib_uverbs_dereg_mr,
  3244. UAPI_DEF_WRITE_I(struct ib_uverbs_dereg_mr),
  3245. UAPI_DEF_METHOD_NEEDS_FN(dereg_mr)),
  3246. DECLARE_UVERBS_WRITE(
  3247. IB_USER_VERBS_CMD_REG_MR,
  3248. ib_uverbs_reg_mr,
  3249. UAPI_DEF_WRITE_UDATA_IO(struct ib_uverbs_reg_mr,
  3250. struct ib_uverbs_reg_mr_resp),
  3251. UAPI_DEF_METHOD_NEEDS_FN(reg_user_mr)),
  3252. DECLARE_UVERBS_WRITE(
  3253. IB_USER_VERBS_CMD_REREG_MR,
  3254. ib_uverbs_rereg_mr,
  3255. UAPI_DEF_WRITE_UDATA_IO(struct ib_uverbs_rereg_mr,
  3256. struct ib_uverbs_rereg_mr_resp),
  3257. UAPI_DEF_METHOD_NEEDS_FN(rereg_user_mr))),
  3258. DECLARE_UVERBS_OBJECT(
  3259. UVERBS_OBJECT_MW,
  3260. DECLARE_UVERBS_WRITE(
  3261. IB_USER_VERBS_CMD_ALLOC_MW,
  3262. ib_uverbs_alloc_mw,
  3263. UAPI_DEF_WRITE_UDATA_IO(struct ib_uverbs_alloc_mw,
  3264. struct ib_uverbs_alloc_mw_resp),
  3265. UAPI_DEF_METHOD_NEEDS_FN(alloc_mw)),
  3266. DECLARE_UVERBS_WRITE(
  3267. IB_USER_VERBS_CMD_DEALLOC_MW,
  3268. ib_uverbs_dealloc_mw,
  3269. UAPI_DEF_WRITE_I(struct ib_uverbs_dealloc_mw),
  3270. UAPI_DEF_METHOD_NEEDS_FN(dealloc_mw))),
  3271. DECLARE_UVERBS_OBJECT(
  3272. UVERBS_OBJECT_PD,
  3273. DECLARE_UVERBS_WRITE(
  3274. IB_USER_VERBS_CMD_ALLOC_PD,
  3275. ib_uverbs_alloc_pd,
  3276. UAPI_DEF_WRITE_UDATA_IO(struct ib_uverbs_alloc_pd,
  3277. struct ib_uverbs_alloc_pd_resp),
  3278. UAPI_DEF_METHOD_NEEDS_FN(alloc_pd)),
  3279. DECLARE_UVERBS_WRITE(
  3280. IB_USER_VERBS_CMD_DEALLOC_PD,
  3281. ib_uverbs_dealloc_pd,
  3282. UAPI_DEF_WRITE_I(struct ib_uverbs_dealloc_pd),
  3283. UAPI_DEF_METHOD_NEEDS_FN(dealloc_pd))),
  3284. DECLARE_UVERBS_OBJECT(
  3285. UVERBS_OBJECT_QP,
  3286. DECLARE_UVERBS_WRITE(
  3287. IB_USER_VERBS_CMD_ATTACH_MCAST,
  3288. ib_uverbs_attach_mcast,
  3289. UAPI_DEF_WRITE_I(struct ib_uverbs_attach_mcast),
  3290. UAPI_DEF_METHOD_NEEDS_FN(attach_mcast),
  3291. UAPI_DEF_METHOD_NEEDS_FN(detach_mcast)),
  3292. DECLARE_UVERBS_WRITE(IB_USER_VERBS_CMD_CREATE_QP,
  3293. ib_uverbs_create_qp,
  3294. UAPI_DEF_WRITE_UDATA_IO(
  3295. struct ib_uverbs_create_qp,
  3296. struct ib_uverbs_create_qp_resp),
  3297. UAPI_DEF_METHOD_NEEDS_FN(create_qp)),
  3298. DECLARE_UVERBS_WRITE(
  3299. IB_USER_VERBS_CMD_DESTROY_QP,
  3300. ib_uverbs_destroy_qp,
  3301. UAPI_DEF_WRITE_IO(struct ib_uverbs_destroy_qp,
  3302. struct ib_uverbs_destroy_qp_resp),
  3303. UAPI_DEF_METHOD_NEEDS_FN(destroy_qp)),
  3304. DECLARE_UVERBS_WRITE(
  3305. IB_USER_VERBS_CMD_DETACH_MCAST,
  3306. ib_uverbs_detach_mcast,
  3307. UAPI_DEF_WRITE_I(struct ib_uverbs_detach_mcast),
  3308. UAPI_DEF_METHOD_NEEDS_FN(detach_mcast)),
  3309. DECLARE_UVERBS_WRITE(
  3310. IB_USER_VERBS_CMD_MODIFY_QP,
  3311. ib_uverbs_modify_qp,
  3312. UAPI_DEF_WRITE_I(struct ib_uverbs_modify_qp),
  3313. UAPI_DEF_METHOD_NEEDS_FN(modify_qp)),
  3314. DECLARE_UVERBS_WRITE(
  3315. IB_USER_VERBS_CMD_POST_RECV,
  3316. ib_uverbs_post_recv,
  3317. UAPI_DEF_WRITE_IO(struct ib_uverbs_post_recv,
  3318. struct ib_uverbs_post_recv_resp),
  3319. UAPI_DEF_METHOD_NEEDS_FN(post_recv)),
  3320. DECLARE_UVERBS_WRITE(
  3321. IB_USER_VERBS_CMD_POST_SEND,
  3322. ib_uverbs_post_send,
  3323. UAPI_DEF_WRITE_IO(struct ib_uverbs_post_send,
  3324. struct ib_uverbs_post_send_resp),
  3325. UAPI_DEF_METHOD_NEEDS_FN(post_send)),
  3326. DECLARE_UVERBS_WRITE(
  3327. IB_USER_VERBS_CMD_QUERY_QP,
  3328. ib_uverbs_query_qp,
  3329. UAPI_DEF_WRITE_IO(struct ib_uverbs_query_qp,
  3330. struct ib_uverbs_query_qp_resp),
  3331. UAPI_DEF_METHOD_NEEDS_FN(query_qp)),
  3332. DECLARE_UVERBS_WRITE_EX(
  3333. IB_USER_VERBS_EX_CMD_CREATE_QP,
  3334. ib_uverbs_ex_create_qp,
  3335. UAPI_DEF_WRITE_IO_EX(struct ib_uverbs_ex_create_qp,
  3336. comp_mask,
  3337. struct ib_uverbs_ex_create_qp_resp,
  3338. response_length),
  3339. UAPI_DEF_METHOD_NEEDS_FN(create_qp)),
  3340. DECLARE_UVERBS_WRITE_EX(
  3341. IB_USER_VERBS_EX_CMD_MODIFY_QP,
  3342. ib_uverbs_ex_modify_qp,
  3343. UAPI_DEF_WRITE_IO_EX(struct ib_uverbs_ex_modify_qp,
  3344. base,
  3345. struct ib_uverbs_ex_modify_qp_resp,
  3346. response_length),
  3347. UAPI_DEF_METHOD_NEEDS_FN(modify_qp))),
  3348. DECLARE_UVERBS_OBJECT(
  3349. UVERBS_OBJECT_RWQ_IND_TBL,
  3350. DECLARE_UVERBS_WRITE_EX(
  3351. IB_USER_VERBS_EX_CMD_CREATE_RWQ_IND_TBL,
  3352. ib_uverbs_ex_create_rwq_ind_table,
  3353. UAPI_DEF_WRITE_IO_EX(
  3354. struct ib_uverbs_ex_create_rwq_ind_table,
  3355. log_ind_tbl_size,
  3356. struct ib_uverbs_ex_create_rwq_ind_table_resp,
  3357. ind_tbl_num),
  3358. UAPI_DEF_METHOD_NEEDS_FN(create_rwq_ind_table)),
  3359. DECLARE_UVERBS_WRITE_EX(
  3360. IB_USER_VERBS_EX_CMD_DESTROY_RWQ_IND_TBL,
  3361. ib_uverbs_ex_destroy_rwq_ind_table,
  3362. UAPI_DEF_WRITE_I(
  3363. struct ib_uverbs_ex_destroy_rwq_ind_table),
  3364. UAPI_DEF_METHOD_NEEDS_FN(destroy_rwq_ind_table))),
  3365. DECLARE_UVERBS_OBJECT(
  3366. UVERBS_OBJECT_WQ,
  3367. DECLARE_UVERBS_WRITE_EX(
  3368. IB_USER_VERBS_EX_CMD_CREATE_WQ,
  3369. ib_uverbs_ex_create_wq,
  3370. UAPI_DEF_WRITE_IO_EX(struct ib_uverbs_ex_create_wq,
  3371. max_sge,
  3372. struct ib_uverbs_ex_create_wq_resp,
  3373. wqn),
  3374. UAPI_DEF_METHOD_NEEDS_FN(create_wq)),
  3375. DECLARE_UVERBS_WRITE_EX(
  3376. IB_USER_VERBS_EX_CMD_DESTROY_WQ,
  3377. ib_uverbs_ex_destroy_wq,
  3378. UAPI_DEF_WRITE_IO_EX(struct ib_uverbs_ex_destroy_wq,
  3379. wq_handle,
  3380. struct ib_uverbs_ex_destroy_wq_resp,
  3381. reserved),
  3382. UAPI_DEF_METHOD_NEEDS_FN(destroy_wq)),
  3383. DECLARE_UVERBS_WRITE_EX(
  3384. IB_USER_VERBS_EX_CMD_MODIFY_WQ,
  3385. ib_uverbs_ex_modify_wq,
  3386. UAPI_DEF_WRITE_I_EX(struct ib_uverbs_ex_modify_wq,
  3387. curr_wq_state),
  3388. UAPI_DEF_METHOD_NEEDS_FN(modify_wq))),
  3389. DECLARE_UVERBS_OBJECT(
  3390. UVERBS_OBJECT_SRQ,
  3391. DECLARE_UVERBS_WRITE(IB_USER_VERBS_CMD_CREATE_SRQ,
  3392. ib_uverbs_create_srq,
  3393. UAPI_DEF_WRITE_UDATA_IO(
  3394. struct ib_uverbs_create_srq,
  3395. struct ib_uverbs_create_srq_resp),
  3396. UAPI_DEF_METHOD_NEEDS_FN(create_srq)),
  3397. DECLARE_UVERBS_WRITE(IB_USER_VERBS_CMD_CREATE_XSRQ,
  3398. ib_uverbs_create_xsrq,
  3399. UAPI_DEF_WRITE_UDATA_IO(
  3400. struct ib_uverbs_create_xsrq,
  3401. struct ib_uverbs_create_srq_resp),
  3402. UAPI_DEF_METHOD_NEEDS_FN(create_srq)),
  3403. DECLARE_UVERBS_WRITE(
  3404. IB_USER_VERBS_CMD_DESTROY_SRQ,
  3405. ib_uverbs_destroy_srq,
  3406. UAPI_DEF_WRITE_IO(struct ib_uverbs_destroy_srq,
  3407. struct ib_uverbs_destroy_srq_resp),
  3408. UAPI_DEF_METHOD_NEEDS_FN(destroy_srq)),
  3409. DECLARE_UVERBS_WRITE(
  3410. IB_USER_VERBS_CMD_MODIFY_SRQ,
  3411. ib_uverbs_modify_srq,
  3412. UAPI_DEF_WRITE_UDATA_I(struct ib_uverbs_modify_srq),
  3413. UAPI_DEF_METHOD_NEEDS_FN(modify_srq)),
  3414. DECLARE_UVERBS_WRITE(
  3415. IB_USER_VERBS_CMD_POST_SRQ_RECV,
  3416. ib_uverbs_post_srq_recv,
  3417. UAPI_DEF_WRITE_IO(struct ib_uverbs_post_srq_recv,
  3418. struct ib_uverbs_post_srq_recv_resp),
  3419. UAPI_DEF_METHOD_NEEDS_FN(post_srq_recv)),
  3420. DECLARE_UVERBS_WRITE(
  3421. IB_USER_VERBS_CMD_QUERY_SRQ,
  3422. ib_uverbs_query_srq,
  3423. UAPI_DEF_WRITE_IO(struct ib_uverbs_query_srq,
  3424. struct ib_uverbs_query_srq_resp),
  3425. UAPI_DEF_METHOD_NEEDS_FN(query_srq))),
  3426. DECLARE_UVERBS_OBJECT(
  3427. UVERBS_OBJECT_XRCD,
  3428. DECLARE_UVERBS_WRITE(
  3429. IB_USER_VERBS_CMD_CLOSE_XRCD,
  3430. ib_uverbs_close_xrcd,
  3431. UAPI_DEF_WRITE_I(struct ib_uverbs_close_xrcd)),
  3432. DECLARE_UVERBS_WRITE(IB_USER_VERBS_CMD_OPEN_QP,
  3433. ib_uverbs_open_qp,
  3434. UAPI_DEF_WRITE_UDATA_IO(
  3435. struct ib_uverbs_open_qp,
  3436. struct ib_uverbs_create_qp_resp)),
  3437. DECLARE_UVERBS_WRITE(IB_USER_VERBS_CMD_OPEN_XRCD,
  3438. ib_uverbs_open_xrcd,
  3439. UAPI_DEF_WRITE_UDATA_IO(
  3440. struct ib_uverbs_open_xrcd,
  3441. struct ib_uverbs_open_xrcd_resp)),
  3442. UAPI_DEF_OBJ_NEEDS_FN(alloc_xrcd),
  3443. UAPI_DEF_OBJ_NEEDS_FN(dealloc_xrcd)),
  3444. {},
  3445. };