QuickBooks Online, pay bills form. Get ready to start moving on up with QuickBooks Online. We're gonna be using the free QuickBooks Online Test Drive searching in our search engine for QuickBooks Online Test Drive. We're gonna be selecting the option that has Intuit.com within it, Intuit being the owner of QuickBooks, selecting the United States version and verifying that we're not a robot. Scrolling in a bit, holding down control up on the scroll wheel. I'm currently at 125% on the zoom in, noting that if we hit the cog up top, we're in the business view, not, I mean, sorry, we're in the accountant view, not the business view. We will be toggling back and forth between them periodically as we go. We're gonna open two more tabs or duplicate those tabs to put reports in the major financial statement reports as we do every time. Right click in the tab up top to duplicate it. As that is thinking, I'm gonna right click again and duplicate again. Then as that is thinking, I'm gonna go to the middle tab, go to the reports, which under the accountant view is on the left-hand side, and then balance sheet should be one of our favorites. As that's thinking, I'm gonna go to the tab to the right, reports, and then I'm gonna be choosing the income statement or profit and loss report. This is our major two financial statement reports. So I'm gonna scroll up, change the date range. I'm gonna do it manually by highlighting the date and then putting in 010122, which is January 1st, 2022, as easily typed as possible, tab, and then 123122, which stands for December 31st, 2022, and tab. It populates then the dashes and we're gonna run that report. Then I'm gonna go back to the middle tab and scroll up to where the dates are. Do the same thing from 010122 tab, 123122 tab, run the report to make sure it is updated. So that's the setup process we do every time. I'm gonna go back to the first tab now. If I select the plus dropdown, this is gonna give us the major forms broken out by cycle. We've been looking at the vendor cycle, remembering that vendors specifically for the accounting terminology means that people that we are paying, money ultimately going out for goods and services that we are purchasing. We could do that on a cash-based system as we purchase goods and services paying with a expense or check form. These basically being two like forms that are decreasing the checking account or we could do the accrual process which we started with this time, entering a bill and then we're gonna be paying the bill. So we entered a bill last time but let's just recap and enter the bill again. Now note that I've logged out of the sample file and back into it. So it shouldn't save my data and most likely won't save my data as I log out and back into it. So we should have a fresh set every time we start a new presentation in general. So I'm gonna go into a bill, let's enter a bill and then follow it through the process of paying the bill. When we pay the bill, we are in essence just paying it with like a check form but it will be marked off especially within the QuickBooks system and it'll show like in our data in our transaction reports. Let's check it out. Let's enter a bill. So I'm gonna enter the bill again and repeat of what we did last time or a similar process. I'm gonna say this is gonna be AAA. I'm gonna create a new vendor as we go and tab. It's gonna ask me to create it. I'm just gonna say that's all I need on the name. So let's save that. And then the address, I'm not gonna put anything different there. The terms, I'm gonna say our net 15. That means the date that I'm entering the bill is here. I'm just gonna keep that date and then I'm gonna say it's gonna be due on 15 days later. Obviously, if you had the bill you wanna make sure that you enter the date for the due date of the bill so you could sort by due date. And that's what we're gonna do when we pay the bill shortly. We're not gonna add any tags. And then we have our categories down below of either an expense item, assigning it to an account, usually an expense account but possibly a fixed asset account here or an item which is typically inventory. I'm not gonna deal with the inventory now. We're gonna just assign it to an account. Let's just say it was like the telephone bill. I'm gonna start typing in telephone bill. It will start to populate if we have our chart of accounts set up properly. Also, we could set up a system where it could kind of memorize the last transactions in which case it might populate the category for us automatically. We might put a memo, such as this is for the week ended, blah, blah, right? And might put a date there to give us more detail of the period that was covered that we paid with this particular bill. That's not a required field clearly, but good one to have. And then I'm just gonna make it for like $350. The billable item means that we might pull it over if I hit the billable item, then I can pull this over possibly to an invoice. We'll talk about the billable items later. The tax would only be applicable if it were billable because we're talking sales tax, generally at least in the United States. And then the customer would only be necessary if once again, you made the item billable. Remember, you could have multiple lines here as well that we talked about last time. What's this going to do? It's going to be increasing the accounts payable. That's what a bill does. So we'll increase the accounts payable. The other side is gonna go to the telephone expense. So we'll do that as of 12, 20, okay? So let's go ahead and record it. So I'm just gonna say drop down or rise up, save and close and let's check out what happened. Just to verify, go into our reports. Every time I record something, I like to go over here and just double check that it did what I think it should. Now over here, I'm gonna close the hamburger. I'm gonna scroll back up top and run the report again to refresh the report, to have it up to date. And then I'm gonna scroll down and say that should have increased the AP accounts payable. I can drill back down from the end result to the source document, selecting this item and then scrolling down, there's the bill. I can then click on this by scroll back down. I can see the 350. I can click on this and go into the actual source document that we data input, which was the bill, closing that back out. Notice we also see a list of the transaction type. This is quite useful when you're analyzing the reports. You can see it's a bill form. I know what bill forms do. They increase accounts payable and then they have an other side to them, typically an expense account, but possibly a fixed asset or inventory account depending on the circumstances.  I gotta go back this way, going back to my report. I know for sure that accounts payable is gonna go up with the bill, what I was trying to say. The other side's on the income statement. So I'm gonna go to the income statement tab to the right and then run it, close the hamburger and then scroll down. And we're gonna say it went to that telephone expense down here, we put it somewhere in the telephone. Scroll up a little bit. Where's the telephone? There it is, they put it under utilities on the telephone. Okay, I wouldn't do that normally, but there it is. Let's go into there, so there we have it. And then again, we can drill back down to the source document. So two accounts are impacted. At least two accounts will be impacted every time we enter one of these forms typically because these are financial transactions.  You might be able to use this one, but with QuickBooks, they basically have everything kind of inside the system. So you're usually better off not going to the browser back button, but finding out how to maneuver within the actual website design of the website. Although again, sometimes you might find a use for that back button, but I find that they have everything kind of built into the system here. Okay, so then if I go back to the balance sheet, then in scroll up, we also have the subsidiary ledger for the accounts payable. That represents who we owe money to. We also wanna know who we owe that money to. Now we could do this in a report format and that helps us to see the total tying out to this number. Seeing that it is a subsidiary ledger. In other words, if I go to this tab to the right, right click on it, I'm gonna duplicate it again to open another report. So I'm gonna open it up again and then I'm gonna go down to the reports and we're gonna go then, I'll close the hamburger and scroll down to the reports for you owe, what you owe type of item. And then last time we looked at the accounts payable aging. Let's this time look at the vendor balance detail report, which is a similar report to the aging. We looked at it in a prior presentation, changing the dates. It's got all dates. That should be good. So we'll keep it there. And then we're gonna say that, so we've got, there is the total for AAA that we entered into the system. And here's the 350 up top. Now, if we go all the way to the bottom of this is breaking this information out by vendor and we've got the total 195267. That amount should tie out to what's on the balance sheet, 195267. So we can break this out. We gotta break it out by who we owe the money to. Now in practice, oftentimes we're gonna be going to the internal reporting components to the left-hand side here. I'm gonna scroll back down a bit to 125. And we're gonna go then to the expenses area. This is in the accounting view. If we go into the expenses tab on the left-hand side and then we can go into the expenses, the bills and the vendors up top. So oftentimes we're gonna go into here and be searching for those outstanding bills. So I'm gonna hold down, I'm gonna, sorry, I'm gonna close the hamburger. So you could go to the expenses tab here, which have basically transactions that are related to us paying the pain of the vendors, the vendor cycle or the money out cycle at the end of the cycle. And you could filter within here and say that you wanna go to the bills, for example, and then you could go to the open bills and you could check the date range. You also have the overdue bills and so on and apply this. You could sort by bills or you could of course go just simply to the bills tab, which kind of takes you directly to, I'm gonna go to, now I'm in the bills tab, I'm gonna go to the unpaid items. So now we're in the unpaid bills directly. So there's a similarity between these items here. There's the AAA and the bills on the unpaid bills where we've got this item down here. You could change the sort range if you so choose and kind of sort which bills you need to be paid and you got the paid items. If we're sorting by an individual like vendor, then we can go into the vendor. And in here, you also have another kind of sorting option where you could say, hey, I wanna look at the open bills, for example, and then now you've got the broken out by the vendors. And this is another way that you can sort for pretty much the same kind of data. We have the option on the right-hand side to make a payment now, create a bill and create an expense. So if I go into the AAA here, now I'm into this particular vendor, I see the detail down below, which is the bill. So this is the bill for that particular vendor. If I hit the dropdown once again, I can mark as paid, view, edit and copy. If I wanna go back, notice I have two hamburgers up top. I've got this one, which is the main hamburger. And then I've got like this little mini hamburger. So I can go to that one and I could go like back to the vendors here. So you kinda wanna practice your navigation around in that area. So the next step in the process then would be to pay the bill. Now notice the little plus button is up here. So I could hit the plus button this way now and I could go down to the pay bills or I could go into this individual if I'm looking at a particular vendor and I can hit the dropdown here and I can say that I want to make a payment, make payment and then it goes into the bill payment. And this way it kind of refines down our choices in the bill payment form to this particular vendor that we're paying. Now oftentimes we might be looking at all the bills that are kind of outstanding in selecting the bills that we want to pay. So we might be doing something more like I'm gonna go to my, let's go back to like my bills, my open bills here and then unpaid. I might be trying to sort all of my open bills here and then figuring out which ones I want to pay which might be like the overdue bills, right? Periodically, we might be doing that. And the other way that we can kind of see this if I wanna make multiple, pay multiple bills at one time instead of entering them one at a time, I can hit the dropdown on the plus button again and we could say that we want to pay bills. So we're gonna say pay bills. Now it's gonna open up another screen that is a pay bills screen but it's not just selecting one bill down below. We now have multiple items that we could check off and be entering the transactions to paying multiple bills at one time. So this, if we look at this form, it's gonna be in essence a check type of form but it might make multiple check or expense type of forms at the same time or a credit card form depending on whether you're paying with credit card or a bank account. So you got your payment account up top which you could often, you would use your checking account most likely or you might have a credit card account if it was a checking account and then clearly the checking account would be going down like a check type form or expense form. It was, if it was a credit card account that you are using then you're gonna, it's gonna have the same decrease to the accounts payable but the other side's gonna increase the liability of the credit card. So let's go to the standard kind of checking account and let's say that we make the payment, we'll say 12, 20, that's fine. It's gonna have a check date. Now, if you don't have checks that you're actually printing and you're basically recording electronic transfers or something like that, then you could simply delete the check number. If you are printing the checks and you want to actually print the checks. So in other words, if you actually are using checks, you might hand write the checks in the small business for example, and then you would want to mirror the check number adding the check number here or you could buy checks from the bank which are still gonna be pre-printed and then you're gonna have to print on them, you know, the added information for the check but the check numbers will already be on the pre-printed checks and then you're gonna put them into the printer. So you're gonna want the check number here to line up and then you're gonna mark it off as to be printed later and then go through the printing process of the checks. Now, I'm gonna assume that we're not going to be printing them and we're not gonna have a check number so it's more like an expense type of form. And then we could select, say we're gonna pick the AAA and so now we've got the 350. We could select multiple of these items. Let's just select a couple of them here. And so if notice that if I was to only pay a partial amount of it, then I can show the partial amount of the payment that we're gonna have. And then of course we would still have an amount that would still be due. So if I put like 500 here, we have the opening balance 755, 500 and then we would still be owing the difference. And then here I'm gonna be paying off the full 350. Now these are going to two different vendors. So this is gonna not be like one transaction. I'm creating in essence two forms at the same time, two pay bill forms, two forms that are similar to check forms or expense type forms, but they're gonna be specifically tagged as like a pay bill type of form, which gives us a little bit more detail when we sort for the data because it allows us to know that the other side is decreasing the accounts payable. That's what a pay bill form does. What does the pay bill form do? It decreases the accounts payable and the other side is usually going to the checking account or some kind of cash account or credit card account. So down here we've got the account balance. So that looks good. So let's go ahead and record it and then we'll check it out. So I'm gonna say save it. Let's say save and close. And then let's look at our financial statements. So I go back to the financials. I gotta scroll up and make sure that I run the report again, refreshing it, holding down control, scrolling up a bit. If I go into the checking account, drilling down on the checking account, using the zoom feature, whatever they wanna call it, holding control, scrolling down a bit. So I'm not 125. And then I'm gonna go down and here's the bill payments. We've got two bill payments that we made, two separate transactions, even though we did them basically at the same time. Let's follow this one and then scroll down into the source document. So now we've got the bill payment form. It doesn't look exactly like the data input screen because now we're just showing just one item that we paid the bill for. So this is in essence basically a check type of form or an expense form, whatever you wanna call it. It's a form that typically decreases the checking account but the other side is always going to the accounts payable. So in other words, if it's a payment of a bill, you can't really see what you bought until you go to the actual bill. I mean, you might be able to know by the vendor but then you have to go to the actual bill to see the expense account that was hit. There's the utility, there's the utility that was paid. Whereas if you were to open up an expense form or check form, then you could go directly to, obviously the expense would be on the form.  I'm gonna go into the accounts payable now. Notice that the accounts payable account is different than the cash account. It only goes up with bills and down with bill payment forms which are basically check forms or an expense form, however you wanna think of it. Whereas the cash account has all those different kind of types of transactions. The cash account is unique in that way because the cash account is the lifeblood of the company. All other accounts are gonna be severely limited to the types of transactions in them. The accounts payable only have two in types of transactions typically in them, bills increasing and bill payment which are in essence check forms as you could see here indicated by the check thing there that will be decreasing them. So closing this back out, I'm gonna scroll back on up and go back to our report. Now we can also see this in the detailed report. So I've changed the accounts payable to 110267. If we go to the tab to all the way to the right and I refresh this report and say run it, then the AAA is totally gone up top due to the fact that there's no outstanding bills. Now we might be able to refresh this report to see the detail even though there's a zero balance because the bill went in and was paid but we'll dive into that later. Right now I just wanna point out that the total down here 110267 should tie out to what's on the balance sheet 110267. In practice, we're probably not gonna be looking at the report for the sub ledger but rather trying to organize on the left hand side this information for the expense areas and the bills and whatnot. I'm gonna open up the hamburger and the expenses tab so that we can facilitate the ease of the flow of the transactions, right? But we always wanna note that what we're doing here these open bills are basically tying out to the major balance sheet account of accounts payable. So now if I go to my expenses tab here, for example, I'm gonna close up the hamburger. We can hit the dropdown and we can look at the bills. We can look at all of them and then apply. So there's all the bills which includes that AAA bill and then I can filter them back down to only the open ones which is often what we're looking for. Now that AAA one is gone because we paid it and then I could sort by just the overdue items which are the ones that we really need to pay, you would think, right? And then I can go to the second tab which is kind of filtering that out a little bit more quickly, unpaid items. So now the unpaid items are not including the bill that we put in place. I can go to the vendor themselves. If I go to the vendor tab, I could sort up top for the open bills, for example. But I wanna go into AAA directly here and see the increase and the decrease. So there's the actual check and there's the bill. So bill and then these two are basically tied together. If I go into the bill now opening up the bill, it shows as paid which is nice and you have these nice links. So if I go into here, the date is 1220 amount applied. So then if I close this back out, let's say if I go into that, there's the bill payment. So it links over, which is quite nice. Closing this out. And if I go into the bill payment and I wanna see the connection here, there's the payment. I can tie this to the actual bill. Now notice if you learned accounting by debits and credits and like an accounting school that was teaching just financial accounting, you probably learned debits and credits and you might not have as much of an appreciation for the links between say a bill and a bill payment form cause you're just thinking, well, what's the impact on the financial statements in terms of the creation of the financial statements? Cause that's kind of like the focus oftentimes when you're looking at it from just making the financial statements. But from the bookkeeping accounting side of things, the goal of facilitating the money flow, transactions as easily as possible, that's why you wanna use these forms. You don't wanna just enter a journal entry that would be for the bill increase in accounts payable and the other side going to the expense and then with the check form, you decrease accounts payable and the other side is going to, and you decrease the cash account, right? You don't wanna do it with just journal entry because you need the accounting software to be linking the fact that the bill is now closed and you could actually see it tied together being closed to the actual payment. You would like to be able to drill down from the financial statements down to the source document and if your source document is a check, you would like to further link the check to the bill so you could see what the actual expense account was that was hit, which is on the bill and not on the check. So all these little links from a bookkeeping standpoint, if you've learned stuff from the bookkeeping side of things are things that are natural. You think this is the main thing that the accounting software does, of course, does facilitate transactions, but if you're on the accounting side of things and you learn the debit and credits without learning the bookkeeping, then you're probably just thinking what's the impact on the financial statements and the debits and credits and may not be appreciating enough these little changes in terms of the types of transactions and how all the transactions link together and the importance of having this transaction type here, telling us what kind of transaction we're using and the differences of what those transactions are doing and the capacity to go into these centers over here and organize our data in the event that we have a question from a vendor or something like that so we can easily organize the data to answer the questions as problems arise. And just a quick look at the business view. So if I go to the cog up top and we switched this to the business view, then we have the same kind of activities under the business view, it's just a different kind of location. So if I start over at the get things done which is in essence the homepage, then we've basically been working in the get paid and pay area, which if you think about this as a ribbon, you would think about that possibly as the tab and then these are kind of the groups within here, we're going into the pay area which is kind of like the vendor center kind of area and then you've got your vendors where we see the location we saw under the accounting view and then you've got your bills down here and that's where you have your bills unpaid and the paid items. Now the thing that's a little bit different here is that if you have to go under the bookkeeping down below to get to that expenses area, so if I go to the bookkeeping and then the transactions and then I go to the expenses tab up there, that's where you have this area where you can kind of filter all of the transactions that are kind of like in the vendor cycle. So this is where you've got that nice expenses bills and so on and you could sort them such as sorting the bills and we were sorting the open bills and so on within here. So they kind of broke that one out into its own little area here into the transactions and the bookkeeping tab. But like I say, they should have pretty much the same kind of stuff. It's just where did they put it and it's a surface level changes that we're talking about typically and just the design of things. So don't get frustrated if they switch things up with QuickBooks or if you prefer one view or the other view, you could figure out whichever one you want to use.


What's going on everyone? Sam here with late in sports cards, ripping 3 box NFL mixer, 22 iMac, Phoenix, and Donrus football hobby number 7, random team style. There's a look again at your random results. As always, you can find these on the website under the results tab, as well as the link that's in chat. So good luck here, everybody. Let's do it. We'll start with Donrus, we'll go into Phoenix, and we'll finish, of course, with iMac. Oh, missing name plate is Nico Collins. Yep, let's go. And Red Kenyon Drake. Rock game is still going. Well, you already failed. Like once. Yeah, still batting like 95%. There's Trayvon Walker, James Harrison. For the game. John Randall to 100. You know, it's actually kind of funny. It's like a few days later, I had another one of those Jerry Fillories, and I was like, that's Jerry Fillory. Yeah, I knew it all right off the bat. Forget that one. Nope. Damian Pierce rookie, Reggie Wayne, Peakers. There's Aaron Rodgers, Donrus throwback. Commentators, Deandre Swift, Zemir White on the canvas. Nice one there. And the Marcus Ware. Vaughn Miller is Vaughn Bashawn Miller. Nice full full name short print. Desmond Ritter elite series. Davis and Brett Farve in Hutchinson rated rookie. Tom Brady, Gridiron Kings. And Red, David Bakhtiari. Sauce Gardner rookie. There's AJ Dillon on the Jersey Kings that is 294 out of 399. Nice one there for the Packers. AJ Dillon. Xavier and Howard Redd, Pressproof. Kevon Thibodeau, Portrait. And Brown that is Zemir White, 93 out of 100 on the canvas. Crystal Lavey rookie. Elite rookies. And Justin Herbert. Picket rookie, right on top. Jalen Tolbert. James Cook and Jamal Charles. Jahan Dotson rookie. Mackay, Jeff Acuto, Red, Pressproof. Boyay Mafa. David Ajaubo for the Ravens, Red, Pressproof rookie. Kaila Vaughn Chasson. Trayvon Walker, Gridiron Kings for the Jets. Purple, Drew Brees. Nice one there to 468, 398 of 468. Purple. Nice, Desmond Ritter. Rookie Jersey Otto, 23 out of 99. There you go. Manny, picking up a Ritter Otto. Grads, buddy. Cook Rook. Bass, Kway Walker. Traylon Birx. David Ajaubo for all Davis. Breeze Hall rookie for the Jets. Fans of the game is Mark Wahlberg. Red, Jamison Williams, Pressproof. There we go. Problem solved right there, Manny. Problem solved. What's up, Snipes? Najee Harris, Cordero Patterson. Haven't seen you in a minute, Snipes. How you been? Snipes. All right, let's do Phoenix. Salty, Salty back. Salty. Orange, CD Lamb to 99. Malik Willis, Rookie Rising. What's up, Jacob? Sean's here too, Jacob. What's up, buddy? Jake. There's Lava, Davis Mills. Mike D. Mike D in the place to be. Oh, wow. What up? What up? To 175 and Brock Lesnar. Twitch is bumping. Oh, Twitch is fire. What's up, Jake? Ooh, let's go, Snipes. Got your, uh, hit a printing plate? Was it, was it the checklist printing plate? Jamison Williams or was it a different one? There's Otto, two of five. Matt Ryan on the green for the Colts. Ice one, Indy is going to Eric P. Not bad. Gotcha, okay. Daniel Bellinger. Okay, gotcha, gotcha, gotcha. Let's go, Snipes. Congrats, buddy. What'd you get, Jacob? Let's go, Snipes. Brandon and I up to 250, right? Yes, 250. Zach Wilson, flamethrowers. New WWE and MLB. Let's go, Jacob. Let's go, dude. Orange, that is. Kenny Pickett, Rookie Rising to 99. I love the WWE video games. They are so much fun. Like, I don't watch WWE, but the video games are awesome. They do such a good job. That is 450, Skymore. Uh, three color, three color, RPA. Actually, silver. Silver Davis Mills. Oh, we've been trying. We've been trying for sure. There's Davis Mills to 175. Forrest is kind of like Forrest knows hockey really well, so they tend to, like Richelton and Rich and Lionel tend to give Forrest most of the, most of the hockey breaks because he's more knowledgeable. I know like enough to get by but I can't really go super in depth. Like Forrest knows a lot. Forrest knows a whole lot. Say, Green Patrick Mahomes contours, 23 of 25. Nice one there for the Chiefs. Shout out to Forrest. Oh yeah, shout out to Forrest is right. Saquon Barkley on the Blue 235. True. That's, that's fair. That's fair, Snipes. That's Randall Cunningham. Oh, I know more than anyone else in the shot. True, true, true. That's a true statement. Purple Taekwondo Thornton to 125 and Matt Corral contours. I'll see if I could inquire, see if I can get like one or two hockey breaks at some point just so I could dip my toe in the water as they say. Skymore. There's 26 of 75, Aaron Rogers, three-color patch. Nice one there. Yeah, Forrest knows wrestling pretty well. Colorverse, Romeo Dobbs. Forrest knows wrestling pretty well. Forrest knows soccer really well too. Forrest is our Bo Jackson. Yeah, Forrest is our, Forrest is our Swiss Army knife. To 199, Cameron Thomas and Drake London. Nice one there. I want you to do it for your boy. We got London on the track. I could even, I'll even do you one up. No, don't do that. I'll even do you one up. No, no, no. I should have never said that. I'll let you do the own one right there. All right, let's get an iMac. Good luck. I'll let London on the track say it himself about Drake London. Here we go. Oh, it's funny. It gets people going. True. That's all that matters. It's all that matters. Manny's got the Falcons and he thinks it's funny. So really, that's a win-win. He asked me. He asked me that to win-win. I didn't ask you. Chris Godwin. That is 86 out of 99. Congrats on that there, Bucks. We've got clearly Immaculate. That is Tyquan Thornton, 46 of 99 for the Patriots. Nice one. New England. That one does look like a really cool release. I did, I did see that actually, the SP Signature Legends. Cool one here. The standard 8 of 10. That is Antonio Gibson for the Commander's three-color patch. Congrats, Eric R with Washington. Got a nice one here, Marks of Greatness. Going to the Bengals. That is Ken Anderson, 8 of 49. Kenny Anderson. Four of 99. That's going to the Bears. Vilish Jones Jr. I just won their Bears, Brandon L. And you can now, you can mag this next one. We've got 22 of 25. RPA, Kenneth Walker. Nice canine. Going to the Seahawks. Valerie P. Congrats, Valerie. Nice one there, my friend. RPA of the Rookie of the Year runner-up. We'll get that mag for you, Valerie. All right, guys. Let's do a quick recap here. We've got, well, happy early birthday, Snipes. Antonio Gibson, Ty Kwan Thornton, Aaron Rodgers, A.J. Dillon, Vilish Jones, Ken Anderson, Skymore, Matt Ryan to five, Dezmond Ritter, and A. Kenneth Walker, 225 for the Seahawks. That'll do it for the break, guys. Thanks again for the fill. Next up, we've got Mega Dual Key.


Good luck. Okay. Thank you. So, good evening everybody. Thank you for attending this last talk for today. So, my name is Eric Ogier. I work at Red Hat in the virtualization team. So, this talk is about virtual IUMMU implementation in the context of a special use case. So, the device passes through. And I'm going to focus especially on one implementation based on hardware nested So, first I will introduce the IUMMU hardware. We will introduce some terminologies that we are going to use all over the presentation. Then, we will focus on the device pass through use case. Especially, we are going to look at Linux and QMU integration. We will see how the physical IUMMU is used. We will add a little more complexity by adding the virtual IUMMU in the picture. We will see that depending on the hardware, we have different implementation choices to implement this virtual IUMMU. And I will detail the integration at Linux and QMU level for the system IUMMU which is the ARM IUMMU. And I will complete this presentation by the status of the work and remaining challenges. So, the IUMMU is an hardware block that is put in between a DMA-capable device and the system interconnect. So, the job is to translate the DMA requests that are expressed in a given address space into an output address space. And on top of that, it also performs some permission checks on the transactions. So, the principle is that the device tags its DMA transaction with a unique ID. On ARM, this is called the stream ID. On Intel, this is the source ID. And this unique ID allows the IUMMU hardware to locate some configuration structures that are usually located in external memory. Those configuration structures tells how the translation needs to be performed, what are the characteristics of the translation, and obviously, it also points to a set of page tables that are located in the external memory. Once the IUMMU hardware has done this configuration lookup, it is actually able to perform the page table work. So, it looks first into some caches within the hardware, which are called the IOTLBs. And if there is a miss, we do not find the translation there, so we are obliged to do the page table work in external memory. So, now let's have a look at the device assignment process. So, first of all, what this use case consists in? So, it consists in exposing a physical device to a guest operating system. And the purpose is that the intent is that we want the guest OS to get the ability to interact and program the device as if it were physically attached to it. So, with respect to DMA programming, this means that the guest is going to program the DMA register target address registers using its own address space, which is the guest physical address. And you want this physical device to be able to reach the whole guest RAM. So, somebody in that process needs to map this guest physical address onto the OS physical address that backs the guest RAM. And so, besides this actual translation, what we want also is to guarantee that the assigned device won't be able to reach any other OS physical address. Typically, we do not want it to reach OS physical address used by the OS system itself, and we don't want it to reach OS physical address that backs part of another VM. So, this assignment process brings DMA isolation. Okay. So, now if we do stick to the scheme I explained just before, the trouble is that the assigned device is able to reach the whole guest RAM. And in that sense, it can jeopardize the integrity of the guest OS because it can reach any GPA. So, what we want on top of that is to restrict the DMA capability of the assigned device to a particular space within the GPA. So, this is achieved by adding the virtual IUMMU. So, an IUMMU that is exposed to the guest this time. And with that trick, actually, the guest drivers are going to program the assigned device no more in guest physical address, but using a special address space which is called IO virtual address space. And that way, we are going to restrict the guest physical address that are reachable by the assigned device. And on top of that, it brings commodity like scattergazer commodity. You are not forced to use contiguous guest physical address. You can use this IOV space. And in the Linux context, this means that as you expose virtual IUMMU and IUMMU, you can also use the VFI OPCI driver on the guest. And this is especially useful for two use cases which are important. The DPDK use case, when you want to develop a network stack that uses user space drivers, this relies on the VFI O API.  And in that case, you will also use VFI O to achieve that goal. Now, if you look at this picture on the right, you can see now you have two translation stages. So I use this terminology of stage. So if you look at Intel's terminology, they talk about levels, but this is exactly the same. So here we talk about logical stages. The first one is mastered by the guest operating systems. When it programs the virtual IUMMU, it actually programs the stage one. This is the first stage that translates guest IOVA into guest physical address. And then you have the former translation stage that is programmed by the virtual machine monitor that does the normal device assignment, I would say. And that translates guest physical address into host physical address. So those are logical stages. I do not make any assumption on how it is going to be implemented at hardware level. This is what we are going to see just after. So now let's have a look at the hardware capabilities. Because you have those two logical stages to be implemented. You remember that you have a physical device that you are going to assign to your guest and this physical device is protected by the physical IUMMU. So this means that at some point of time you need to program the physical IUMMU. And this programming must be consistent with the two logical stages we have seen before. So at physical level, there are different kinds of hardware implementation. Either the IUMMU can implement a single stage or a single level for Intel. So this is typically used for the scattergazer use case where a guest operating system is going to translate an IO virtual address into a physical address. Second use case is that your hardware can implement still a single stage but not meant for scattergazer but rather meant for virtualization use case. In that case, it's meant to translate a guest physical address into host physical address. So those are two different stages. The translation process is different for stage one and stage two. You have different configuration structure for each. So it's a choice when you implement at hardware level to choose either a stage one or a stage two implementation. And some hardware implement what we called the hardware nested page mode which consists in chaining those two translation processes. So you first execute the stage one and the output of the stage one is input into the stage two. And this kind of architecture was really devised for the use case we just saw before. So one stage is in principle controlled by the guest operating system and the other stage is controlled by the hypervisor. So now we have two logical stages to be implemented. We have different kinds of hardware implementation. So let's see now what kind of implementation choices we have. So the first case is that your hardware only supports a single stage of translation. So you have two logical stages to map onto this physical stage. So what is done is that the virtual machine monitor is going to trap on each configuration and translation structure updates performed by the guest. It will do by software the translation of the first stage. So the IOVA to GPA translation, it does that. So it happens in QMU, in the virtual IMU device. Then the virtual machine monitor is able to associate the output of this translation to the host physical address that backs the memory. And it combines the two translation in one and program the physical IMU and this is actually the mapping that is programmed at the physical level which is at the bottom. And so this is what happens on the mapping. Now when the guest destroys a mapping, it sends invalidation commands to clear the IOTLB entries that correspond to this mapping. This is trapped by the virtual machine monitor. And so we invalidate the IOTLB at the physical level. This is the way it works. Currently when your hardware only supports one physical stage and historically this is the implementation used for X86, DMA remapping integration. So for the implementation of the virtual IMU together with VFIO. The problem, so there are different... So the first issue is that it induces quite a lot of huge penalty for use cases which do a lot of map and map and so on because each time you map something, so you go through this process, you do the translation by software, you do the association between GPA and NHPA, program the hardware, so it's very costly. So it's a trouble, so it depends on the use case. Typically DPDK does not have such kind of dynamic mappings, but whenever you use an actual native Internet driver on the guest, he is allocating DMA buffers very frequently, mapping them and so on, so it's very costly. Besides that, so this is an existing implementation, so it perfectly works for Intel together with QMU and Linux VFIO. The trouble is that when we try to reuse this framework for the integration of the virtual ARM IUMMU, which is called SystemMMU, so SystemMMU, it's not possible to reuse this implementation because the SystemMMU suffers one weakness, the specification does not force invalidation on map. So this means that when the guest is creating new entries in the page tables, there is no way to trap that at virtual machine monitor level. So the way it works on Intel is that they devise the special mode, which is called the caching mode, and when this bit is exposed by the virtual IUMMU device, this forces the guest driver to invalidate also on map. And this trick is not specified in the ARM SystemMMU specification. So we cannot reuse that. So we were obliged to look at something else and this alternative is based on hardware nested paging because the SystemMMU specification provisions specify this hardware implementation. So this is an implementation choice to implement both stages at physical level. Some platforms won't implement that, but some do. So in that case, it is straightforward because you have two logical stages to map onto the two physical stages. So what happens is that one stage is mostly owned by the guest operating system and the other stage is owned by the virtual machine monitor. So the principle, so each time the guest operating system is updating its configuration structure, we trap this event at virtual machine monitor level and we plug the stage one configuration built by the guest operating system. We plug it into the main configuration structure managed by the virtual machine monitor. So the nice thing is that the structures are well isolated on ARM. So on one side you have the stage one configuration on the other side you have the main configuration structure that contains the stage two configuration and that's well separated. So the main configuration structure which is called the stream table entry on ARM is mastered by the virtual machine monitor for security reasons because you couldn't have the guest operating system that updates directly this structure because it could change the mapping assigned to this stream. So now let's see the changes needed to integrate this nested mode. So actually it's a bit surprising because this nested mode is used for MMU for a while, MMU for CPUs I mean, but for IU MMU it has not been enabled yet. So the framework both at QMU and kernel level needed to be updated to support that. So the first thing we have to do is each time at QMU level we detect there is a guest from region that is added. We need to inform the virtual machine monitor so that it programs the stage two. So the guest physical address to us physical address mapping. So previously stage two was not used at all. So it was stage one. And it goes through the VFIO PCI IO CTLs, so DMA map. So as I explained previously, each time the guest does some changes to the configuration structure we need to pass this update, this information to the host kernel so that it can update the main configuration structure and associate the stage one configuration structure program by the guest operating system. So we introduced a new IO CTL at VFIO PCI level to do that. Okay, we have to propagate also cache invalidation commands from the guest to the host operating system. We have a special handling for MSI. I'm going to comment that in the next slide. And since now all the translation is performed at hardware level. So stage one and stage two translation. Whenever we detect there is a stage one translation fault at hardware level we need to propagate this fault up to the guest. So it requires some special mechanics. So both in the IUMMU subsystem and VFIO PCI level to export this information. So you can see that at kernel level there is impact at VFIO level at IUMMU subsystem level and there are some state machine changes requested also in the SMMU driver. At QMU level there are quite a lot of modifications as well because we modify the existing framework. We need to add some new notifiers each time the QMU system, system MMU device detects some of those changes. You need to propagate the information to the VFIO PCI device so that it can use the new AUCTLs. Okay, let's talk about MSI on ARM because it's a bit of a nightmare. So the problem is on most of the platforms the MSIs are translated by the system MMU. So it's not like on x86 where MSIs use some special address belonging to a special window, the AUIPG window. So it's not like that. So they are translated through the system MMU. And the trouble is that historically VFIO only mapped the guest physical address onto host physical address for RAM but he didn't especially handle MSI doorbells. So what we added in the past to support MSIs along with PCI pass through is that the host kernel is responsible for allocating IOVAs so that there is a mapping that exists to reach the host doorbell. Okay, and then it follows the MSI hierarchy routing path. It injects the virtual MSI into the guest. So it's essential that the device is programmed by the host IOVA to reach the physical doorbell actually. Now the problem is that you add another stage and there is no mapping at stage one that exists and that allows to reach the host the physical doorbell. On guest side actually the guest is also exposed with virtual IUMMU so it has exactly the same trouble. It needs one guest IOVA to translate into the guest doorbell. But the problem is that both mappings do not match and so if you do not do anything special so each time the assigned device will perform an MSI it will fault at stage one because there is no mapping. So what we need to do practically is that each time there is a mapping that is created by the guest operating system to map its guest doorbell so the virtual doorbell using its guest IOVA. So we trap this event and we pass it to the host kernel so that it can reuse the guest IOVA and create a nesting mapping that reaches the physical doorbell. So it's a bit tricky but so eventually it works and now the assigned device uses this guest IOVA to go through the two stages. So the question is do we actually we still do the shadowing but so I would prefer we keep this until the end because it will take care. Okay so I'm done with the MSI handling stuff and this works. So what is the current status? So it has been tested on two new generation platforms for ARM servers so Qualcomm and Cavium platforms. It's still at the state of RFC at both kernel and QMU levels. The problem is that so I explained we had changes at VFIO and IOMMU level on kernel side. And the APIs we are defining are supposed to be reused for ARM, for VTD, for shared virtual memory use case also on Intel and ARM as well and VIRTAU IOMMU so we need to define APIs that are generic enough to be reused for all those use cases and it takes time and we have not reached stability yet. With respect to performance so nobody is very clear on the performance we will be able to achieve with this nested stage integration. The problem is that at stage one level all the addresses that are used are guest physical address. Would it be the addresses of the configuration structure, the page tables and obviously the output of the stage one. So all that stuff is going to induce some page table work at stage two and this will induce more traffic and more TLB entry being used. And I would like to complete this presentation by two pointers to presentation made last year at KVM forum. The first one made by Peter was about exactly the same use case but on Intel so using the so called caching mode so you can dig into more details with respect to this use case. Also presentation about shared virtual address in KVM so it's a connex use case so more Intel related for this presentation and you have the pointers to the kernel and QMU series if you want to test the feature. So thank you for your attention. Okay so maybe we can come back to Paul's question. Okay so I'm not sure I fully caught your question but so maybe I can come back to this drawing. Okay so when the IRQ routing setup is made so the KVM IRQ routing is set up actually we trap this information about this banding. Okay we pass this to the host and we are reusing this guest IOVA instead of the host IOVA that was formally allocated by the host system. I'm not sure about your question so I will need to understand the question first. Yeah yeah I prefer because it's quite... Okay any other questions? Okay so thank you.